欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中的InitializingBean接口的使用

 更新時(shí)間:2018年04月24日 09:08:42   作者:衛(wèi)旗  
這篇文章主要介紹了Spring中的InitializingBean接口的使用,需要的朋友可以參考下

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

測(cè)試,如下:

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函數(shù)如下

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

測(cè)試結(jié)果為:

ceshi InitializingBean

這說明在spring初始化bean的時(shí)候,如果bean實(shí)現(xiàn)了InitializingBean接口,會(huì)自動(dòng)調(diào)用afterPropertiesSet方法。

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

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

運(yùn)行程序,得出結(jié)果:

ceshi InitializingBean
ceshi init-method

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

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

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {
  //判斷該bean是否實(shí)現(xiàn)了實(shí)現(xiàn)了InitializingBean接口,如果實(shí)現(xiàn)了InitializingBean接口,則只掉調(diào)用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 {
            //直接調(diào)用afterPropertiesSet
            ((InitializingBean) bean).afterPropertiesSet();
            return null;
          }
        },getAccessControlContext());
      } catch (PrivilegedActionException pae) {
        throw pae.getException();
      }
    }        
    else {
      //直接調(diào)用afterPropertiesSet
      ((InitializingBean) bean).afterPropertiesSet();
    }
  }
  if (mbd != null) {
    String initMethodName = mbd.getInitMethodName();
    //判斷是否指定了init-method方法,如果指定了init-method方法,則再調(diào)用制定的init-method
    if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
        !mbd.isExternallyManagedInitMethod(initMethodName)) {
      //進(jìn)一步查看該方法的源碼,可以發(fā)現(xiàn)init-method方法中指定的方法是通過反射實(shí)現(xiàn)
      invokeCustomInitMethod(beanName, bean, mbd);
    }
  }
}

總結(jié):

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

2、實(shí)現(xiàn)InitializingBean接口是直接調(diào)用afterPropertiesSet方法,比通過反射調(diào)用init-method指定的方法效率要高一點(diǎn),但是init-method方式消除了對(duì)spring的依賴。

3、如果調(diào)用afterPropertiesSet方法時(shí)出錯(cuò),則不調(diào)用init-method指定的方法。

Spring InitializingBean的作用

Spring的InitializingBean接口有很好的用處,位于spring beans中,它只提供一個(gè)方法afterPropertiesSet(),當(dāng)你實(shí)現(xiàn)了該方法后,spring就會(huì)對(duì)你提供框架級(jí)的支持:當(dāng)你通過sring容器生產(chǎn)出實(shí)現(xiàn)了該接口的類的實(shí)例后,它就會(huì)調(diào)用afterPropertiesSet方法,通過這個(gè)方法,你可以檢查你的bean是否正確地被初始化了.當(dāng)然,你也可以用init-method方法.這兩種方式可以同時(shí)使用,調(diào)用的順序?yàn)閕nit-method后調(diào)用.

總結(jié)

以上所述是小編給大家介紹的Spring中的InitializingBean接口的使用,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)

    Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)

    為了解決 本地調(diào)試 的問題,本文實(shí)現(xiàn)了一種簡單實(shí)用的策略,可以通過 Nacos 動(dòng)態(tài)配置服務(wù)路由,還可以基于用戶,部門,組織等級(jí)別配置服務(wù)路由,實(shí)現(xiàn) 本地調(diào)試 的同時(shí),實(shí)際上也實(shí)現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • springboot 場(chǎng)景啟動(dòng)器使用解析

    springboot 場(chǎng)景啟動(dòng)器使用解析

    這篇文章主要介紹了springboot 場(chǎng)景啟動(dòng)器使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳解Java如何改變字符串中的字符

    詳解Java如何改變字符串中的字符

    這篇文章主要介紹了Java如何改變字符串中的字符,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • List轉(zhuǎn)換成Map工具類的簡單實(shí)例

    List轉(zhuǎn)換成Map工具類的簡單實(shí)例

    下面小編就為大家?guī)硪黄狶ist轉(zhuǎn)換成Map工具類的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • 詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式)

    詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式)

    這篇文章主要介紹了詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-10-10
  • springboot2.2.2集成dubbo的實(shí)現(xiàn)方法

    springboot2.2.2集成dubbo的實(shí)現(xiàn)方法

    這篇文章主要介紹了springboot2.2.2集成dubbo的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java中獲取類資源的方法總結(jié)

    java中獲取類資源的方法總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于java中獲取類資源的方法總結(jié),需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • Spring Boot 3 集成 RabbitMQ 實(shí)踐指南(原理解析)

    Spring Boot 3 集成 RabbitMQ 實(shí)踐指南(原理解析

    本文介紹了SpringBoot 3集成RabbitMQ的實(shí)踐指南,涵蓋了RabbitMQ的核心原理、核心概念、高級(jí)特性、應(yīng)用場(chǎng)景、環(huán)境搭建、核心配置類、消息生產(chǎn)者、消息消費(fèi)者、接口控制器、監(jiān)控與運(yùn)維、最佳實(shí)踐以及常見問題與解決方案等內(nèi)容,感興趣的朋友一起看看吧
    2025-02-02
  • JDBC連接SQL?Server數(shù)據(jù)庫實(shí)現(xiàn)增刪改查的全過程

    JDBC連接SQL?Server數(shù)據(jù)庫實(shí)現(xiàn)增刪改查的全過程

    實(shí)際開發(fā)中手動(dòng)的輸入SQL語句是少之又少,大多數(shù)情況下是通過編譯代碼進(jìn)行來控制自動(dòng)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于JDBC連接SQL?Server數(shù)據(jù)庫實(shí)現(xiàn)增刪改查的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 使用mybatisPlus生成oracle自增序列遇到的坑及解決

    使用mybatisPlus生成oracle自增序列遇到的坑及解決

    這篇文章主要介紹了使用mybatisPlus生成oracle自增序列遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論