spring源码分析—— 初始化的三种方式的分析

  在对bean对象设置完属性polulateBean之后,可以对bean进行初始化,初始化的方式有很多,

可以在xml中配置init-method属性,可以实现InitializingBean接口,重写AfterPropertiesSet方法,也可以通过

注解@PostConstruct实现初始化

1:准备工作

 运行结果:

2:下面看一下源码中怎么实现的

调用initializeBean方法对bean进行初始化

先来看一下PostConstruct注解的初始化,因为它是依赖于CommonAnnotationBeanPostProcessor实现的,所以在扫描注解Component组件,实现注册后,

需要注册这个类的BeanDefinition对象到BeanDefinitionMaps中,在refresh方法中registerBeanPostProcessor实现实例化并注册到BeanPostProcessors缓存中

搜集注解元数据信息,在如下方法中实现,封装到CommonAnnotationBeanPostProcessor中的injectMetamentMap中,前边分析注解的时候都涉及到,这里忽略

看一下拦截,调用PostContruct方法如何实现?

调用到CommonAnnotationBeanPostProcessor对象的前置接口postProcessBeforeInitialization()

 

 

 这样就调到了PostConstruct注解的方法上了。

再来看看实现InitializingBean接口,重写AfterPropertiesSet方法怎么实现的呢?

这个很简单

 

再来看一下init-method属性的实现方式?

反射获取到方法并调用:

反射调用:

如果配置成@Bean上的init-method属性,初始化时机会怎样?

运行结果:可以看出@Bean上配置init-method属性与xml上bean元素配置init-method效果一样:

这样几种初始化的过程就分析完了

原文地址:https://www.cnblogs.com/warrior4236/p/13224454.html