Spring中的InitializingBean介面的使用
眾所周知Spring框架主要的一個功能是IOC容器,IOC就是控制反轉將本來需要我們手動例項化bean的過程,交給了Spring去完成。讓Spring幫我們去例項化和維護bean。如果我們要在bean例項完成後執行自定義初始化方法怎麼辦呢?在Spring框架中提供了兩種方式,一種是在XML配置bean時指定init-method,另外一種方式是bean實現InitializingBean介面。
舉個栗子:
import org.springframework.beans.factory.InitializingBean; public class TestInitializingBean implementsInitializingBean{ @Override public void afterPropertiesSet() throws Exception { System.out.println("測試 InitializingBean"); } public void testInit(){ System.out.println("測試 init-method"); } }
配置檔案:
<bean id="testInitializingBean" class="com.TestInitializingBean" ></bean>
測試程式碼:
@Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); }
測試結果:
測試 InitializingBean
這說明在spring初始化bean的時候,如果該bean實現了InitializingBean介面,會自動呼叫afterPropertiesSet方法。
那麼問題來了,在配置bean的時候使用init-method配置也可以為bean配置初始化方法,那這兩個哪個會先執行呢,接下來測試一下。
配置檔案:
<bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"></bean>
測試結果:
測試 InitializingBean
測試 init-method
從結果可以看出,在Spring初始化bean的時候,如果該bean實現了InitializingBean介面,並且同時在配置檔案中指定了init-method,系統則是先呼叫afterPropertieSet()方法,然後再呼叫init-method中指定的方法。
總結:
1、當我們要在bean例項完成後執行自定義初始化方法時,Spring提供了兩種方式,一種是在XML配置bean時指定init-method,另外一種方式是bean實現InitializingBean介面,兩種方式可以同時使用。
2、實現InitializingBean介面是直接呼叫afterPropertiesSet方法,比通過反射呼叫init-method指定的方法效率要高一點,但是init-method方式消除了對Spring的依賴。
3、如果呼叫afterPropertiesSet方法時出錯,則不呼叫init-method指定的方法。