【Spring Boot-06】自動配置原理

9355 ワード

6.自動配置原理
1.自動配置の原理を分析する
私たちは***HttpEncodingAutoConfigration*を例に自動構成原理を説明します.
//         ,            ,           ;
@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;
    }
    //。。。。。。。
}
一言でまとめると、現在の条件によって、この配置類が有効かどうかを判断します.
  • ですが、この設定クラスは有効です.この配置類は容器に各種のコンポーネントを追加します.
  • これらのコンポーネントの属性は、対応するpropertiesクラスから取得され、これらのクラスのそれぞれの属性はまたファイルバインディングを構成する.
  • 設定ファイルに配置できる属性はすべてxxxPropertiesクラスに実装されています.
  • プロファイルは、どのような設定ができますか?機能に対応するこの属性クラス
  • を参照してください.
    //             bean       
    @ConfigurationProperties(prefix = "spring.http") 
    public class HttpProperties {
       // .....
    }
    
    2.エッセンス
    1、Spring Boot起動は大量の自動配置類をロードします.
    2、私達が必要な機能はSpringBootのデフォルトで書いた自動配置類の中にあるかどうかを見ます.
    3、この自動配置類にはどのようなコンポーネントが配置されているかを見てみます.(私たちが使う部品がそこにある限り、手動で配置する必要はありません.)
    4、容器に自動的にクラスを配置してコンポーネントを追加する場合、propertiesクラスからいくつかの属性を取得します.設定ファイルでこれらの属性の値を指定すればいいです.
    *xxxxxx AutoConfigration:自動配置類;*容器にセットを追加します.
    xxxxProperties:パッケージ構成ファイルの関連属性.
    3.了解:@Connectional
    自動組立の原理を理解した後、細かい問題に注目します.自動配置類は一定の条件で有効になります.
    @Conditional派生注解(Spring注解版原生の@Conditional作用)
    役割:必ず@Coditionalが指定した条件が成立してから、容器にコンポーネントを追加して、中のすべての内容を配置してから有効になります.
    【SpringBoot-06】自动配置原理_第1张图片
    あんなに多い自動配置類は一定の条件の下で有効になります.つまり、私たちはこんなに多くの構成クラスをロードしましたが、すべてのものが有効になったわけではありません.
    どのように自動配置類が有効かどうやって分かりますか?
    debug=true属性を有効にします.コンソールに自動配置報告書を印刷させます.そうすると、どの自動配置類が有効か分かりやすくなります.
    appication.yamlで
    #  springboot    
    debug=true
    
    Positive matches:(自動配置クラス有効:正マッチ)
    Negative matches:(起動されていません.成功した自動設定クラスにマッチしていません.負のマッチング)
    Uniconditional clases:(無条件のクラス)
    【デモ:出力のログを表示する】