• 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初始化的整个过程:

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

  • 相关阅读:
    在响应式项目中连接设计与开发
    社交APP的痛点及九大流派解析,微信陌陌,咱还约吗
    网传奶茶妹将进入红杉资本
    OLE、OCX和ActiveX控件之间的比较
    Unity3D网络游戏实战(第2版)
    离婚?在Facebook上把已婚状态改为单身就可以!
    同样酷炫但却失败了的谷歌眼镜,能否给Apple Watch一些前车之鉴?
    Apple Watch首批评测放出:有吐槽、有体贴……毒哭了,暖哭了
    如何培养战略领导力,赢得“长久游戏”?
    博客社交已死,数据社交“永生”
  • 原文地址:https://www.cnblogs.com/sbrn/p/9254287.html
Copyright © 2020-2023  润新知