在对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效果一样:
这样几种初始化的过程就分析完了