Spring是如何管理Bean

    xiaoxiao2021-03-25  154

    常常听老师说容器,容器是什么?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   public class PersonServiceBean implements PersonService   {       public void save(){           System.out.println("我是save()方法");       }   }   [html]  view plain  copy   <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"></bean>  

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

    [java]  view plain  copy   public class BeanDefinition {              private String id;         private String className;              public BeanDefinition(String id, String className) {           this.id = id;           this.className = className;       }          public String getId() {           return id;       }          public void setId(String id) {           this.id = id;       }          public String getClassName() {           return className;       }          public void setClassName(String className) {           this.className = className;       }   }  

       3.建立容器类tgbApplicationContext。

        

    [java]  view plain  copy   /**   * 测试spring容器   * @author hegang   *   */   public class tgbClassPathXMLApplicationContext {              private List<BeanDefinition> beanDefines =new ArrayList<BeanDefinition>();       private Map<String,Object> sigletons =new HashMap<String,Object>();                     public tgbClassPathXMLApplicationContext(String filename){           this.readXML(filename);           this.instanceBeans();       }          /**       * 完成bean的实例化       */       private void instanceBeans() {           for(BeanDefinition beanDefinition :  beanDefines){               try {                   if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim())){                     sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());                   }               } catch (Exception e) {                   // TODO Auto-generated catch block                   e.printStackTrace();               }                          }                  }          /**       * 读取xml配置文件       * @param filename       */       private void readXML(String filename) {           SAXReader saxReader = new SAXReader(); //创建读取器           Document document =null;           try{               URL xmlpath = this.getClass().getClassLoader().getResource(filename);               document =saxReader.read(xmlpath);               Map<String,String> nsMap =new HashMap<String,String>();               nsMap.put("ns","http://www.springframework.org/schema/beans"); //加入命名空间               XPath xsub = document.createXPath("//ns:beans/ns:bean"); //创建beans/bean查询路径                xsub.setNamespaceURIs(nsMap); // 设置命名空间               List<Element> beans = xsub.selectNodes(document); // 获取文档下所有的bean节点               for(Element element:beans){                   String id =element.attributeValue("id"); // 获取id属性值                   String clazz =element.attributeValue("class"); // 获取class属性值                   BeanDefinition beanDefine =new BeanDefinition(id,clazz);                   beanDefines.add(beanDefine);               }                      } catch(Exception e){               e.printStackTrace();           }  <li style="border-style: none none none solid;%2
    转载请注明原文地址: https://ju.6miu.com/read-847.html

    最新回复(0)