Spring注解开发生命周期原理解析
生命周期
initMethod和destroyMethod
Bean定义
publicclassCar{
publicCar(){
System.out.println("carconstructor");
}
publicvoidinit(){
System.out.println("carinit");
}
publicvoiddestroy(){
System.out.println("cardestroy");
}
}
配置类
- bean创建--初始化--销毁
- 可以自定义初始化和销毁方法
- 初始化:对象创建完成,并赋值完成,调用初始化方法
- 销毁:容器关闭进行销毁(单实例)
多实例容器不会管理这个bean
@Configuration
publicclassMyCOnfigOfLifeCycle{
@Bean(initMethod="init",destroyMethod="destroy")
publicCarcar(){
returnnewCar();
}
}
获取容器
@Test
publicvoidtest01(){
printBeans(applicationContext);
//关闭容器
applicationContext.close();
}
privatevoidprintBeans(AnnotationConfigApplicationContextapplicationContext){
String[]beanDefinitionNames=applicationContext.getBeanDefinitionNames();
for(StringbeanDefinitionName:beanDefinitionNames){
System.out.println(beanDefinitionName);
}
}
InitializingBean和DisposableBean
Bean定义
publicclassCatimplementsInitializingBean,DisposableBean{
@Override
publicvoiddestroy()throwsException{
System.out.println("catdestroy");
}
@Override
publicvoidafterPropertiesSet()throwsException{
System.out.println("catinitialize");
}
}
实现了InitializingBean和Disposable后,也可以实现初始化和销毁的方法
PostConstruct和PreDestroy
Bean定义
publicclassDog{
publicDog(){
System.out.println("dogconstructor");
}
@PostConstruct
publicvoidinit(){
System.out.println("doginit");
}
@PreDestroy
publicvoiddestroy(){
System.out.println("dogdestroy");
}
}
BeanPostProcessor
bean
定义
publicclassMyBeanPostProcessorimplementsBeanPostProcessor{
@Override
publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{
System.out.println("beforeinit"+beanName);
returnbean;
}
@Override
publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{
System.out.println("afterinit"+beanName);
returnbean;
}
}
加入到bean中,可以发现每个bean初始化前后都会执行功能
- postProcessBeforeInitialization将在一个bean被完全初始化前进行回调,此时对应的bean已经实例化了,但是对应的属性注入等还没有进行,即在调用InitializingBean的afterPropertiesSet()方法或bean对应的init-method之前
- postProcessAfterInitialization将在bean被完全初始化后进行回调,此时对应的依赖注入已经完成,即在调用InitializingBean的afterPropertiesSet()方法或对应init-method方法之后。
postProcessBeforeInitialization方法的返回值会被Spring容器作为处理后的Bean注册到容器中。如果你在postProcessBeforeInitialization方法中重新构造了一个Bean进行返回,而不是返回参数中的bean;那么你返回的Bean将会被注册到Spring容器中。而原来在Spring中配置的Bean(被Spring实例化的Bean)将会被覆盖。
一旦这两个方法返回null,就不会执行后面的postProcessBefore/AfterInitialization,(在applyBeanPostProcessorsBeforeInitialization中)
for(Iteratorvar4=this.getBeanPostProcessors().iterator();var4.hasNext();result=current){
BeanPostProcessorprocessor=(BeanPostProcessor)var4.next();
current=processor.postProcessBeforeInitialization(result,beanName);
if(current==null){
returnresult;
}
}
步骤:
populateBean给Bean赋值
initializeBean{applyBeanPostProcessorsBeforeInitialization,
invokeInitMethods,//自定义初始化
applyBeanPostProcessorsAfterInitialization}
底层使用
bean赋值,bean注入,@autowire,生命周期注解功能,@Async
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。