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

Spring中InitializingBean的使用詳細解析

 更新時間:2024年02月14日 09:19:32   作者:境里婆娑  
這篇文章主要介紹了Spring中InitializingBean的使用詳細解析,InitializingBean是Spring提供的拓展性接口,提供了屬性初始化后的處理方法,它只有一個afterPropertiesSet方法,凡是繼承該接口的類,在bean的屬性初始化后都會執(zhí)行該方法,需要的朋友可以參考下

一、InitializingBean作用

InitializingBean簡介:

InitializingBean是Spring提供的拓展性接口,InitializingBean接口為bean提供了屬性初始化后的處理方法,它只有一個afterPropertiesSet方法,凡是繼承該接口的類,在bean的屬性初始化后都會執(zhí)行該方法。

InitializingBean用法 自定義MyInitializingBean實現(xiàn)InitializingBean接口

@Component
public class MyInitializingBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("我是啟動時加載...");
    }
}

程序啟動在日志中看到如下信息:

在這里插入圖片描述

二、InitializingBean擴展

構造方法、注解postConstruct,實現(xiàn)InitializingBean方法afterPropertiesSet,bean初始化init方法執(zhí)行順序。

@Component
public class MyInitializingBean implements InitializingBean {

    public MyInitializingBean() {
        System.out.println("我是MyInitializingBean構造方法執(zhí)行...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("我是afterPropertiesSet方法執(zhí)行...");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("我是postConstruct方法執(zhí)行...");
    }

    public void init(){
        System.out.println("我是init方法執(zhí)行...");
    }

    @Bean(initMethod = "init")
    public MyInitializingBean test() {
        return new MyInitializingBean();
    }
}

程序啟動在日志中看到如下信息:

在這里插入圖片描述

通過啟動日志我們可以看出執(zhí)行順序優(yōu)先級:構造方法 > postConstruct >afterPropertiesSet > init方法。

在Spring初始化bean的時候,如果該bean實現(xiàn)了InitializingBean接口,并且同時在配置了init-method,系統(tǒng)則是先調用afterPropertieSet()方法,然后再調用init-method中指定的方法。

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

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable {
    //判斷該bean是否實現(xiàn)了實現(xiàn)了InitializingBean接口,如果實現(xiàn)了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)) {
            //進一步查看該方法的源碼,可以發(fā)現(xiàn)init-method方法中指定的方法是通過反射實現(xiàn)
            invokeCustomInitMethod(beanName, bean, mbd);
        }
    }
}

總結

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

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

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

到此這篇關于Spring中InitializingBean的使用詳細解析的文章就介紹到這了,更多相關InitializingBean的使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 挑戰(zhàn)4道Java試題

    挑戰(zhàn)4道Java試題

    這篇文章主要為大家分享了4道Java基礎題,幫助大家鞏固基礎知識,夯實java基礎技能,感興趣的朋友快點挑戰(zhàn)
    2015-12-12
  • java獲取文件的inode標識符的方法

    java獲取文件的inode標識符的方法

    這篇文章主要介紹了java獲取文件的inode標識符,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Java中ThreadLocal的使用

    Java中ThreadLocal的使用

    這篇文章主要介紹了Java中ThreadLocal的使用,靜態(tài)內部類的加載是在程序中調用靜態(tài)內部類的時候加載的,和外部類的加載沒有必然關系, 但是在加載靜態(tài)內部類的時候 發(fā)現(xiàn)外部類還沒有加載,那么就會先加載外部類 ,加載完外部類之后,再加載靜態(tài)內部類,需要的朋友可以參考下
    2023-09-09
  • Spring實戰(zhàn)之FileSystemResource加載資源文件示例

    Spring實戰(zhàn)之FileSystemResource加載資源文件示例

    這篇文章主要介紹了Spring實戰(zhàn)之FileSystemResource加載資源文件,結合實例形式分析了spring FileSystemResource加載xml資源文件的具體實現(xiàn)步驟與相關操作技巧,需要的朋友可以參考下
    2019-12-12
  • 如何獲取?Spring?heapdump中的明文密碼

    如何獲取?Spring?heapdump中的明文密碼

    Actuator是Spring?Boot提供的應用系統(tǒng)監(jiān)控的開源框架,在攻防場景里經常會遇到Actuator配置不當?shù)那闆r,攻擊者可以直接下載heapdump堆轉儲文件,本文介紹如何獲取?Spring?heapdump中的密碼明文,需要的朋友可以參考下
    2022-07-07
  • Java日常練習題,每天進步一點點(14)

    Java日常練習題,每天進步一點點(14)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • 關于Spring工廠方法注入屬性方式

    關于Spring工廠方法注入屬性方式

    這篇文章主要介紹了關于Spring工廠方法注入屬性方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java實現(xiàn)學生管理系統(tǒng)詳解流程

    Java實現(xiàn)學生管理系統(tǒng)詳解流程

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • springboot結合vue實現(xiàn)增刪改查及分頁查詢

    springboot結合vue實現(xiàn)增刪改查及分頁查詢

    本文主要介紹了springboot結合vue實現(xiàn)增刪改查及分頁查詢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MyBatis源碼解析——獲取SqlSessionFactory方式

    MyBatis源碼解析——獲取SqlSessionFactory方式

    這篇文章主要介紹了MyBatis源碼解析——獲取SqlSessionFactory方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論