BeanFactory
:延迟加载Bean
ApplicationContext
:实现了BeanFactory接口,并在初始化的时候就加载Bean
1. NEW (只是简单实例化,没有注入依赖)
BeanFactory
:当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。
ApplicationContext
:当容器启动结束后,就实例化所有的bean。
实例化对象被包装在BeanWrapper
对象中,BeanWrapper
提供了设置对象属性的接口,从而避免了使用反射机制设置属性。
2. 依赖注入
所有的类都实例化了,该把依赖注入进去了。
通过BeanWrapper
提供的设置属性的接口完成依赖注入。
3. 注入Aware接口
- 如果这个Bean实现
BeanNameAware
接口,会调用它实现的setBeanName(String beanId)
方法 - 如果这个Bean实现了
BeanFactoryAware
接口,会调用它实现的setBeanFactory()
,传递的是Spring工厂本身(可以用这个方法获取到其他Bean) - 如果这个Bean实现了
ApplicationContextAware
接口,会调用setApplicationContext(ApplicationContext)
方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法。但是要注意,如果是延迟加载的Bean,这里不会调用,因为不是从ApplicationContext加载的Bean
4. BeanPostProcessor.postProcessBefore
Initialization
如果这个Bean关联了BeanPostProcessor
接口,将会调用postProcessBeforeInitialization(Object obj, String s)
方法
5. InitializingBean.afterPropertiesSet
如果实现了InitializingBean
接口,则会调用afterPropertiesSet()
方法
5. init-method
如果这个Bean在Spring配置文件中配置了init-method
属性会自动调用其配置的初始化方法
6.BeanPostProcessor.postProcessAfter
Initialization
如果这个Bean关联了BeanPostProcessor
接口,将会调用postAfterInitialization(Object obj, String s)方法
到这里就可以使用Bean了,然后是销毁
7. DisposableBean
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean
接口,会调用其实现的destroy
方法
8. destroy-method
最后,如果这个Bean的Spring配置中配置了destroy-method
属性,会自动调用其配置的销毁方法