Bean生命周期
了解Bean的生命周期,就可以在Bean声明周期的不同阶段进行自定义的操作,满足更复杂的需求。简单的将Bean生命周期分为三个阶段:Bean创建、初始化、销毁
- 对象创建:单实例在容器启动的时候创建对象,多实例在每次获取的时候创建对象
- 初始化之前:BeanPostProcessor.postProcessBeforeInitialization()
- 初始化:对象创建完成,并赋值好,调用初始化方法
- 初始化之后:BeanPostProcessor.postProcessAfterInitialization()
- [容器创建完成]
- 销毁:单实例在容器关闭的时候销毁,多实例容器不会管理这个bean,容器不会调用销毁方法
现在可以通过下面方法在初始化和销毁时自定义初始化方法来干涉Bean创建过程。
- @Bean()注解参数
- InitializingBean、DisposableBean接口
- @PostConstruct、@PreDestroy注解
- BeanPostProcessor接口
1.@Bean生命周期
通过@Bean指定init-method和destroy-method的初始化方法
-
先自定义Bean初始化和销毁方法
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#bbb529">@Component</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">Car</span> { <span style="color:#cc7832">public</span> <span style="color:#ffc66d">Car</span>(){ System.out.println(<span style="color:#6a8759">"car constructor..."</span>); } <span style="color:grey">//现在只是普通方法</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">init</span>(){ System.out.println(<span style="color:#6a8759">"car ... init..."</span>); } <span style="color:grey">//现在只是普通方法</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">detory</span>(){ System.out.println(<span style="color:#6a8759">"car ... destory..."</span>); } }</span></span>
-
配置进容器
- 通过@Bean注解,在@Bean注册进容器时指定自定义方法
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#bbb529">@Configuration</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">MainConfigOfLifeCycle</span> { <span style="color:grey">//@Scope("prototype")多实例,不管销毁</span> <span style="color:grey">//指定用于初始化和销毁的方法</span> <span style="color:#bbb529">@Bean(initMethod="init",destroyMethod="destory")</span> <span style="color:#cc7832">public</span> Car <span style="color:#ffc66d">car</span>(){ <span style="color:#cc7832">return</span> <span style="color:#cc7832">new</span> Car(); } }</span></span>
-
测试
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">IOCTest_LifeCycle</span> { <span style="color:#bbb529">@Test</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">test01</span>(){ <span style="color:grey">//1、创建ioc容器</span> AnnotationConfigApplicationContext applicationContext = <span style="color:#cc7832">new</span> AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println(<span style="color:#6a8759">"容器创建完成..."</span>); <span style="color:grey">//applicationContext.getBean("car");</span> <span style="color:grey">//关闭容器</span> applicationContext.close(); } }</span></span>
输出
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//先创建对象</span> car constructor... <span style="color:grey">//再自定义初始化方法</span> car ... init... <span style="color:grey">//创建完成</span> 容器创建完成... <span style="color:grey">//关闭时自定义销毁方法</span> car ... destory...</span></span>
2.InitializingBean,DisposableBean生命周期
接口,需实现,通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑);
-
实现接口,自定义初始化Bean
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">Cat</span> <span style="color:#cc7832">implements</span> <span style="color:#ffc66d">InitializingBean</span>,<span style="color:#ffc66d">DisposableBean</span> { <span style="color:#cc7832">public</span> <span style="color:#ffc66d">Cat</span>(){ System.out.println(<span style="color:#6a8759">"cat constructor..."</span>); } <span style="color:grey">//定义销毁逻辑</span> <span style="color:#bbb529">@Override</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">destroy</span>() <span style="color:#cc7832">throws</span> Exception { <span style="color:grey">// TODO Auto-generated method stub</span> System.out.println(<span style="color:#6a8759">"cat...destroy..."</span>); } <span style="color:grey">//定义初始化逻辑</span> <span style="color:#bbb529">@Override</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">afterPropertiesSet</span>() <span style="color:#cc7832">throws</span> Exception { <span style="color:grey">// TODO Auto-generated method stub</span> System.out.println(<span style="color:#6a8759">"cat...afterPropertiesSet..."</span>); } }</span></span>
-
配置进容器
- 在@Configuration配置类中使用@Bean
- 或在Bean类上使用@Component然后再配置类上使用@ComponentScan
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//配置组件</span> <span style="color:#bbb529">@Component</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">Cat</span> <span style="color:#cc7832">implements</span> <span style="color:#ffc66d">InitializingBean</span>,<span style="color:#ffc66d">DisposableBean</span> { <span style="color:grey">//...</span> }</span></span>
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//扫描进容器</span> <span style="color:#bbb529">@ComponentScan("com.xxx.bean")</span> <span style="color:#bbb529">@Configuration</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">MainConfigOfLifeCycle</span> { <span style="color:grey">//...</span> }</span></span>
-
测试
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">IOCTest_LifeCycle</span> { <span style="color:#bbb529">@Test</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">test01</span>(){ <span style="color:grey">//1、创建ioc容器</span> AnnotationConfigApplicationContext applicationContext = <span style="color:#cc7832">new</span> AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println(<span style="color:#6a8759">"容器创建完成..."</span>); <span style="color:grey">//applicationContext.getBean("car");</span> <span style="color:grey">//关闭容器</span> applicationContext.close(); } }</span></span>
输出
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//注意顺序,每个Bean先构造并初始化,然后才进行下一个Bean,关闭时从内向外</span> (猫)cat constructor... (猫)cat...afterPropertiesSet... (车)car constructor... (车)car ... init... <span style="color:grey">//创建完成</span> 容器创建完成... <span style="color:grey">//关闭时销毁</span> (车)car ... destory... (猫)cat...destroy...</span></span>
3.@PostConstruct生命周期
可以使用JSR250;
-
@PostConstruct:在bean创建完成并且属性赋值完成之后,来执行初始化方法
-
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
-
标注注解,自定义初始化Bean
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">Dog</span> { <span style="color:#cc7832">public</span> <span style="color:#ffc66d">Dog</span>(){ System.out.println(<span style="color:#6a8759">"dog constructor..."</span>); } <span style="color:grey">//对象创建并赋值之后调用</span> <span style="color:#bbb529">@PostConstruct</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">init</span>(){ System.out.println(<span style="color:#6a8759">"Dog....@PostConstruct..."</span>); } <span style="color:grey">//容器移除对象之前</span> <span style="color:#bbb529">@PreDestroy</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">detory</span>(){ System.out.println(<span style="color:#6a8759">"Dog....@PreDestroy..."</span>); } }</span></span>
-
配置进容器
- 在@Configuration配置类中使用@Bean
- 或在Bean类上使用@Component然后再配置类上使用@ComponentScan
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#bbb529">@Component</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">Dog</span> { <span style="color:grey">//...</span> }</span></span>
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//扫描进容器</span> <span style="color:#bbb529">@ComponentScan("com.xxx.bean")</span> <span style="color:#bbb529">@Configuration</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">MainConfigOfLifeCycle</span> { <span style="color:grey">//...</span> }</span></span>
-
测试
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">IOCTest_LifeCycle</span> { <span style="color:#bbb529">@Test</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">test01</span>(){ <span style="color:grey">//1、创建ioc容器</span> AnnotationConfigApplicationContext applicationContext = <span style="color:#cc7832">new</span> AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println(<span style="color:#6a8759">"容器创建完成..."</span>); <span style="color:grey">//applicationContext.getBean("car");</span> <span style="color:grey">//关闭容器</span> applicationContext.close(); } }</span></span>
输出
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//注意顺序,每个Bean先构造并初始化,然后才进行下一个Bean,关闭时从内向外</span> (猫)cat constructor... (猫)cat...afterPropertiesSet... (狗)dog constructor... (狗)Dog....<span style="color:#bbb529">@PostConstruct</span>... (车)car constructor... (车)car ... init... <span style="color:grey">//创建完成</span> 容器创建完成... <span style="color:grey">//关闭时销毁</span> (车)car ... destory... (狗)Dog....<span style="color:#bbb529">@PreDestroy</span>... (猫)cat...destroy...</span></span>
4.BeanPostProcessor
postProcessBeforeInitialization:在创建Bean实例之后,在自定义初始化之前进行调用
postProcessAfterInitialization:在自定义初始化之后进行调用
BeanPostProcessor接口:bean的后置处理器,需实现,在bean初始化前后进行一些处理工作
-
postProcessBeforeInitialization:在(自定义初始化,如InitializingBean[afterPropertiesSet]、init-method等,就是上面那些自定义初始化方法)初始化之前工作(创建Bean实例之后,在自定义初始化之前)
-
postProcessAfterInitialization:在(自定义)初始化之后工作
-
实现后置处理器接口
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">MyBeanPostProcessor</span> <span style="color:#cc7832">implements</span> <span style="color:#ffc66d">BeanPostProcessor</span> { <span style="color:grey">//初始化前置方法</span> <span style="color:grey">//bean:新创建的实例,还未初始化</span> <span style="color:grey">//beanName:未初始化的Bean名字</span> <span style="color:#bbb529">@Override</span> <span style="color:#cc7832">public</span> Object <span style="color:#ffc66d">postProcessBeforeInitialization</span>(Object bean, String beanName) <span style="color:#cc7832">throws</span> BeansException { <span style="color:grey">// TODO Auto-generated method stub</span> System.out.println(<span style="color:#6a8759">"postProcessBeforeInitialization..."</span>+beanName+<span style="color:#6a8759">"=>"</span>+bean); <span style="color:#cc7832">return</span> bean; } <span style="color:grey">//初始化后置方法</span> <span style="color:#bbb529">@Override</span> <span style="color:#cc7832">public</span> Object <span style="color:#ffc66d">postProcessAfterInitialization</span>(Object bean, String beanName) <span style="color:#cc7832">throws</span> BeansException { <span style="color:grey">// TODO Auto-generated method stub</span> System.out.println(<span style="color:#6a8759">"postProcessAfterInitialization..."</span>+beanName+<span style="color:#6a8759">"=>"</span>+bean); <span style="color:#cc7832">return</span> bean; } }</span></span>
-
配置进容器
- 在@Configuration配置类中使用@Bean
- 或在Bean类上使用@Component然后再配置类上使用@ComponentScan
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#bbb529">@Component</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">MyBeanPostProcessor</span> <span style="color:#cc7832">implements</span> <span style="color:#ffc66d">BeanPostProcessor</span> { <span style="color:grey">//...</span> }</span></span>
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//扫描进容器</span> <span style="color:#bbb529">@ComponentScan("com.xxx.bean")</span> <span style="color:#bbb529">@Configuration</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">MainConfigOfLifeCycle</span> { <span style="color:grey">//...</span> }</span></span>
-
测试
- 这次没有新增的Bean,只配置了一个后置处理器,
- 这个后置处理器会对容器中的Bean起作用,包括上面三种自定义初始化Bean
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">IOCTest_LifeCycle</span> { <span style="color:#bbb529">@Test</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">test01</span>(){ <span style="color:grey">//1、创建ioc容器</span> AnnotationConfigApplicationContext applicationContext = <span style="color:#cc7832">new</span> AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println(<span style="color:#6a8759">"容器创建完成..."</span>); <span style="color:grey">//applicationContext.getBean("car");</span> <span style="color:grey">//关闭容器</span> applicationContext.close(); } }</span></span>
输出
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:grey">//对于每一个Bean都要执行一遍</span> <span style="color:grey">//1.创建</span> <span style="color:grey">//2.BeanPostProcessor.postProcessBeforeInitialization()</span> <span style="color:grey">//3.初始化:对象创建完成,并赋值好,调用初始化方法...</span> <span style="color:grey">//4.BeanPostProcessor.postProcessAfterInitialization()</span> <span style="color:grey">//5.销毁</span> <span style="color:grey">//以其中一个Bean为例:</span> <span style="color:grey">//构造对象</span> cat constructor... <span style="color:grey">//初始化之前</span> postProcessBeforeInitialization...cat=>com.xxx.bean.Cat@7d68ef40 <span style="color:grey">//使用InitializingBean自定义初始化逻辑</span> cat...afterPropertiesSet... <span style="color:grey">//初始化之后</span> postProcessAfterInitialization...cat=>com.xxx.bean.Cat@7d68ef40 <span style="color:grey">//创建完成</span> 容器创建完成... <span style="color:grey">//关闭时销毁</span> cat ... destroy...</span></span>
⭐BeanPostProcessor原理
bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxxBeanPostProcessor都通过BeanPostProcessor实现
主要方法
<span style="background-color:#282b2e"><span style="color:#a9b7c6">populateBean(beanName, mbd, instanceWrapper):给bean进行属性赋值
initializeBean:初始化Bean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);初始化前应用后置处理器
invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);初始化后应用后置处理器
}
遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
一但返回<span style="color:#cc7832">null</span>,跳出<span style="color:#cc7832">for</span>循环</span></span>
执行过程
了解BeanPostProcessor的执行过程,从AnnotationConfigApplicationContext开始Debug
<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">IOCTest_LifeCycle</span> {
<span style="color:#bbb529">@Test</span>
<span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">test01</span>(){
<span style="color:grey">//1、创建ioc容器</span>
AnnotationConfigApplicationContext applicationContext = <span style="color:#cc7832">new</span> AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println(<span style="color:#6a8759">"容器创建完成..."</span>);
<span style="color:grey">//applicationContext.getBean("car");</span>
<span style="color:grey">//关闭容器</span>
applicationContext.close();
}
}</span></span>
- 先从创建ioc容器开始,进入
AnnotationConfigApplicationContext()
构造方法,执行里面的refresh()
方法刷新容器refresh()
方法里面有一个finishBeanFactoryInitialization(beanFactory)
初始化所有剩余的单实例对象,进入这个方法
- 这个方法最后一步有一个
beanFactory.preInstantiateSingletons()
初始化所有单实例Bean,进入这个方法- 触发所有非惰性单例bean的初始化
- 里面调用
getBean(beanName)
, - 进入
getBean(beanName)
里面再调用doGetBean(name,null,null,false)
- 进入
doGetBean(name,null,null,false)
里面有getSingleton(beanName,new ObjectFactory(){singletonFactory.getObject()})
通过匿名内部类调用getObject()
- 此时通过匿名类
getObject()
进入下一个调用栈AbstractBeanFactory$1.getObject()
,如果是单例,调用createBean(beanName,mbd,args)
- 进入
createBean(beanName,mbd,args)
调用doCreateBean(beanName,mbd,args)
创建一个实例,过程如下- 进入
doCreateBean(beanName,mbd,args)
,里面调用一个initializeBean(beanName,exposedObject,mbd)
初始化方法,这个方法里面就是调用的后置处理器 - 在这个方法上面有
populateBean(beanName,mbd,instanceWrapper)
方法,这个方法为Bean属性赋值 - 进入
initializeBean(beanName,exposedObject,mbd)
,下面有一个invokeInitMethods(beanName,wrappedBean,mbd)
执行初始化方法(就是上面的自定义初始化InitializingBean[afterPropertiesSet]、init-method) - 在
invokeInitMethods(beanName,wrappedBean,mbd)[在初始化之前应用 BeanPost 处理器]
上面有一个applyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName)
下面有一个applyBeanPostProcessorsAfterInitialization(wrappedBean,beanName)[在初始化之后应用 BeanPost 处理器]
,作用是在初始化之前应用所有的BeanPostProcessors
在初始化之后应用所有的BeanPostProcessors
- 进入
- 进入
applyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName)
- 里面有
getBeanPostProcessors()
找到所有BeanPostProcessors
遍历,包括Spring系统的BeanPostProcessor
如ApplicationContextAwareProcessor
、ConfigurationClassPostProcessor
等,然后才是自定义的MyBeanPostProcessor
,依次执行beanProcessor.postProcessBeforeInitialization()
- 如果有执行返回null,就结束遍历,返回null,后面的处理器就不执行了(不应用后续的
BeanPostProcessors
了)
- 里面有
调用栈
-
获取单例
-
创建实例Bean
-
给Bean属性赋值和初始化Bean
完整流程
Spring底层对 BeanPostProcessor 的使用;
- 由上图可以看到,Spring中的BeanPostProcessor在实例化过程处于的位置,BeanPostProcessor接口有两个方法需要实现:postProcessBeforeInitialization和postProcessAfterInitialization
- 前者在实例化及依赖注入完成后、在任何初始化代码(比如配置文件中的init-method)调用之前调用;后者在初始化代码调用之后调用。
⭐BeanPostProcessor在Spring底层的使用
许多注解底层都是基于BeanPostProcessor
BeanPostProcessor接口实现类
向组件中注入IoC容器
在Bean创建过程中,初始化之前,判断是否实现了某Aware接口,如果实现了,就向Bean中注入ApplicationContext容器
-
向Bean中注入IoC容器
-
实现ApplicationContextAware接口,声明属性,赋值,就可以在组件中使用Ioc容器
java<span style="background-color:#282b2e"><span style="color:#a9b7c6"><span style="color:#bbb529">@Component</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">class</span> <span style="color:#ffc66d">Dog</span> <span style="color:#cc7832">implements</span> <span style="color:#ffc66d">ApplicationContextAware</span> { <span style="color:grey">//声明IoC容器</span> <span style="color:#cc7832">private</span> ApplicationContext applicationContext; <span style="color:#cc7832">public</span> <span style="color:#ffc66d">Dog</span>(){ System.out.println(<span style="color:#6a8759">"dog constructor..."</span>); } <span style="color:grey">//对象创建并赋值之后调用</span> <span style="color:#bbb529">@PostConstruct</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">init</span>(){ System.out.println(<span style="color:#6a8759">"Dog....@PostConstruct..."</span>); } <span style="color:grey">//容器移除对象之前</span> <span style="color:#bbb529">@PreDestroy</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">detory</span>(){ System.out.println(<span style="color:#6a8759">"Dog....@PreDestroy..."</span>); } <span style="color:grey">//把applicationContext IoC容器赋值给属性</span> <span style="color:#bbb529">@Override</span> <span style="color:#cc7832">public</span> <span style="color:#cc7832">void</span> <span style="color:#ffc66d">setApplicationContext</span>(ApplicationContext applicationContext) <span style="color:#cc7832">throws</span> BeansException { <span style="color:grey">// TODO Auto-generated method stub</span> <span style="color:#cc7832">this</span>.applicationContext = applicationContext; } }</span></span>
-
-
原理是通过
ApplicationContextAwareProcessor
实现-
ApplicationContextAwareProcessor
实现了BeanPostProcessor
接口 -
在
postProcessBeforeInitialization()
方法中- 在Bean初始化之前,判断Bean是否实现了
ApplicationContextAware
接口,或其他Aware接口 - 如果实现了,就调用
invokeAwareInterfaces(bean)
给Bean注入值 - 判断Bean是什么类型Aware,将Bean转成对应类型调用
((ApplicationContextAware)bean).setApplicationContext(this.applicationContext)
注入IoC容器 - 于是就到了上面实现的接口的未实现方法中
- 在Bean初始化之前,判断Bean是否实现了
-
数据校验
BeanValidationPostProcessor
也实现了BeanPostProcessor
接口- 在Bean创建完赋值后,同样调用
postProcessBeforeInitialization()
方法,进行数据校验postProcessBeforeInitialization(){doValidate(bean)}
postProcessAfterInitialization(){doValidate(bean)}
自定义初始化注解
- Bean初始化有一种方法是使用
@PostConstruct
注解,也是通过BeanPostProcessor
实现 InitDestroyAnnotationBeanPostProcessor
处理@PostConstruct
和@PreDestroy
注解- 在
postProcessBeforeInitialization()
中找到Bean的生命周期注解所标注的方法,如initMethods、destroyMethods
- 找到之后就执行注解标注的初始化方法
metatata.invokeInitMethods(bean,beanName)
和element.invoke(target)
,利用反射执行。
- 在
自动注入注解@Autowired
- 为什么@Autowired能够自动注入值,是通过这个
AutowiredAnnotationBeanPostProcessor
实现BeanPostProcessors
接口 - 在对象创建完之后,处理标注
@Autowired
标注的所有属性进行注入值