Danial7777777

导航

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 !!!

 

posted on 2018-06-04 16:33  Danial7777777  阅读(92)  评论(0编辑  收藏  举报