sbrn

  本系列博客结合我的理解,对spring的ioc进行简单分析,欢迎大家批评指正。

 

  beanfactory

  我们从beanfactory开始,beanfactory是最根部的容器,描述了整个ioc的一些规范和原则,也就是这个接口定义了ioc容器的最基本的条件,下面列出了整个接口中的方法

 

 对于这些方法都可以根据方法名了解它的作用,我们这里需要说一下的是它定义的成员变量“&”

 

  FactoryBean

  factorybean本身也是存活于beanfactory中的,本身也是一个工厂也是一个bean,用于创建factorybean所能创建出来的对象,在创建出对象的时候可在对象的方法前或后执行一些额外的方法如AOP,这里我们就要用到&,如果我们写getBean(“user”),我们拿到的是user的factorybean创建出来的user对象,如果我们写getBean(“&user”)我们拿到的是user的factorybean。

 

  defaultlistablebeanfacotry

  这个类非常重要,spring加载资源并装配对象的主要过程都发生在这个类中,当然调用了其他的类来完成功能,可以说主逻辑都是写在这个类中的

        ClassPathResource resource = new ClassPathResource("beans.xml");
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(resource);

  spring加载资源并装配对象的过程如下:

  1、定义好spring的配置文件

  2、通过Resource对象将spring配置文件抽象,抽象成一个Resource对象

  3、定义好bean工厂

  4、定义好XmlBeanDefinitionReader对象,并将工厂作为参数传递进去后供后续回调使用

  5、通过XmlBeanDefinitonReader对象读取之前抽象出的Resource对象(包含了XML文件的解析过程)

  6、Ioc容器创建完毕,用户可以通过容器获取所需要的对象信息

 

  这里我们重点要了解的是:

  1、XML文件的解析是由XmlBeanDefinitionReader对象交由BeanDefinitionParserDelegate委托来完成的,实质上这里用到了委托模式

  2、在DefaultBeanDefinitionDocumentReader类中的doRegisterBeanDefinitions方法中使用了经典的模板方法设计模式,子类可以重写preProcessXml与postProcessXml方法,以此来实现对XML文件的自定义扩展

 

  factory.getBean()

  用户获取对象信息的时候又会发生哪些过程呢?、

  1、spring的bean实际上是缓存在CurrentHashMap对象中的

  2、在创建Bean之前,首先应该将该bean的创建标志设定好,表示该bean已经或是即将被创建,为的是增强缓存的效率

  3、根据bean的scope属性来确定singletion还是prototype等范围,然后创建相应的对象

  4、通过java反射来创建bean的实例,在创建之前首先检查访问修饰符,如果该类的构造不是public的,则调用setAccessible(true)来突破java的语法限制,使的可以通过私有构造方法来创建对象实例

  5、接下来,寻找bean的属性值,完成属性的注入

  6、将所创建出的singleton对象添加到缓存中,供下次调用使用(scope为prototype则不缓存)

 

  下图是ioc初始化的整个过程:

  大家可参考上图断点调试,对整个过程进行跟踪。

 

相关文章: