91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot 05自動配置原理是什么

發布時間:2021-12-03 18:34:37 來源:億速云 閱讀:225 作者:柒染 欄目:大數據

SpringBoot 05自動配置原理是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

自動配置原理

配置文件到底能寫什么?怎么寫?SpringBoot官方文檔中有大量的配置,我們無法全部記住,具體位置找官網即可。問題是底層是怎么搞實現的我們需要搞一搞了解下。

分析自動配置原理

我們以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理;

//表示這是一個配置類,和以前編寫的配置文件一樣,也可以給容器中添加組件;
@Configuration 

//啟動指定類的ConfigurationProperties功能;
  //進入這個HttpProperties查看,將配置文件中對應的值和HttpProperties綁定起來;
  //并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties({HttpProperties.class}) 

//Spring底層@Conditional注解
  //根據不同的條件判斷,如果滿足指定的條件,整個配置類里面的配置就會生效;
  //這里的意思就是判斷當前應用是否是web應用,如果是,當前配置類生效
@ConditionalOnWebApplication(
    type = Type.SERVLET
)

//判斷當前項目有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器;
@ConditionalOnClass({CharacterEncodingFilter.class})

//判斷配置文件中是否存在某個配置:spring.http.encoding.enabled;
  //如果不存在,判斷也是成立的
  //即使我們配置文件中不配置pring.http.encoding.enabled=true,也是默認生效的;
@ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
)

public class HttpEncodingAutoConfiguration {
    //他已經和SpringBoot的配置文件映射了
    private final Encoding properties;
    //只有一個有參構造器的情況下,參數的值就會從容器中拿
    public HttpEncodingAutoConfiguration(HttpProperties properties) {
        this.properties = properties.getEncoding();
    }
    
    //給容器中添加一個組件,這個組件的某些值需要從properties中獲取
    @Bean
    @ConditionalOnMissingBean //判斷容器沒有這個組件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
        return filter;
    }
    //。。。。。。。
}

@EnableConfigurationProperties 注解

先說作用:

@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的類生效。

說明:

如果一個配置類只配置@ConfigurationProperties注解,而沒有使用@Component,那么在IOC容器中是獲取不到properties 配置文件轉化的bean。說白了 @EnableConfigurationProperties 相當于把使用 @ConfigurationProperties 的類進行了一次注入。
測試發現 @ConfigurationProperties 與 @EnableConfigurationProperties 關系特別大。

測試證明:@ConfigurationProperties@EnableConfigurationProperties 的關系。

@EnableConfigurationProperties 文檔中解釋:
@EnableConfigurationProperties注解應用到你的@Configuration時, 任何被@ConfigurationProperties注解的beans將自動被Environment屬性配置。 這種風格的配置特別適合與SpringApplication的外部YAML配置進行配合使用。

測試發現:
1.使用 @EnableConfigurationProperties 進行注冊

@ConfigurationProperties(prefix = "service.properties")
public class HelloServiceProperties {
    private static final String SERVICE_NAME = "test-service";

    private String msg = SERVICE_NAME;
       set/get
}


@Configuration
@EnableConfigurationProperties(HelloServiceProperties.class)
@ConditionalOnClass(HelloService.class)
@ConditionalOnProperty(prefix = "hello", value = "enable", matchIfMissing = true)
public class HelloServiceAutoConfiguration {

}

@RestController
public class ConfigurationPropertiesController {

    @Autowired
    private HelloServiceProperties helloServiceProperties;

    @RequestMapping("/getObjectProperties")
    public Object getObjectProperties () {
        System.out.println(helloServiceProperties.getMsg());
        return myConfigTest.getProperties();
    }
}

自動配置設置

service.properties.name=my-test-name
service.properties.ip=192.168.1.1
service.user=kayle
service.port=8080

一切正常,但是 HelloServiceAutoConfiguration 頭部不使用 @EnableConfigurationProperties,測訪問報錯。

2.不使用 @EnableConfigurationProperties 進行注冊,使用 @Component 注冊

@ConfigurationProperties(prefix = "service.properties")
@Component
public class HelloServiceProperties {
    private static final String SERVICE_NAME = "test-service";

    private String msg = SERVICE_NAME;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

Controller 不變,一切正常,如果注釋掉 @Component 測啟動報錯。
由此證明,兩種方式都是將被 @ConfigurationProperties 修飾的類,加載到 Spring Env 中。

一句話總結 配置原理:

根據當前不同的條件判斷,決定這個配置類是否生效!

  • 一但這個配置類生效;這個配置類就會給容器中添加各種組件;

  • 這些組件的屬性是從對應的properties類中獲取的,這些類里面的每一個屬性又是和配置文件綁定的;

  • 所有在配置文件中能配置的屬性都是在xxxxProperties類中封裝著;

  • 配置文件能配置什么就可以參照某個功能對應的這個屬性類
     

    //從配置文件中獲取指定的值和bean的屬性進行綁定
    @ConfigurationProperties(prefix = "spring.http") 
    public class HttpProperties {
        // .....
    }


    我們去配置文件里面試試前綴,看提示!

SpringBoot 05自動配置原理是什么

這就是自動裝配的原理!

精髓

1、SpringBoot啟動會加載大量的自動配置類

2、我們看我們需要的功能有沒有在SpringBoot默認寫好的自動配置類當中;

3、我們再來看這個自動配置類中到底配置了哪些組件;(只要我們要用的組件存在在其中,我們就不需要再手動配置了)

4、給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。我們只需要在配置文件中指定這些屬性的值即可;

5、xxxxAutoConfigurartion:自動配置類;給容器中添加組件

6、xxxxProperties:封裝配置文件中相關屬性;

@Conditional

了解完自動裝配的原理后,我們來關注一個細節問題,自動配置類必須在一定的條件下才能生效;

@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用:必須是@Conditional指定的條件成立,才給容器中添加組件,配置配里面的所有內容才生效;

SpringBoot 05自動配置原理是什么

那么多的自動配置類,必須在一定的條件下才能生效;也就是說,我們加載了這么多的配置類,但不是所有的都生效了。

我們怎么知道哪些自動配置類生效?

我們可以通過啟用 debug=true屬性;來讓控制臺打印自動配置報告,這樣我們就可以很方便的知道哪些自動配置類生效;

#開啟springboot的調試類debug=true
============================
CONDITIONS EVALUATION REPORT
============================


Positive matches: (自動配置類啟用的:正匹配)
-----------------

   AopAutoConfiguration matched:
      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
     ...

Negative matches:  (沒有啟動,沒有匹配成功的自動配置類:負匹配)
-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
     .....

Exclusions:
-----------

    None


Unconditional classes: (沒有條件的類)
----------------------

    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration

    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration

    org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration

關于SpringBoot 05自動配置原理是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汕尾市| 莒南县| 德惠市| 武威市| 刚察县| 咸丰县| 宜章县| 隆尧县| 重庆市| 威信县| 石家庄市| 合阳县| 金山区| 遵义县| 望奎县| 龙海市| 弥勒县| 景宁| 太仓市| 墨脱县| 宁晋县| 鄂伦春自治旗| 名山县| 师宗县| 富平县| 稻城县| 田东县| 贺兰县| 洛浦县| 叶城县| 松潘县| 团风县| 嵊州市| 观塘区| 井研县| 莱阳市| 格尔木市| 祁阳县| 新昌县| 砚山县| 乌兰察布市|