春豆のライフサイクルについて語る(1)

はじめに

この記事では、主にSpring IOCコンテナー内のBeanのライフサイクルについて説明します

春の豆のライフサイクル

SpringのBean宣言サイクルは、次の4つの段階に分けることができます。

  1. インスタンス化フェーズ-インスタンス化はコンストラクターを呼び出します
  2. 属性割り当てフェーズ-Populateは依存関係注入をセットアップします
  3. 初期化---初期化呼び出しInitメソッド
  4. Destruction-DestructionはDestoryメソッドを呼び出します

さまざまな段階のインターフェースとメソッド

各ステージは特定のインターフェースとメソッドです。メソッドとインターフェースのタイプに応じて、次のカテゴリに分類できます。

  1. Bean自体のインターフェースとメソッドinitメソッド、destroyメソッド
  2. BeanライフサイクルインターフェースBeanNameAware、ApplicationContextAware、BeanFactoryAware、InitializingBean、DisposableBean
  3. コンテナーレベルのライフサイクルインターフェイスには、主にBeanPostProcessor、InstantiationAwareBeanPostProcessorが含まれます。
  4. ファクトリーレベルの処理インターフェース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つの呼び出し方法をもう一度要約します。

  1. InitializingBean / DisposableBeanインターフェースを介して完了
  2. init-method / destroy-methodをBean要素構成に追加して、呼び出すメソッドを指定します
  3. @PostConstructまたは@PreDestroyアノテーションを介して呼び出しメソッドを指定する

それらの実行順序は何ですか?
答えは、Bean要素で設定されたアノテーション「インターフェースメソッド」メソッドです。

おすすめ

転載: www.cnblogs.com/burg-xun/p/12751007.html