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

SpringBoot2底層注解@Configuration配置類詳解

 更新時間:2022年05月28日 09:40:49   作者:把蘋果咬哭的測試筆記  
這篇文章主要為大家介紹了SpringBoot2底層注解@Configuration配置類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

SpringBoot2底層注解@Configuration配置類

一、配置類

@Configuration這個注解作用就是告訴 springboot 這是一個配置類。

這個配置已經不陌生了,在之前 spring 相關的使用全注解方式時,就使用到了配置類。

在配置類里,可以使用@Bean標記在方法上,給容器注冊組件,默認也是單實例的。

@Configuration //告訴SpringBoot這是一個配置類 == 配置文件
public class MyConfig {
    @Bean("user1") //給容器中添加組件。以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實例
    public User user01(){
        return new User("pingguo", 20);
    }
    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

主運行類還是之前示例中的,打印出所有組件的名稱。

可以看到,有上面注冊的 2 個組件:user1、pet1。

二、配置類本身也是組件

在主運行類的 main 方法里,加一個獲取配置類的輸出:

@SpringBootApplication(scanBasePackages = "com.pingguo")
public class MainApplication {
    public static void main(String[] args) {
        // 返回IOC容器
        final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        // 查看容器里的組件
        final String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String name: beanDefinitionNames) {
            System.out.println(name);
        }
        // 從容器中獲取組件
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println("配置類也是組件:" + bean);
    }
}

運行 main 方法,

可以看到最后一個輸出,說明配置類本身也是個組件。

三、proxyBeanMethods 屬性

從springboot2.0之后,@Configuration 中多了一個屬性 proxyBeanMethods,用來代理 bean 的。

默認值是true,也就是說該配置類會被代理(CGLIB),在同一個配置文件中調用其它被@Bean注解標注的方法獲取對象時,springboot 總會檢查容器中是否存在這個組件。

如果容器中存在,直接取。不存在的話,才會去創(chuàng)建,保證單實例。

現在看下false的情況。

@Configuration(proxyBeanMethods = false) //改成 false
public class MyConfig {
    @Bean("user1") //給容器中添加組件。以方法名作為組件的id。返回類型就是組件類型。返回的值,就是組件在容器中的實例
    public User user01(){
        return new User("pingguo", 20);
    }
    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

在主運行程序里多從調用方法獲取對象,判斷一下對象是否相等。

@SpringBootApplication(scanBasePackages = "com.pingguo")
public class MainApplication {
    public static void main(String[] args) {
        // 返回IOC容器
        final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        // 查看容器里的組件
        final String[] beanDefinitionNames = run.getBeanDefinitionNames();
        for (String name: beanDefinitionNames) {
            System.out.println(name);
        }
        // 從容器中獲取組件
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println("配置類也是組件:" + bean);
        User user1 = bean.user01();
        User user2 = bean.user01();
        System.out.println(user1 == user2);
    }
}

看最后的輸出,會是 false。

這里引出 2 個名詞:Full 全模式,Lite 輕量級模式。

