Spring註解開發-全面解析常用註解使用方法之生命周期
本文github位置:https://github.com/WillVi/Spring-Annotation/
往期文章:Spring註解開發-全面解析常用註解使用方法之組件註冊
bean生命周期
? 創建------>初始化------->銷毀。容器統一管理bean的生命周期,我們也可以自定義初始化和銷毀方法;容器在bean進行到當前生命周期的時候來調用我們自定義的初始化和銷毀方法。
流程:
構造(對象創建)
- 單實例:在容器啟動的時候創建對象
- 多實例:在每次獲取的時候創建對象
BeanPostProcessor.postProcessBeforeInitialization
? ps:遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,一但返回null,跳出for循環,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization
初始化: 對象創建完成,並賦值好,調用初始化方法。。。
BeanPostProcessor.postProcessAfterInitialization
銷毀:
- 單實例:容器關閉的時候
- 多實例:容器不會管理這個bean;容器不會調用銷毀方法;
BeanPostProcessor原理
以下下方法依次執行:
populateBean(beanName, mbd, instanceWrapper);
給bean進行屬性賦值
? initializeBean
{
`applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);`初始化前執行 `invokeInitMethods(beanName, wrappedBean, mbd);`執行自定義初始化 `applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);`初始化後執行
}
Spring底層對 BeanPostProcessor 的使用
1. bean賦值
2. 註入其他組件
3. @Autowired
4. 生命周期註解功能
5. @Async,xxx
使用:
指定初始化和銷毀方法;通過@Bean指定initMethod和destroyMethod;
例:
@Bean(initMethod="init",destroyMethod="destroy")
通過讓Bean實現InitializingBean(定義初始化邏輯),DisposableBean(定義銷毀邏輯)
package cn.willvi.bean; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; @Component public class Man implements InitializingBean,DisposableBean{ public Man() { System.out.println("Man創建"); } public void destroy() { System.out.println("Man摧毀"); } public void afterPropertiesSet() throws Exception { System.out.println("Man初始化"); } }
可以使用JSR250;
- @PostConstruct:在bean創建完成並且屬性賦值完成;來執行初始化方法
- @PreDestroy:在容器銷毀bean之前通知我們進行清理工作
package cn.willvi.bean; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.stereotype.Component; @Component public class Woman { public Woman() { System.out.println("woman創建"); } @PreDestroy public void destroy() { System.out.println("Woman摧毀前執行"); } @PostConstruct public void init(){ System.out.println("Woman初始化"); } }
?
BeanPostProcessor【interface】:bean的後置處理器;在bean初始化前後進行一些處理工作
- postProcessBeforeInitialization:在初始化之前工作
- postProcessAfterInitialization:在初始化之後工作
package cn.willvi.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; @Component public class ManBeanPostProcessor implements BeanPostProcessor{ public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException { if(arg1.equals("man")) { System.out.println("----------------------BeanPostProcessor初始化後執行"); } return arg0; } public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { if(arg1.equals("man")) { System.out.println("---------------------BeanPostProcessor初始化前"); } return arg0; } }
Spring註解開發-全面解析常用註解使用方法之生命周期