Spring初始化实现的几种方式

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销毁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值