  • Full (proxyBeanMethods = true) : 該模式下注入容器中的同一個組件無論被取出多少次都是同一個bean實例,即單實例對象,
  • 在該模式下 SpringBoot 每次啟動都會判斷檢查容器中是否存在該組件。
  • Lite (proxyBeanMethods = false): 該模式下注入容器中的同一個組件無論被取出多少次都是不同的bean實例,即多實例對象,

在該模式下 SpringBoot 每次啟動會跳過檢查容器中是否存在該組件。

那么這個是用來解決什么場景的問題呢?答案:組件依賴。

有組件依賴的場景

看下2個實體類:User、Pet。

public class User {
    private String name;
    private Integer age;
    private Pet pet;
... ...

固定代碼部分:有參構造、無參構造、get和set方法、toString方法,就省去了。

public class Pet {
    private String name;
... ...

修改下配置類里的方法:

@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean("user1") 
    public User user01(){
        User pingguo = new User("pingguo",20);
        pingguo.setPet(tomcatPet());
        return pingguo;
    }
    @Bean("pet1")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

到main方法測試一下:

// 依賴關系
    User user01 = run.getBean("user1", User.class);
    Pet pet1 = run.getBean("pet1", Pet.class);
    System.out.println("依賴:" + (user01.getPet() == pet1));

這里就是判斷當proxyBeanMethods = true的情況下,User對象的 pet,是不是容器中的 pet。

如果是,那么結果就是true。

此時再將proxyBeanMethods = false,重新運行一下,結果會是 false:

那么這 2 個模式分別在什么時候用呢?

當在你的同一個Configuration配置類中,注入到容器中的 bean 實例之間有依賴關系時,建議使用 Full 全模式。

當在你的同一個Configuration配置類中,注入到容器中的 bean 實例之間沒有依賴關系時,建議使用 Lite 輕量級模式,以提高 springboot 的啟動速度和性能。

以上就是SpringBoot2底層注解@Configuration配置類詳解的詳細內容,更多關于SpringBoot2注解@Configuration的資料請關注腳本之家其它相關文章!

相關文章

  • 解決BeanUtils.copyProperties之大坑

    解決BeanUtils.copyProperties之大坑

    這篇文章主要介紹了解決BeanUtils.copyProperties之大坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java List的remove()方法踩坑

    Java List的remove()方法踩坑

    Java的List在刪除元素時,一般會用list.remove(o)/remove(i)方法。在使用時,容易觸碰陷阱,本文就來介紹一下容易踩的坑,感興趣的可以了解一下
    2021-10-10
  • Java OpenCV圖像處理之背景消除

    Java OpenCV圖像處理之背景消除

    GMM(高斯混合模型)是基于像素樣本統計信息的背景表示方法,利用像素在較長時間內大量樣本值的概率密度等統計信息表示別境,然后使用統計差分進行目標像素判斷達到預期效果。本文將利用GMM方法實現圖像背景消除,需要的可以參考一下
    2022-02-02
  • Java中Stream流對多個字段進行排序的方法

    Java中Stream流對多個字段進行排序的方法

    我們在處理數據的時候經常會需要進行排序后再返回給前端調用,比如按照時間升序排序,前端展示數據就是按時間先后進行排序,下面這篇文章主要給大家介紹了關于Java中Stream流對多個字段進行排序的相關資料,需要的朋友可以參考下
    2023-10-10
  • Spring AOP注解失效的坑及JDK動態(tài)代理

    Spring AOP注解失效的坑及JDK動態(tài)代理

    這篇文章主要介紹了Spring AOP注解失效的坑及JDK動態(tài)代理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • java的基本數據類型及屬性

    java的基本數據類型及屬性

    java的基本數據類型及屬性,需要的朋友可以可以參考一下
    2013-03-03
  • Java實現矩形碰撞檢測

    Java實現矩形碰撞檢測

    這篇文章主要為大家詳細介紹了Java實現矩形碰撞檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實例

    Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實例

    這篇文章主要介紹了Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中ArrayList去除重復元素(包括字符串和自定義對象)

    Java中ArrayList去除重復元素(包括字符串和自定義對象)

    本文主要介紹了Java中ArrayList去除重復元素(包括字符串和自定義對象)的方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • mybatis?實現字段大小寫賦值

    mybatis?實現字段大小寫賦值

    這篇文章主要介紹了mybatis?實現字段大小寫賦值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

普定县| 宜州市| 华阴市| 柯坪县| 长岛县| 湄潭县| 江达县| 博客| 鄂尔多斯市| 阿克陶县| 达日县| 临安市| 建德市| 买车| 府谷县| 威宁| 盐池县| 芦山县| 瓮安县| 凤庆县| 南宫市| 龙州县| 长垣县| 佛教| 茂名市| 慈利县| 嘉黎县| 大同县| 枝江市| 和平县| 敦煌市| 罗山县| 介休市| 鹿邑县| 古蔺县| 久治县| 新晃| 江安县| 普洱| 柘荣县| 察雅县|