以代码流程方式探索Spring源码--Bean实例化4--initializeBean--实例化及依赖注入后的初始化方法
入口
在该方法中只要有三部分:
1、各种Aware的调用
2、各种初始化方法的调用
3、各种BeanPostProcessor的调用
对普通Aware的调用
在这个地方主要对三种Aware接口进行对应的set方法调用。
1、BeanNameAware
2、BeanClassLoaderAware
3、BeanFactoryAware
在自己写的类中集成这几种接口实现其中的set方法可以获取BeanName、BeanClassLoader和BeanFactory,执行的地方就是在这里。
Bean初始化前对BeanPostProcessor的一些调用
注释是对 postProcessBeforeInitialization() 方法的调用。
对于Aware接口的调用从下图总可以看出来:
1、EnvironmentAware
2、EmbeddedValueResolverAware
3、ResourceLoaderAware
4、ApplicationEventPublisherAware
5、MessageSourceAware
6、ApplicationContextAware
分别调用对应的set方法
此处还有对ImportAware的处理,后续会单独讨论:
还有对servlet相关Aware的处理:
还有对@Construct注解的方法的调用,这是三种bean初始化方式中执行最早的方法:
此处的LifecycleMetadata就是之前在注解收集阶段已经收集并存放缓存中了,此处直接取用。
正儿八经的初始化方法
这块就是另外两种初始化方式的对应方法的调用:
1、实现了InitializingBean接口并重写了afterPropertiesSet()方法
2、使用XML或者注解的方式直接定义了init-method() 方法
到此为止,三种初始化方式都已经现身了,从源码中也可以看出它们执行的顺序:
@PosrConstruct方法 > 实现InitializingBean接口方式 > 配置了init-method 方式
初始化后的BeanPostProcessor的一些调用
这块调用的对应方法就是postProcessAfterInitialization()
最重要的一个是动态代理的生成,这个之后会细细讨论
还有常用的@Scheduled注解的解析
有以下几种情况:
1、配置了cron表达式
2、配置了fixedDelay或者fixedDelayString
3、配置了fixedRate或者fixedRateString