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的逻辑

注意这里的checkedInitMethods为什么会有值?我们接着打断点,
发现这里是个set,那我们去寻找set.add的代码

找到了,原来在这里:
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.LifecycleMetadata#checkConfigMembers

重启一下,看断点怎么进去的?我们发现doCreateBean有个applyMergedBeanDefinitionPostProcessors的操作,org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition


上图会找出所有的所有的加了@PostConstruct的方法
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#buildLifecycleMetadata

上图主要判断bean里面的方法是否加了@PostConstruct,找到的话就把该方法放入集合中
我们继续来看看这个initAnnotationType到底是什么注解,用之前的方法,继续断点

org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#CommonAnnotationBeanPostProcessor

可以看到初始方法是@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销毁
文章详细阐述了Spring框架中Bean初始化的三种方式,包括使用@PostConstruct注解、实现InitializingBean接口以及在@Bean注解中指定initMethod。文中通过源码分析,揭示了@PostConstruct的处理逻辑,首先通过InitDestroyAnnotationBeanPostProcessor查找并收集所有带有@PostConstruct注解的方法,然后在初始化前执行这些方法。总结了初始化顺序:@PostConstruct->InitializingBean->@BeaninitMethod。

2917

被折叠的 条评论
为什么被折叠?



