Spring IOC源码解读

spring源码日记08: 第二阶段前言

2020-02-19  本文已影响0人  BugPool

所有文章已迁移至csdn,csdn个人主页https://blog.csdn.net/chaitoudaren

前言

MyBean myTestBean = (MyBean) bf.getBean("myBean");

经历了第一阶段,Xml相关配置文件已经转换成了XmlBeanFactory的内部表示。通过getBean("myBean"),Spring将在Map中查询出key="myBean"的BeanDefinition。再通过获取BeanDefinition的class,构造函数等信息,对Bean进行以下3个步骤(当然spring还有许多PostProcessors,AOP的介入等,暂且抓住主线):

最终生成用户所需要的Bean对象返回给用户,同时spring会根据scope的范围进行缓存,保存到不同的缓存中,以供下次调用,提高框架效率。下图是spring创建bean的顺序图,也可以说是spring bean的生命周期,具体怎么验证请参考:spring BeanPostProcessor 生命周期

spring创建Bean .jpg

重点(必读)

下面要讲的几点在开始第二阶段学习之前请务必记牢,说起来很简单,但是很多教程甚至是书本都出现的混淆。以下几点对理清第二阶段的脉络至关重要。

  1. Instance:实例化,也就是调用构造函数的过程,至此将通过调用class的构造方法生成一个对象,但是尚未进行属性填充以及初始化。这里切记切记不要跟初始化混淆,这里很多文章会写成初始化,实例化就是实例化,不是初始化!切记切记!
  2. populateBean:填充属性,这步对spring xml中指定的property进行populate填充,当然@Autowired属性也是在这里注入的。(@Autowired如果标记在构造函数上,则是在上一步Instance阶段做的)
  3. initialize:初始化,这个才是初始化。它是通过调用Instance生产的对象中自定义的init-method方法进行初始化的。这个才是初始化,不要跟实例化混淆!
  4. postProcessors:后置处理器,这是spring安插在各个阶段前后的方法。例如在initalizeBean前后可以通过重写applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsAfterInitialization方法进行一些自定义操作。所以后置处理器是有before和after区别的,别被这么名字混淆,后置处理器有before前置处理也有after后置处理
上一篇下一篇

猜你喜欢

热点阅读