最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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實現InitializingBean接口

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

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

在這里插入圖片描述

二、InitializingBean擴展

構造方法、注解postConstruct,實現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實現了InitializingBean接口,并且同時在配置了init-method,系統(tǒng)則是先調用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)) {
            //進一步查看該方法的源碼,可以發(fā)現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的使用詳細解析的文章就介紹到這了,更多相關InitializingBean的使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一篇文章帶你了解一些Java反射的學習記錄

    一篇文章帶你了解一些Java反射的學習記錄

    java反射機制是一個很好用的東西,用它可以解決很多死的東西,因為反射機制的靈活行很大,有了他,我們就不要花太多的時間來寫操做數據庫的代碼了,這個可以很大的減少開發(fā)時間,而且代碼的可讀性好
    2021-09-09
  • 詳解Springboot2.3集成Spring security 框架(原生集成)

    詳解Springboot2.3集成Spring security 框架(原生集成)

    這篇文章主要介紹了詳解Springboot2.3集成Spring security 框架(原生集成),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • springboot+redis過期事件監(jiān)聽實現過程解析

    springboot+redis過期事件監(jiān)聽實現過程解析

    這篇文章主要介紹了springboot+redis過期事件監(jiān)聽實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • why在重寫equals時還必須重寫hashcode方法分享

    why在重寫equals時還必須重寫hashcode方法分享

    首先我們先來看下String類的源碼:可以發(fā)現String是重寫了Object類的equals方法的,并且也重寫了hashcode方法
    2013-10-10
  • Java MySQL動態(tài)語句編寫實現方式

    Java MySQL動態(tài)語句編寫實現方式

    這篇文章主要介紹了Java MySQL動態(tài)語句編寫實現方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • java判斷中文字符串長度的簡單實例

    java判斷中文字符串長度的簡單實例

    下面小編就為大家?guī)硪黄猨ava判斷中文字符串長度的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java中的模板模式說明與實現

    Java中的模板模式說明與實現

    這篇文章主要介紹了Java中的模板模式說明與實現,模板方法模式,又叫模板模式,在一個抽象類公開定義了執(zhí)行它的方法的模板,它的子類可以更需要重寫方法實現,但可以成為典型類中定義的方式進行,需要的朋友可以參考下
    2023-10-10
  • zuulGateway 通過filter統(tǒng)一修改返回值的操作

    zuulGateway 通過filter統(tǒng)一修改返回值的操作

    這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 使用Java模擬鼠標和鍵盤的詳細操作步驟

    使用Java模擬鼠標和鍵盤的詳細操作步驟

    這篇文章主要介紹了使用Java模擬鼠標和鍵盤的詳細操作步驟,要運行上面提供的Java程序,您需要遵循幾個步驟來設置Java環(huán)境、編寫程序代碼,并執(zhí)行該程序,文中有相關的代碼示例,需要的朋友可以參考下
    2024-05-05
  • 一文講解Java的String、StringBuffer和StringBuilder的使用與區(qū)別

    一文講解Java的String、StringBuffer和StringBuilder的使用與區(qū)別

    String是不可變的字符序列,而StringBuffer和StringBuilder是可變的字符序列,本文就來詳細的介紹一下Java的String、StringBuffer和StringBuilder的使用與區(qū)別,感興趣的可以了解一下
    2024-03-03

最新評論

延津县| 龙门县| 栾川县| 石台县| 和平区| 阜平县| 荃湾区| 商洛市| 佛山市| 荣昌县| 沂源县| 龙海市| 富川| 离岛区| 攀枝花市| 阳泉市| 武乡县| 田东县| 保山市| 合山市| 蛟河市| 桓仁| 瑞昌市| 宜章县| 清流县| 蓝田县| 阿拉善右旗| 乌拉特中旗| 宁乡县| 遂宁市| 西畴县| 盐边县| 长岛县| 沭阳县| 上饶市| 威海市| 寻乌县| 灵山县| 怀远县| 大城县| 中宁县|