Spring bean到底是如何创建的?(下)(一)
本文是接着上篇文章 Spring bean到底是如何创建的?(上) 来继续讲述spring bean的其它的生命周期。
前文回顾:
上篇文章最开始我简单介绍了spring ioc和aop的概念,随后讲述了spring bean创建源码分析的一部分,包括bean元信息、不同作用域bean的创建方式、bean的后置处理器BeanPostProcessor组件体系、三级缓存解决循环依赖的问题、bean 的实例化阶段的源码。接下来这篇会继续从源码的角度来分析bean生命周期的其它阶段,包括 bean属性赋值阶段、Aware接口回调阶段、bean初始化阶段、bean的销毁阶段的内容。
五、 Spring Bean属性赋值阶段
1)赋值前阶段
2)赋值阶段
六、 Aware接口回调阶段
七、 Spring Bean初始化阶段
1)初始化之前阶段
2)初始化阶段
3)初始化之后阶段
八、Spring Bean销毁阶段
1)DisposableBean的注册
2)销毁前阶段
3)销毁阶段
九、全文总结
十、思考题
五、 Spring Bean属性赋值阶段
1)属性赋值前阶段
这个阶段需要对bean的一些属性进行赋值。比如说@Autowired 、@Resource等注解都是在这个阶段生效的。
PropertyValues:这个api是封装属性的。不知道大家记不记得,当用xml配置bean的时候是可以通过标签给属性赋值的,其实当spring对配置信息解析之后会封装在PropertyValues中。
看看,这里其实有又是对BeanPostProcessor组件接口的回调。@Autowired 、@Resource 注解就是在这时生效的。
我给大家列举一下在这个阶段一些重要的实现类,大家有时间可以翻一下源码,自己阅读一下这些实现类的 postProcessProperties 方法,看看注解是怎么生效的。
AutowiredAnnotationBeanPostProcessor:处理@Autowired、@Value注解
CommonAnnotationBeanPostProcessor:这个类的功能比较多,主要是实现了 @PostConstruct 、@PreDestory 、 @Resource 注解的功能,当然是在不同的阶段生效的,只不过spring 都给他写在同一个类中了
除了spring的实现,你还可以自己实现postProcessProperties ,因为你看这个方法的返回值是 PropertyValues ,属性的封装,所以可以在方法实现的时候往 PropertyValues 添加一些数据,这样就给属性赋值的时候就按照你设置的属性来赋值了。
2)属性赋值阶段
继续往下走
这里会给属性赋值,所谓的赋值其实很简单,就是从 PropertyValues 拿出配置的属性以及对应的属性的值,然后设置到属性中其实就行了。只不过这里可能涉及到一些类型的转换和占位符的解析,还有一些其它的特性,这里就不详细展开讲了。
文章转自公众号:三友的java日记