中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中的InitializingBean接口的使用

發布時間:2020-08-22 20:03:16 來源:腳本之家 閱讀:248 作者:衛旗 欄目:編程語言

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接口的使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴旗县| 江阴市| 商洛市| 尼勒克县| 侯马市| 保德县| 古交市| 阿瓦提县| 锦屏县| 余干县| 武定县| 马鞍山市| 长武县| 酉阳| 肇东市| 剑川县| 印江| 博野县| 尤溪县| 井研县| 贡嘎县| 洛川县| 大荔县| 南郑县| 牟定县| 志丹县| 重庆市| 沁源县| 东乡| 凯里市| 泗阳县| 大安市| 鄂托克旗| 和田市| 永新县| 盘锦市| 峨眉山市| 韶关市| 收藏| 宁都县| 雷波县|