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

所有文章已迁移至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的介入等,暂且抓住主线):

  • createBeanInstance:实例化,就是调用对应的构造方法构造对象
  • populateBean:填充属性,这步对spring xml中指定的property进行populate填充
  • initializeBean:初始化,调用spring xml中指定的init方法,或者AfterPropertiesSet方法

最终生成用户所需要的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后置处理
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容