模拟spring的注入和读取配置文件(ApplicationContext.xml)

转载自:http://blog.csdn.net/xiangsuixinsheng/article/details/6539324

场景:用户添加到数据库中

传统方式保存实例3个问题:

1/改动数据保存方式,如保存到XML文件中会造成程序变更

2/UserService无法在单实例情况下被重用,因为它的声明在test.java

3/UserService引用其它资源不便

 

[java]  view plain copy
  1. package com.bjsxt.dao;  
  2. import com.bjsxt.model.User;  
  3.   
  4. public interface UserDAO {  
  5.     public void save(User user);  
  6. }  


 

[java]  view plain copy
  1. package com.bjsxt.dao.impl;  
  2. import com.bjsxt.dao.UserDAO;  
  3. import com.bjsxt.model.User;  
  4.   
  5. public class UserDAOImpl implements UserDAO {  
  6.   
  7.     public void save(User user) {  
  8.         //Hibernate  
  9.         //JDBC  
  10.         //XML  
  11.         //NetWork  
  12.         System.out.println("数据保存进数据库:user " + user.getUsername()+" saved!");  
  13.     }  
  14. }  


 

Bean.xml配置文件

[html]  view plain copy
  1. <beans>  
  2.     <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" />  
  3.     <bean id="userService" class="com.bjsxt.service.UserService" >  
  4.         <property name="userDAO" bean="u"/>  
  5.     </bean>  
  6. </beans>  



 

BeanFactory接口

[java]  view plain copy
  1. package com.bjsxt.spring;  
  2. //BeanFactory接口取得相对应的Bean对象引用  
  3. public interface BeanFactory {  
  4.     public Object getBean(String id);  
  5. }  


 

模拟ClassPathXmlApplicationContext()取得

[java]  view plain copy
  1. package com.bjsxt.spring;  
  2. import java.lang.reflect.Method;  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.jdom.Document;  
  8. import org.jdom.Element;  
  9. import org.jdom.input.SAXBuilder;  
  10. // jdom读取xml文件  
  11. public class ClassPathXmlApplicationContext implements BeanFactory {  
  12.       
  13.     private Map<String , Object> beans = new HashMap<String, Object>();  
  14.       
  15.     //IOC Inverse of Control DI Dependency Injection  
  16.     public ClassPathXmlApplicationContext() throws Exception {  
  17.         SAXBuilder sb=new SAXBuilder();  
  18.           
  19.         Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象  
  20.         Element root=doc.getRootElement(); //获取根元素  
  21.         List list=root.getChildren("bean");//取名字为bean的所有元素  
  22.         for(int i=0;i<list.size();i++){  
  23.            Element element=(Element)list.get(i);  
  24.            String id=element.getAttributeValue("id");  
  25.            String clazz=element.getAttributeValue("class");  
  26.            Object o = Class.forName(clazz).newInstance();  
  27.            System.out.println("BeanId = " + id);  
  28.           System.out.println("ClassName = " + className);          beans.put(id, o);  
  29.              
  30.            for(Element propertyElement : (List<Element>)element.getChildren("property")) {  
  31.                String name = propertyElement.getAttributeValue("name"); //userDAO  
  32.                String bean = propertyElement.getAttributeValue("bean"); //u  
  33.                Object beanObject = beans.get(bean);//UserDAOImpl instance  
  34.                  
  35.                String methodName = "set" + name.substring(01).toUpperCase() + name.substring(1);  
  36.                System.out.println("method name = " + methodName);  
  37.                  
  38.                Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);  
  39.                m.invoke(o, beanObject);  
  40.            }  
  41.         }    
  42.     }  
  43.   
  44.     public Object getBean(String id) {  
  45.         return beans.get(id);  
  46.     }  
  47. }  


 

[java]  view plain copy
  1. package com.bjsxt.service;  
  2. import org.junit.Test;  
  3.   
  4. import com.bjsxt.dao.UserDAO;  
  5. import com.bjsxt.model.User;  
  6. import com.bjsxt.spring.BeanFactory;  
  7. import com.bjsxt.spring.ClassPathXmlApplicationContext;  
  8.   
  9. public class UserServiceTest {  
  10.   
  11.     @Test  
  12.     public void testAdd() throws Exception {  
  13. //Spring IoC容器的实例化非常简单  
  14.         BeanFactory applicationContext = new ClassPathXmlApplicationContext();  
  15.           
  16.         UserService service = (UserService)applicationContext.getBean("userService");  
  17.           
  18.         User u = new User();  
  19.         u.setUsername("zhangsan");  
  20.         u.setPassword("zhangsan");  
  21.         service.add(u);  
  22.     }  
  23. }  


 

jdom读取结果和输出保存结果

BeanId = u

ClassName = com.bjsxt.dao.impl.UserDAOImpl

BeanId = userService

ClassName = com.bjsxt.service.UserService

method name = setUserDAO

 

数据保存进数据库:user zhangsan saved!

 

 

思考:

BeanFactory与ApplicationContext两接口的比较(用哪个?)

1、功能:

更强大:子接口ApplicationContext提供了更多的附加功能,如:Web整合,支持国际化、事件发布通知等功能。

2、在类创建时间上的不同:

BeanFactory取得Bean是延迟取得,即第一次使用getBean()方法时才创建指定类的对象;

ApplicationContext取得Bean的实例是在自身被窗口初始化的时候就创建全部的类对象了。

 

//Spring IoC容器的实例化非常简单

       BeanFactory applicationContext =newClassPathXmlApplicationContext();

等价

ApplicationContext ctx = newClassPathXmlApplicationContext();


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值