1.
@Configuration
public class MainConfig9 {
@Bean(value = "myperson", initMethod = "init" , destroyMethod = "destory")
public Person getPerson(){
Person p = new Person();
p.setName("aa");
return p;
}
}
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
这里的代码逻辑有两种方式实现初始化:
1.isInitializingBean
2. mbd.getInitMethodName(); 在bean是写上初始化方法
3. @PostContructor
看第三种实现逻辑:
初始化前有段逻辑:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
会遍历所有的beanPostProcessors,其中有个InitDestroyAnnotationBeanPostProcessor增强器,
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata#invokeInitMethods
这里的代码会执行@PostConstruct的逻辑
![](https://img-blog.csdnimg.cn/img_convert/f815a4041fa59cbab746d4cf15da6f7c.png)
注意这里的checkedInitMethods为什么会有值?我们接着打断点,
发现这里是个set,那我们去寻找set.add的代码
![](https://img-blog.csdnimg.cn/img_convert/c3d3a0776f95835b24ba9bbb2ddb5791.png)
找到了,原来在这里:
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata#checkConfigMembers
![](https://img-blog.csdnimg.cn/img_convert/8ea8a99058516c8e8c8f6e8575f75170.png)
重启一下,看断点怎么进去的?我们发现doCreateBean有个applyMergedBeanDefinitionPostProcessors的操作,org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition
![](https://img-blog.csdnimg.cn/img_convert/1106bd585f2dd584d8fb40ddfe3dd698.png)
![](https://img-blog.csdnimg.cn/img_convert/d3b6c625bde7b5d7ddbc7b24225ab735.png)
上图会找出所有的所有的加了@PostConstruct的方法
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#buildLifecycleMetadata
![](https://img-blog.csdnimg.cn/img_convert/7733077e386190c0d8f47219f2b315ef.png)
上图主要判断bean里面的方法是否加了@PostConstruct,找到的话就把该方法放入集合中
我们继续来看看这个initAnnotationType到底是什么注解,用之前的方法,继续断点
![](https://img-blog.csdnimg.cn/img_convert/fecc34f5672259c69bc3c1318aaf9cc9.png)
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#CommonAnnotationBeanPostProcessor
![](https://img-blog.csdnimg.cn/img_convert/73837b9d71d7a4ce973827f15ce72fdb.png)
可以看到初始方法是@PostConstruct的注解
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata#checkConfigMembers
会把刚刚寻找的加了@PostConstruct的方法放入checkedInitMethods中,供后续使用
总结:初始化有3种方法,
最先执行的是@PostConstruct,然后是实现了InitializingBean的类,最后是@Bean里面init的方法。
@PostConstruct的逻辑是先寻找所有Bean的@PostConstruct的方法,然后初始化前执行所有的before方法,会调用InitDestroyAnnotationBeanPostProcessor该方法的before方法,然后反射,
寻找核心逻辑:InitDestroyAnnotationBeanPostProcessor.java
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
执行核心逻辑:org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization
销毁bean的方式一样,下篇说bean销毁