类A托管给spring,类A里有一属性B,且有B的Set方法,且类A实现了InitializingBean,及init()方法,则类A的初始化顺序为:
先A的构造函数----->B的set方法------>afterPropertiesSet方法里执行的内容------>init()方法
spring的通用规则:
一,单一Bean加载时
- 优先加载BeanPostProcessor的实现Bean
- 实例化;
- 设置属性值
- 如果实现了BeanNameAware接口,调用setBeanName设置Bean的ID或者Name
- 如果实现BeanFactoryAware接口,调用setBeanFactory 设置BeanFactory
- 如果实现ApplicationContextAware,调用setApplicationContext设置ApplicationContext
- 调用BeanPostProcessor的预先初始化方法
- 调用InitializingBean的afterPropertiesSet()方法
- 调用定制init-method方法
- 调用BeanPostProcessor的后初始化方法
二,多个Bean的先后顺序
- 优先加载BeanPostProcessor的实现Bean
- 按Bean文件和Bean的定义顺序按bean的装载顺序(即使加载多个spring文件时存在id覆盖)
- “设置属性值”(第2步)时,遇到ref,则在“实例化”(第1步)之后先加载ref的id对应的bean
- AbstractFactoryBean的子类,在第6步之后,会调用createInstance方法,之后会调用getObjectType方法
- BeanFactoryUtils类也会改变Bean的加载顺序
这篇博客详细阐述了Spring中类的加载顺序,以一个具体的例子展示了类A的初始化过程:构造函数 -> B的set方法 -> afterPropertiesSet() -> init()方法。同时,博主介绍了Spring的通用规则,包括Bean的实例化、属性设置、接口回调等步骤,并提及了多个Bean加载时的顺序规则以及涉及到的BeanPostProcessor、BeanFactoryAware等接口的调用时机。
6586

被折叠的 条评论
为什么被折叠?



