zoukankan      html  css  js  c++  java
  • spring源码解读-ioc

      本系列博客结合我的理解,对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初始化的整个过程:

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

  • 相关阅读:
    #研发解决方案#研发协作平台CloudEngine
    人生做出的选择越多,友谊的小船翻得越快?
    告诉别人你是谁:边界的那些事儿
    如何从零开始搭建一个技术平台?
    Windows10 自动配置切换IP地址
    Human disease database
    R语言install.packages("jpeg")报错
    RStudio中,出现中文乱码问题的解决方案(修改文件编码)
    How do I run Adobe Flash on Chrome?
    RGB颜色查询对照表
  • 原文地址:https://www.cnblogs.com/sbrn/p/9254287.html
Copyright © 2011-2022 走看看