国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Spring中的InitializingBean接口的使用

2024-07-14 08:40:14
字體:
來源:轉載
供稿:網友

InitializingBean接口為bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是繼承該接口的類,在初始化bean的時候都會執行該方法。

測試,如下:

import org.springframework.beans.factory.InitializingBean;public class TestInitializingBean implements InitializingBean{  @Override  public void afterPropertiesSet() throws Exception {    System.out.println("ceshi InitializingBean");      }  public void testInit(){    System.out.println("ceshi init-method");      }}

配置文件

<bean id="testInitializingBean" class="com.TestInitializingBean" ></bean>

Main函數如下

public class Main {  public static void main(String[] args){    ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/com/beans.xml");  }}

測試結果為:

ceshi InitializingBean

這說明在spring初始化bean的時候,如果bean實現了InitializingBean接口,會自動調用afterPropertiesSet方法。

那么問題來了,在配置bean的時候使用init-method配置也可以為bean配置初始化方法,那這兩個哪個會先執行呢,接下來測試一下,修改配置文件,加上init-method:

<bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"></bean>

運行程序,得出結果:

ceshi InitializingBean
ceshi init-method

從結果可以看出,在Spring初始化bean的時候,如果該bean實現了InitializingBean接口,并且同時在配置文件中指定了init-method,系統則是先調用afterPropertieSet()方法,然后再調用init-method中指定的方法。

那么這種方式在spring中是怎么實現的呢,通過查看Spring加載bean的源碼類AbstractAutowiredCapableBeanFactory可以看出其中的奧妙,AbstractAutowiredCapableBeanFactory類中的invokeInitMethods說的非常清楚,如下:

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {  //判斷該bean是否實現了實現了InitializingBean接口,如果實現了InitializingBean接口,則只掉調用bean的afterPropertiesSet方法  boolean isInitializingBean = (bean instanceof InitializingBean);  if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {    if (logger.isDebugEnabled()) {      logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");    }         if (System.getSecurityManager() != null) {      try {        AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {          public Object run() throws Exception {            //直接調用afterPropertiesSet            ((InitializingBean) bean).afterPropertiesSet();            return null;          }        },getAccessControlContext());      } catch (PrivilegedActionException pae) {        throw pae.getException();      }    }            else {      //直接調用afterPropertiesSet      ((InitializingBean) bean).afterPropertiesSet();    }  }  if (mbd != null) {    String initMethodName = mbd.getInitMethodName();    //判斷是否指定了init-method方法,如果指定了init-method方法,則再調用制定的init-method    if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&        !mbd.isExternallyManagedInitMethod(initMethodName)) {      //進一步查看該方法的源碼,可以發現init-method方法中指定的方法是通過反射實現      invokeCustomInitMethod(beanName, bean, mbd);    }  }}

總結:

1、Spring為bean提供了兩種初始化bean的方式,實現InitializingBean接口,實現afterPropertiesSet方法,或者在配置文件中通過init-method指定,兩種方式可以同時使用。

2、實現InitializingBean接口是直接調用afterPropertiesSet方法,比通過反射調用init-method指定的方法效率要高一點,但是init-method方式消除了對spring的依賴。

3、如果調用afterPropertiesSet方法時出錯,則不調用init-method指定的方法。

Spring InitializingBean的作用

Spring的InitializingBean接口有很好的用處,位于spring beans中,它只提供一個方法afterPropertiesSet(),當你實現了該方法后,spring就會對你提供框架級的支持:當你通過sring容器生產出實現了該接口的類的實例后,它就會調用afterPropertiesSet方法,通過這個方法,你可以檢查你的bean是否正確地被初始化了.當然,你也可以用init-method方法.這兩種方式可以同時使用,調用的順序為init-method后調用.

總結

以上所述是小編給大家介紹的Spring中的InitializingBean接口的使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 琼中| 祁连县| 汾西县| 聂荣县| 淅川县| 赤峰市| 兴城市| 手游| 沈丘县| 江华| 民和| 苍南县| 宁乡县| 太康县| 文山县| 土默特右旗| 称多县| 富川| 商水县| 顺义区| 林芝县| 万荣县| 汤阴县| 青州市| 怀远县| 信丰县| 桦南县| 福海县| 弥勒县| 射洪县| 周至县| 娄烦县| 平利县| 麻城市| 永济市| 子长县| 德化县| 沙洋县| 河东区| 南平市| 丽江市|