1. 程式人生 > 實用技巧 >Spring中的InitializingBean與DisposableBean

Spring中的InitializingBean與DisposableBean

InitializingBean顧名思義,應該是初始化Bean相關的介面。
先看一下該介面都定義了哪些方法:

public interface InitializingBean {
    void afterPropertiesSet() throws Exception;
}

看方法名,應該是在讀完Properties檔案,之後執行的方法,不是很瞭解,先寫個bean測試一下。

  • 首先宣告一個Bean
package com.github.jettyrun.springinterface.demo.initializingbean;

import org.springframework.beans.factory.InitializingBean;

/** * Created by jetty on 18/1/31. */ public class InitBean implements InitializingBean{ public void afterPropertiesSet() throws Exception { System.out.println("init-afterPropertiesSet()"); } public void test(){ System.out.println("init-test()"); } }
  • 然後用Spring管理,初始化一個Bean
 <bean id="initBean" class="com.github.jettyrun.springinterface.demo.initializingbean.InitBean"></bean>
  • 載入一下上下文
public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:application-usertag.xml");
    }
  • 執行結果
init-afterPropertiesSet()

我們能看到,在spring在初始化initBean的時候,呼叫了afterPropertiesSet方法,也就是說 spring在初始化實現了InitializingBean介面的bean的時候,會執行afterPropertiesSet()方法。
我們也知道,在spring初始化bean的時候,可以配置beaninit-method屬性,在initBean上新增一個試試。
配置如下:

    <bean id="initBean" init-method="test" class="com.github.jettyrun.springinterface.demo.initializingbean.InitBean"></bean>

載入一下上下文得到執行結果:

init-afterPropertiesSet()
init-test()

我們看到,在初始化bean的過程中,先呼叫了 afterPropertiesSet()方法,然後執行init-method定義的方法。

也就是說springbean提供了兩種初始化的方式,第一種實現InitializingBean介面,實現afterPropertiesSet方法,第二種配置檔案中通過init-method指定,兩種方式可以同時使用,同時使用先呼叫afterPropertiesSet方法,後執行init-method指定的方法。

DisposableBean介面又是幹嘛的,看一下介面定義:

public interface DisposableBean {
    void destroy() throws Exception;
}

只定義了一個方法,destroy,看名字應該是物件在銷燬時執行的,給上面的InitBean也實現一下DisposableBean介面,程式碼如下:

public class InitBean implements InitializingBean,DisposableBean {
    public void destroy() throws Exception {
        System.out.println("destroy");

    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("init-afterPropertiesSet()");
    }

    public void test(){
        System.out.println("init-test()");
    }

再執行一下main方法:

public class Main {

    public static void main(String[] args) {
        AbstractApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:application-usertag.xml");
//        InitBean initBean=(InitBean)applicationContext.getBean("initBean");
        System.out.println("init-success");
        applicationContext.registerShutdownHook();
    }
}

執行結果:

init-afterPropertiesSet()
init-test()
init-success
destroy

也就是說,在物件銷燬的時候,會去呼叫DisposableBeandestroy方法。
同樣,在物件銷燬有一個引數配置destroy-method,和init-method相同,在呼叫銷燬的時候,先執行 DisposableBeandestroy方法,後執行 destroy-method宣告的方法。

程式碼地址:https://gitee.com/shxz130/SpringInterfaceDemo

https://blog.csdn.net/xiaoxufox/article/details/80420739