亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

spring源碼解讀-ioc

標簽:
Java

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

 

  beanfactory

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

 https://img1.sycdn.imooc.com//5b3b99390001584305360324.jpg

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

 

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

https://img1.sycdn.imooc.com//5b3b994300018cf508460612.jpg

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

原文出处

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消