实例化Bean
- 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入一个尚未初始化的依赖时,容器会调用createBean方法进行实例化。
- 对于ApplicationContext容器,当容器启动结束后,通过回去BeanDefinition对象中的信息,实例化所有bean。
- InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法在实例化之前调用该方法的返回值会替换原本的Bean作为代理,这也是Aop等功能实现的关键点
- postProcessAfterInstantiation在实例化之后,属性赋值前调用,会影响属性赋值是否进行
设置对象属性
实例化后的对象被封装在BeanWrapper对象中,Spring根据BeanDefinition中的信息以及通过BeanWrapper提供的设置属性接口完成依赖注入
处理Aware接口
Spring检测对象是否实现以下Aware接口,将相关实例注入bean:
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
EnvironmentAware
EmbeddedValueResolverAware 实现该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用,非常方便。
ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware) ,ApplicationContext是一个复合接口。
BeanPostProcessor-postProcessBeforeInitialization
如果需要对bean进行一些自定义处理,可以实现BeanPostProcessor接口,重写postProcessBeforeInitial方法
InitializingBean
初始化
BeanPostProcessor-postProcessAfterInitialization
bean初始化结束时调用,可以被应用于内存或缓存技术。
DisposableBean
当bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy方法
destroy-method
最后,如果这个bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。