• spring模拟ioc


    • 非spring 开发
    public class UserService {
    
        private UserDao userDao=new UserDaoImpl();
        
        public void addUser(User user){
            userDao.addUser(user);
        }
    }
    public interface UserDao {
        
         public void addUser(User user);
    }
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void addUser(User user) {
            // TODO Auto-generated method stub
            //保存数据   这边省略连接数据库操作代码
            System.out.println("id:"+user.getId()+",name"+user.getName());    
            System.out.println("user save !!!");
        }
    }

    测试代码

    public class Test1 {
    
        private UserService userService=new UserService();
        private User user;
        
        @Before
        public void init(){
            user=new User();
            user.setId(1);
            user.setName("zhangsan");
            userService=new UserService();
        }
        
        @Test
        public void test(){
            userService.addUser(user);
        }
    }

    结果:

    id---1,name---zhangsan
    user save !!!
    • 模拟spring开发模式,将所有对象都放到容器中,用到的对象从容器中取
    • 所有的对象通过xml文件的形式进行配置,使用jdom读取xml文件内容

    导包  读取beans.xml文件

    <beans>
       <!-- 配置文件形式  配置  userdao -->
       <bean id="userDao" class="com.qzzx.dao.impl.UserDaoImpl"></bean>
       <!-- 配置文件形式   配置userservice -->
       <bean id="userService" class="com.qzzx.service.UserServiceXml">
          <property name="userDao" bean="userDao"></property>   
       </bean>
    </beans>
    beans 配置文件
    public class ClassPathXmlApplicationContext implements BeanFactory{
    
        //定义一个容器存放bean对象
        Map<String, Object> map=new HashMap<>();
        /**
         * 初始化容器
         */
        public ClassPathXmlApplicationContext() {
            //使用jdom解析  beans.xml文件
            SAXBuilder sb=new SAXBuilder();
            try {
                //获取文档对象
                Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
                //获取根节点
                Element root = doc.getRootElement();
                //获取所有bean节点
                List childrenBean = root.getChildren("bean");
                for (int i = 0; i < childrenBean.size(); i++) {
                    //遍历获取单个bean标签,并取得其中id和class属性的值
                    Element bean = (Element) childrenBean.get(i);
                    String id=bean.getAttributeValue("id");
                    String clazz=bean.getAttributeValue("class");
                    //打印查看
                //    System.out.println("id:"+id+",class:"+clazz);
                    //利用反射原理获得对象,并且实例化
                    Object obj = Class.forName(clazz).newInstance();
                    //将对象存到 容器中
                    map.put(id, obj);
                    
                    //模拟 依赖注入 遍历bean中的标签
                    List properties = bean.getChildren("property");
                    for (int j = 0; j < properties.size(); j++) {
                        Element p = (Element) properties.get(j);
                        String name = p.getAttributeValue("name");
                        String beanName = p.getAttributeValue("bean");
                        //获得注入对象
                        Object setObject = map.get(beanName);
                        
                        //采用 set方法将对象注入   clazz名》》set方法名》》method》》执行 method,注入
                        String methodName="set"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
                      //  System.out.println("methodName:"+methodName);
                        // System.out.println("接口名字:"+setObject.getClass().getInterfaces()[0]);
                        Method method = obj.getClass().getMethod(methodName, setObject.getClass().getInterfaces()[0]);
                        method.invoke(obj, setObject);
                        String GetMethodName="get"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
                        
    //                    Method method2= obj.getClass().getMethod(GetMethodName);
    //                    Object invoke = method2.invoke(obj);
    //                    System.out.println(invoke==setObject);
                    }
                }
                
                System.out.println("对象容器:"+map);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public Object getBean(String name) {
            // TODO Auto-generated method stub
            return map.get(name);
        }
    
    }
    bean 容器
    public interface BeanFactory {
    
        public Object getBean(String name);
        
        
    }
    beanFactory
    public class UserServiceXml {
    
        private UserDao userDao;
        
        public void addUser(User user){
            userDao.addUser(user);
        }
        public UserDao getUserDao() {
            return userDao;
        }
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
        
        
        
    }
    userServiceXml
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void addUser(User user) {
            // TODO Auto-generated method stub
            //保存数据   这边省略连接数据库操作代码
            System.out.println("id---"+user.getId()+",name---"+user.getName());    
            System.out.println("user save !!!");
        }
    }
    userdao
    public class Test2 {
    
        @Test
        public void test2(){
            ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext();
            UserServiceXml userServiceXml = (UserServiceXml) ac.getBean("userService");
            User user=new User();
            user.setId(2);
            user.setName("李四");
             userServiceXml.addUser(user);
        }
        
        
    }
    testSpring
    对象容器:{userService=com.qzzx.service.UserServiceXml@11c836e8, userDao=com.qzzx.dao.impl.UserDaoImpl@6f8cc276}
    id---2,name---李四
    user save !!!
  • 相关阅读:
    set--常见成员函数及基本用法
    [Swust OJ 1026]--Egg pain's hzf
    [HDU 1111]--Secret Code
    [Swust OJ 1139]--Coin-row problem
    [Swust OJ 781]--牛喝水
    [Swust OJ 1132]-Coin-collecting by robot
    [Swust OJ 249]--凸包面积
    HTTP 请求头中的 X-Forwarded-For
    HTTP 下载文件中文文件名在 Firefox 下乱码问题
    数据挖掘系列 (1) 关联规则挖掘基本概念与 Aprior 算法
  • 原文地址:https://www.cnblogs.com/Danial7777777/p/9134051.html
Copyright © 2020-2023  润新知