Spring是如何管理Bean

来源:互联网 发布:大富豪3.29全套源码 编辑:程序博客网 时间:2024/05/19 14:51

常常听老师说容器,容器是什么?spring中是如何体现的?一直有疑惑,这两天看了一下Spring管理bean的Demo,对于Spring中的容器有了简单的认识。

   我们知道,容器是一个空间的概念,一般理解为可盛放物体的地方。在Spring容器通常理解为BeanFactory或者ApplicationContext。我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象。

   BeanFactory与ApplicationContext的区别是什么?

   BeanFactory采用了工厂设计模式,负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。而ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:国际化支持、aop、事务等。同时BeanFactory在解析配置文件时并不会初始化对象,只有在使用对象getBean()才会对该对象进行初始化,而ApplicationContext在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程。

   因此我们一般在使用的时候尽量使用ApplicationContext

   ApplicationContext是如何管理Bean呢?下面这个Demo简单模仿了这个原理:

   1.建立一个类PersonServiceBean,并在xml文件中进行配置。

    

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class PersonServiceBean implements PersonService   {  
  2.     public void save(){  
  3.         System.out.println("我是save()方法");  
  4.     }  
  5. }  
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>  

  2.建立类BeanDefinition,提供一个构造函数,将其作为每个bean的公共转型类。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class BeanDefinition {  
  2.       
  3.     private String id;    
  4.     private String className;  
  5.       
  6.     public BeanDefinition(String id, String className) {  
  7.         this.id = id;  
  8.         this.className = className;  
  9.     }  
  10.   
  11.     public String getId() {  
  12.         return id;  
  13.     }  
  14.   
  15.     public void setId(String id) {  
  16.         this.id = id;  
  17.     }  
  18.   
  19.     public String getClassName() {  
  20.         return className;  
  21.     }  
  22.   
  23.     public void setClassName(String className) {  
  24.         this.className = className;  
  25.     }  
  26. }  

   3.建立容器类tgbApplicationContext。

    

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 测试spring容器 
  3.  * @author hegang 
  4.  * 
  5.  */  
  6. public class tgbClassPathXMLApplicationContext {  
  7.       
  8.     private List<BeanDefinition> beanDefines =new ArrayList<BeanDefinition>();  
  9.     private Map<String,Object> sigletons =new HashMap<String,Object>();  
  10.       
  11.       
  12.     public tgbClassPathXMLApplicationContext(String filename){  
  13.         this.readXML(filename);  
  14.         this.instanceBeans();  
  15.     }  
  16.   
  17.     /** 
  18.      * 完成bean的实例化 
  19.      */  
  20.     private void instanceBeans() {  
  21.         for(BeanDefinition beanDefinition :  beanDefines){  
  22.             try {  
  23.                 if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim())){  
  24.                   sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());  
  25.                 }  
  26.             } catch (Exception e) {  
  27.                 // TODO Auto-generated catch block  
  28.                 e.printStackTrace();  
  29.             }  
  30.               
  31.         }  
  32.           
  33.     }  
  34.   
  35.     /** 
  36.      * 读取xml配置文件 
  37.      * @param filename 
  38.      */  
  39.     private void readXML(String filename) {  
  40.         SAXReader saxReader = new SAXReader(); //创建读取器  
  41.         Document document =null;  
  42.         try{  
  43.             URL xmlpath = this.getClass().getClassLoader().getResource(filename);  
  44.             document =saxReader.read(xmlpath);  
  45.             Map<String,String> nsMap =new HashMap<String,String>();  
  46.             nsMap.put("ns","http://www.springframework.org/schema/beans"); //加入命名空间  
  47.             XPath xsub = document.createXPath("//ns:beans/ns:bean"); //创建beans/bean查询路径  
  48.              xsub.setNamespaceURIs(nsMap); // 设置命名空间  
  49.             List<Element> beans = xsub.selectNodes(document); // 获取文档下所有的bean节点  
  50.             for(Element element:beans){  
  51.                 String id =element.attributeValue("id"); // 获取id属性值  
  52.                 String clazz =element.attributeValue("class"); // 获取class属性值  
  53.                 BeanDefinition beanDefine =new BeanDefinition(id,clazz);  
  54.                 beanDefines.add(beanDefine);  
  55.             }  
  56.           
  57.         } catch(Exception e){  
  58.             e.printStackTrace();  
  59.         }  <li style="border-style: none none none solid;%2
0 0
原创粉丝点击