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
的時候,可以配置bean
的init-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
定義的方法。
也就是說spring
為bean
提供了兩種初始化的方式,第一種實現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
也就是說,在物件銷燬的時候,會去呼叫DisposableBean
的destroy
方法。
同樣,在物件銷燬有一個引數配置destroy-method
,和init-method
相同,在呼叫銷燬的時候,先執行 DisposableBean
的destroy
方法,後執行 destroy-method
宣告的方法。
程式碼地址:https://gitee.com/shxz130/SpringInterfaceDemo
https://blog.csdn.net/xiaoxufox/article/details/80420739