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

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

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

SpringBoot2底層注解@Configuration配置類

一、配置類

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

這個(gè)配置已經(jīng)不陌生了,在之前 spring 相關(guān)的使用全注解方式時(shí),就使用到了配置類。

在配置類里,可以使用@Bean標(biāo)記在方法上,給容器注冊(cè)組件,默認(rèn)也是單實(shí)例的。

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

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

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

二、配置類本身也是組件

在主運(yùn)行類的 main 方法里,加一個(gè)獲取配置類的輸出:

@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);
    }
}

運(yùn)行 main 方法,

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

三、proxyBeanMethods 屬性

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

默認(rèn)值是true,也就是說該配置類會(huì)被代理(CGLIB),在同一個(gè)配置文件中調(diào)用其它被@Bean注解標(biāo)注的方法獲取對(duì)象時(shí),springboot 總會(huì)檢查容器中是否存在這個(gè)組件。

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

現(xiàn)在看下false的情況。

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

在主運(yùn)行程序里多從調(diào)用方法獲取對(duì)象,判斷一下對(duì)象是否相等。

@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);
    }
}

看最后的輸出,會(huì)是 false。

這里引出 2 個(gè)名詞:Full 全模式,Lite 輕量級(jí)模式。

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

在該模式下 SpringBoot 每次啟動(dòng)會(huì)跳過檢查容器中是否存在該組件。

那么這個(gè)是用來解決什么場(chǎng)景的問題呢?答案:組件依賴。

有組件依賴的場(chǎng)景

看下2個(gè)實(shí)體類:User、Pet。

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

固定代碼部分:有參構(gòu)造、無參構(gòu)造、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方法測(cè)試一下:

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

這里就是判斷當(dāng)proxyBeanMethods = true的情況下,User對(duì)象的 pet,是不是容器中的 pet。

如果是,那么結(jié)果就是true。

此時(shí)再將proxyBeanMethods = false,重新運(yùn)行一下,結(jié)果會(huì)是 false:

那么這 2 個(gè)模式分別在什么時(shí)候用呢?

當(dāng)在你的同一個(gè)Configuration配置類中,注入到容器中的 bean 實(shí)例之間有依賴關(guān)系時(shí),建議使用 Full 全模式。

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

以上就是SpringBoot2底層注解@Configuration配置類詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot2注解@Configuration的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mybatis查詢語句揭秘之參數(shù)解析

    mybatis查詢語句揭秘之參數(shù)解析

    這篇文章主要給大家介紹了關(guān)于mybatis查詢語句之參數(shù)解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式

    SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式

    這篇文章主要介紹了SpringBoot之groups應(yīng)對(duì)不同的Validation規(guī)則自定義方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問題

    MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問題

    這篇文章主要介紹了MyBatisPlus使用@TableField注解處理默認(rèn)填充時(shí)間的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java擦除和轉(zhuǎn)換實(shí)例分析

    Java擦除和轉(zhuǎn)換實(shí)例分析

    這篇文章主要介紹了Java擦除和轉(zhuǎn)換,結(jié)合實(shí)例形式分析了java擦除和轉(zhuǎn)換概念、功能及相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • 基于Jpa中ManyToMany和OneToMany的雙向控制

    基于Jpa中ManyToMany和OneToMany的雙向控制

    這篇文章主要介紹了Jpa中ManyToMany和OneToMany的雙向控制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Dubbo?retries?超時(shí)重試機(jī)制的問題原因分析及解決方案

    Dubbo?retries?超時(shí)重試機(jī)制的問題原因分析及解決方案

    這篇文章主要介紹了Dubbo?retries?超時(shí)重試機(jī)制的問題,解決方案是通過修改dubbo服務(wù)提供方,將timeout超時(shí)設(shè)為20000ms或者設(shè)置retries=“0”,禁用超時(shí)重試機(jī)制,感興趣的朋友跟隨小編一起看看吧
    2022-04-04
  • java學(xué)習(xí)筆記之DBUtils工具包詳解

    java學(xué)習(xí)筆記之DBUtils工具包詳解

    下面小編就為大家分享一篇java學(xué)習(xí)筆記之DBUtils工具包詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系

    詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系

    這篇文章主要介紹了詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • spring boot的maven配置依賴詳解

    spring boot的maven配置依賴詳解

    本篇文章主要介紹了spring boot的maven配置依賴詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • netty中pipeline異常事件分析

    netty中pipeline異常事件分析

    這篇文章主要為大家介紹了netty中pipeline異常事件分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論