目录
spring源码目录
git注释项目地址:https://github.com/chaitou/spring-framework-master.git
前言
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 生命周期
重点(必读)
下面要讲的几点在开始第二阶段学习之前请务必记牢,说起来很简单,但是很多教程甚至是书本都出现的混淆。以下几点对理清第二阶段的脉络至关重要。
Instance
:实例化,也就是调用构造函数的过程,至此将通过调用class的构造方法生成一个对象,但是尚未进行属性填充以及初始化。这里切记切记不要跟初始化混淆,这里很多文章会写成初始化,实例化就是实例化,不是初始化!切记切记!populateBean
:填充属性,这步对spring xml中指定的property
进行populate
填充,当然@Autowired
属性也是在这里注入的。(@Autowired
如果标记在构造函数上,则是在上一步Instance阶段做的)initialize
:初始化,这个才是初始化。它是通过调用Instance
生产的对象中自定义的init-method
方法进行初始化的。这个才是初始化,不要跟实例化混淆!postProcessors
:后置处理器,这是spring安插在各个阶段前后的方法。例如在initalizeBean前后可以通过重写applyBeanPostProcessorsBeforeInitialization
、applyBeanPostProcessorsAfterInitialization
方法进行一些自定义操作。所以后置处理器是有before和after区别的,别被这么名字混淆,后置处理器有before前置处理也有after后置处理