はじめに
この記事では、主にSpring IOCコンテナー内のBeanのライフサイクルについて説明します
春の豆のライフサイクル
SpringのBean宣言サイクルは、次の4つの段階に分けることができます。
- インスタンス化フェーズ-インスタンス化はコンストラクターを呼び出します
- 属性割り当てフェーズ-Populateは依存関係注入をセットアップします
- 初期化---初期化呼び出しInitメソッド
- Destruction-DestructionはDestoryメソッドを呼び出します
さまざまな段階のインターフェースとメソッド
各ステージは特定のインターフェースとメソッドです。メソッドとインターフェースのタイプに応じて、次のカテゴリに分類できます。
- Bean自体のインターフェースとメソッドinitメソッド、destroyメソッド
- BeanライフサイクルインターフェースBeanNameAware、ApplicationContextAware、BeanFactoryAware、InitializingBean、DisposableBean
- コンテナーレベルのライフサイクルインターフェイスには、主にBeanPostProcessor、InstantiationAwareBeanPostProcessorが含まれます。
- ファクトリーレベルの処理インターフェースBeanFactoryPostProcessor
実行プロセス
上記の多くのインターフェースとメソッドの実行順序について述べましたか?
BeanLifecycleコードは次のとおりです
/**
* @ClassName BeanLifecycle
* @Auther burgxun
* @Description: Spring bean 的生命周期
* @Date 2020/4/21 12:45
**/
public class BeanLifecycle implements BeanNameAware, ApplicationContextAware, BeanFactoryAware,InitializingBean,
DisposableBean {
public BeanLifecycle() {
System.out.println("========>【Bean】【BeanLifecycle】执行 构造函数");
}
@Override
public void setBeanName(String s) {
System.out.println("========>【Bean】【BeanNameAware】 执行方法 setBeanName -------》实例化bean后 " +
"为bean 注入BeanName-" + s);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("========>【Bean】【ApplicationContextAware】 执行方法 " +
"setApplicationContext-------》实例化bean后 为bean注入ApplicationContext");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("========>【Bean】【BeanFactoryAware】 执行方法 setBeanFactory -------》实例化bean后 ");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("========>【Bean】【InitializingBean】执行方法 afterPropertiesSet -------》bean" +
" 实例化完成后 初始化之前调用");
}
public void beanInit() {
System.out.println("========>【Bean】【BeanLifecycle】 执行方法 Init-Method " +
"-------》xml中配置bean实例化完成后 初始化方法");
}
public void beanDestroy() {
System.out.println("========>【Bean】【BeanLifecycle】 执行方法 Destroy-Method " +
"-------》xml中配置销毁bean之前 回调方法" +
" ");
}
public void sayHello() {
System.out.println("========>【Bean】【BeanLifecycle】执行方法 bean中方法 -------》 sayHello");
}
@Override
public void destroy() throws Exception {
System.out.println("========>【Bean】【DisposableBean】 执行方法 destroy -------》 销毁 Bean 的回调方法");
}
}
ContainerLifecycleメソッドは次のとおりです。
**
* @ClassName ContainerLifecycle
* @Auther burgxun
* @Description: Spring 容器 生命周期
* @Date 2020/4/21 14:44
**/
@Component
public class ContainerLifecycle extends InstantiationAwareBeanPostProcessorAdapter {
public ContainerLifecycle() {
System.out.println("========>【Container】【ContainerLifecycle】 执行 构造函数");
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("========>【Container】【InstantiationAwareBeanPostProcessor】执行 " +
"postProcessBeforeInstantiation" +
"-------》Bean实例化之前调用 beanName:" + beanName);
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println("========>【Container】【InstantiationAwareBeanPostProcessor】执行 " +
"postProcessAfterInstantiation " +
"-------》Bean实例化之后调用 beanName:" + beanName);
return super.postProcessAfterInstantiation(bean, beanName);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("========>【Container】【BeanPostProcessor】 执行" +
"postProcessBeforeInitialization " +
"-------》Bean初始化之前调用 beanName:" + beanName);
return super.postProcessBeforeInitialization(bean, beanName);
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("========>【Container】【BeanPostProcessor】执行 " +
"postProcessAfterInitialization " +
"-------》Bean初始化之后调用 beanName:" + beanName);
return super.postProcessAfterInitialization(bean, beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
System.out.println("========>【Container】【InstantiationAwareBeanPostProcessor】 执行 postProcessProperties " +
"Bean 属性赋值的时候 beanName:" + beanName);
return null;
}
}
FactoryLifecycleコードは次のとおりです
/**
* @ClassName FactoryLifecycle
* @Auther burgxun
* @Description: Spring beanFactory 如下
* @Date 2020/4/21 17:32
**/
public class FactoryLifecycle implements BeanFactoryPostProcessor {
public FactoryLifecycle() {
System.out.println("========>【BeanFactory】【BeanFactoryPostProcessor】 执行 FactoryLifecycle " +
"构造函数");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("========>【BeanFactory】【BeanFactoryPostProcessor】 执行方法 " +
"postProcessBeanFactory ");
}
}
春豆テスト
public class SpringTest {
@Test
public void mySpringBeanTest() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath" +
":Spring-life.xml");
BeanLifecycle beanLifecycle = (BeanLifecycle) context.getBean("beanLifecycle");
beanLifecycle.sayHello();
context.close();
}
}
実行結果は次のとおりです。
【BeanFactory】【BeanFactoryPostProcessor】 执行 FactoryLifecycle 构造函数
【BeanFactory】【BeanFactoryPostProcessor】 执行方法 postProcessBeanFactory
【Container】【ContainerLifecycle】 执行 构造函数
【Container】【InstantiationAwareBeanPostProcessor】执行 postProcessBeforeInstantiation-------》Bean实例化之前调用 beanName:beanLifecycle
【Bean】【BeanLifecycle】执行 构造函数
【Container】【InstantiationAwareBeanPostProcessor】执行 postProcessAfterInstantiation -------》Bean实例化之后调用 beanName:beanLifecycle
【Container】【InstantiationAwareBeanPostProcessor】 执行 postProcessProperties Bean 属性赋值的时候 beanName:beanLifecycle
【Bean】【BeanNameAware】 执行方法 setBeanName -------》实例化bean后 为bean 注入BeanName-beanLifecycle
【Bean】【BeanFactoryAware】 执行方法 setBeanFactory -------》实例化bean后 为bean注入BeanFactory
【Bean】【ApplicationContextAware】 执行方法 setApplicationContext-------》实例化bean后 为bean注入ApplicationContext
【Container】【BeanPostProcessor】 执行postProcessBeforeInitialization -------》Bean初始化之前调用 beanName:beanLifecycle
【Bean】【InitializingBean】执行方法 afterPropertiesSet -------》bean 实例化完成后 初始化之前调用
【Bean】【BeanLifecycle】 执行方法 Init-Method -------》xml中配置bean实例化完成后 初始化方法
【Container】【BeanPostProcessor】执行 postProcessAfterInitialization -------》Bean初始化之后调用 beanName:beanLifecycle
【Bean】【BeanLifecycle】执行方法 bean中方法 -------》 sayHello
【Bean】【DisposableBean】 执行方法 destroy -------》 销毁 Bean 的回调方法
【Bean】【BeanLifecycle】 执行方法 Destroy-Method -------》xml中配置销毁bean之前 回调方法
次にフローチャートを描き続けます
グラフTB A [Bean] B [BeanFactory构造] C [BeanFactoryPostProcessor-postProcessBeanFactory] D [Container构造] E [InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation] F [InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation] H [Bean构造] I [InstantiationAwareBeanProperNameProcessProcessor] ] K [BeanFactoryAware-setBeanFactory] L [ApplicationContextAware-setApplicationContext] M [BeanPostProcessor-postProcessBeforeInitialization] N [InitializingBean-afterPropertiesSet] X [Bean中Init-Method] Y [BeanPostProcessor-postProcessAfterInitialization] Z [Bean中メソッド] U [DisposableBean-destroy ] V [Bean中破棄メソッド] A-> B Y-> ZサブグラフBeanFactory B-> Cエンドサブグラフ例の具体化インスタンス化C-> D D-> E E-> H H-> F終了サブグラフ设置属性と相关依赖投入F-> I I-> J J-> K K->L endサブグラフ初始化初期化L-> M M-> N N-> X X-> Y endサブグラフ销毁破壊Z-> U U-> V end
メソッドのプロセスが整理されました
SpringでBeanを初期化および破棄する3つの呼び出し方法をもう一度要約します。
- InitializingBean / DisposableBeanインターフェースを介して完了
- init-method / destroy-methodをBean要素構成に追加して、呼び出すメソッドを指定します
- @PostConstructまたは@PreDestroyアノテーションを介して呼び出しメソッドを指定する
それらの実行順序は何ですか?
答えは、Bean要素で設定されたアノテーション「インターフェースメソッド」メソッドです。