Spring 容器中 Bean 的生命周期


Spring 容器中 Bean 的生命周期

1. init-method 和 destory-method 方法

Spring 初始化 bean 或銷毀 bean 時,有時需要作一些處理工作,因此 spring 可以在創建和拆卸 bean 的時候調用 bean 的兩個生命周期方法。

如:

bean id="xxx" class="xxx" init-method="init" destory-method="destory" />
  • 當 bean 被載入到容器的時候調用 init,當 bean 從容器中刪除的時候調用 destory(scope=singleton有效)。init 和 destory 的方法名可以自己命名

  • web 容器中會自動調用,但是 main 函數或測試用例需要手動調用

具體代碼:SpringDemo3.demo2()


2. Spring 容器中 Bean 的生命周期(了解)

  1. instantiate bean 對象實例化
  2. populate properties 封裝屬性
  3. 如果 Bean 實現 BeanNameAware 執行 setBeanName
  4. 如果 Bean 實現 BeanFacotryAware 或者 ApplicationContextAware 設置工廠 setBeanFactory 或者上下文對象 setApplicationContext
  5. 如果存在類實現 BeanPostProcessor(后處理Bean),執行 postProcessBeforeInitialization
  6. 如果 Bean 實現 InitializingBean執行 afterPropertiesSet
  7. 調用 <bean init-method="init"> 指定初始化方法 init ,如果存在類實現 BeanPostProcessor(處理 Bean),執行 postProcessAfterInitialization
  8. 執行業務處理
  9. 如果 Bean 實現 DisposableBean ,執行 destroy
  10. 調用 bean destroy-method="customerDestroy"> 指定銷毀方法 customerDestroy

其中最重要的是:第五步和第七步。

在 ide 中實現上述過程,打印如下:

具體代碼:SpringDemo3.demo3()


3. beanpostprocessor 的作用

beanpostprocessor 類可以在生成類的過程當中,對類產生代理,並可以對類中的方法進行增強。

如下面代碼就是一個 beanpostprocessor 類,我們對 postProcessAfterInitialization 初始化后方法進行增強。增強 bean 中的 save 方法。

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // System.out.println("第五步:初始化前的方法...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
        // System.out.println("第八步:初始化后方法...");

        //使用代理,構造匿名函數
        if ("userDao".equals(beanName)) {
            Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if ("save".equals(method.getName())) {
                        System.out.println("權限校驗==========");
                        // 傳入屬性
                        return method.invoke(bean, args);
                    }
                    return method.invoke(bean, args);
                }
            });

            return proxy;
        } else {
            return bean;
        }
    }
}

輸出如下:

具體代碼:SpringDemo3.demo4()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM