前書き
SpringBootは今日人気のあるテクノロジーであり、習得しなければならないスキルアイテムでもあります。その出現は「慣習は構成よりも大きい」という概念の恩恵を受けています。Springフレームワークのような面倒なxmlやBeanの構成は必要ありません。 、統合が難しいコンテンツはなく、SpringBootを使用してWebを迅速に開発でき、SpringBootの自動構成機能も非常に魅力的ですが、フレームワークを使用して利便性を提供する一方で、基盤となる実装を忘れてはなりません。開発は高速ですが、基礎となる実装を無視しやすくなります。次に、SpringBoot自動構成の基礎となるソースコードがどのように実装されているかを分析しましょう。
SpringBoot構成ファイル
SpringBootを研究したことのある人なら誰でも、SpringBootにはグローバル構成ファイルapplication.properties / ymlがあることを知っています。構成する必要があるものは、基本的にこのファイルで構成されます。たとえば、最も一般的に使用される構成には、起動時にポートがあります:server。構成ファイルに関する公式SpringBootドキュメントのポートなどには、多くの構成オプションがあります。詳細については、公式SpringBootドキュメントを参照してください。
すべての構成を記憶する必要がありますか?来年までは覚えられないと思われます。構成が多すぎて覚えられません。一番大事なのは、すべての構成を使うわけではないということですが、質問があります。なぜですか。ここでSpringBootを自動的に構成して有効にすることはできますか?SpringBootプロジェクトでどのように有効になりますか?間もなく、ソースコードを通じて詳細を紹介し始めます。
SpringBootの自動構成のソースコードの場所は次のとおりです。
SpringBootの自動構成のソースの場所は次のとおりです。spring-boot-autoconfigure-XXXRELEASE.jar
SpringBoot自動構成原理のソースコード分析
@SpringBootApplication
まず、新しいSpringBootプロジェクトにスタートアップクラスがあり、スタートアップクラスに@SpringBootApplication
注釈があることは誰もが知っています。これはSpringBootのコア注釈です。これは、SpringBootの自動構成の原則と多くの関係があります。クリックできます。この注釈の最下層を見てください。
@EnableAutoConfiguration
@SpringBootApplication
注釈をクリックすると、複合注釈(派生注釈)であることがわかり、@EnableAutoConfiguration
注釈が含まれています。中国語の翻訳によると、実際には自動構成が可能(オン)であることを意味します。ここで、最初にこの注釈を覚えています。この注釈は後でソースコードで説明されています。この@EnableAutoConfiguration注釈をクリックして、その下にあるレイヤーを表示します。
@Import(AutoConfigurationImportSelector.class)
この@EnableAutoConfigurationアノテーションも派生アノテーションであることがわかりましたが、内部の主要な関数は、AutoConfigurationImportSelector.classをインポートする@Importによって提供されます。これは何ですか?
ソースコードに従って順番に確認してみましょう。まず、
このクラスでselectImportsメソッドを見つけます。このメソッドは、getAutoConfigurationEntry (annotationMetadata)メソッドを呼び出して、自動構成インスタンスを取得します。このメソッドのチェックを続けましょう。
- 構成候補を取得するためのディスカバリー
getAutoConfigurationEntry(annotationMetadata)
メソッド呼び出しgetCandidateConfigurations(annotationMetadata, attributes)
。 - そして
getCandidateConfigurations(annotationMetadata, attributes)
;でSpringFactoriesLoader.loadFactoryNames().loadSpringFactories()
、Springファクトリをロードするメソッドを呼び出します; loadSpringFactories()
ソースコードclassLoader.getResources(FACTORIES_RESOURCE_LOCATION)
方法、方法が呼び出され、リソースをロードする。FACTORIES_RESOURCE_LOCATION
ソースコード内の定義は次のとおりです。public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
- 最後に、この場所のファイルがロードされ、META-INF /spring.factoriesを含むjarパッケージがスキャンされました。
上記の要約は次のとおりです。インポートされたAutoConfigurationImportSelectorのselectImports()メソッドは、SpringFactoriesLoader.loadFactoryNames()を介してMETA-INF /spring.factoriesを使用してすべてのjarパッケージをスキャンします。spring-boot-autoconfigure-xxxxjarにそのようなspring.factoriesファイルがあります。
spring.factoriesファイルを開くと、key = valueフォームのグループがあり、キーの1つはEnableAutoConfigurationクラスの完全なクラス名であり、その値はxxxxAutoConfigurationクラス名のリストであり、これらのクラス名はコンマです。次の図に示すように、分離します。
@ EnableAutoConfigurationアノテーションは、最初にgetCandidateConfigurationsのSpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass()、getBeanClassLoader())メソッドに関連付けられます。ここで、getSpringFactoriesLoaderFactoryClass()メソッドは次のようにEnableAutoConfiguration.classを返します。表示:
@EnableAutoConfigurationアノテーションでマークされたクラスの下のすべてのリソースを返すことを意味し、@ EnableAutoConfigurationアノテーションは@SpringBootApplicationアノテーションによって継承され、最後にSpringbootのスタートアップクラスで間接的にマークされ、同時にSpringApplication.run(...)でマークされます。 AutoConfigurationImportSelectorでselectImports()メソッドを内部実行すると、すべてのJavaConfig自動構成クラスの完全修飾名に対応するクラスが検索され、すべての自動構成クラスがSpringコンテナーにロードされます。
自動設定の効果について
spring.factoriesファイルの各XxxxAutoConfiguration自動構成クラスは、いくつかの条件付き判断注釈でマークされています。つまり、これらの構成クラスは、特定の条件が満たされた場合にのみ有効になり、これらの条件はSpringBootで制限されます。コメントの形で反映される、一般的な条件付きコメントは次のとおりです。
条件付きコメント | 説明 |
---|---|
ConditionalOnJava | システムのjavaバージョンは要件を満たしていますか? |
ConditionalOnBean | コンテナに指定された豆がある場合。 |
ConditionalOnMissingBean | 指定したBeanがコンテナに存在しない場合。 |
ConditionalOnExpression | SpEL式の仕様を満たす |
ConditionalOnClass | クラスパスに指定されたクラスがある場合。 |
ConditionalOnMissingClass | 指定したクラスがクラスパスに存在しない場合。 |
ConditionalOnSingleCandidate | コンテナ内に指定されたBeanが1つしかないか、このBeanが優先Beanです |
ConditionalOnProperty | 指定されたプロパティに指定された値があるかどうか(たとえば、ConditionalOnProperty(prefix = "xxx.xxx"、value = "enable"、matchlfMissing = ture))。これは、xxx.xxxが有効な場合、条件付きブール値が設定されていない場合はtrueであることを意味します。この場合も同様です。システムで指定された属性に指定された値があるかどうか |
ConditionalOnResource | 指定されたリソースがクラスパスの下に存在するかどうか |
ConditionalOnWebApplication | 現在のWeb環境 |
ConditionalOnNotWebApplication | 現在、Web環境ではありません |
ConditionalOnOnJndi | JNDIは項目を指定しました |
たとえば、Tomcatを開始するように構成したポートを例として取り上げます。たとえば、ポートを変更server: 8081
して有効にする方法、ポートを変更するための自動構成クラスは、spring.factoriesファイルのServletWebServerFactoryAutoConfigurationクラスです。このポートは、構成されていない場合は8080です。 org.apache.catalina.startup.Tomcat内。
spring.factoriesファイルのServletWebServerFactoryAutoConfigurationクラスを介してソースコードを見ると、上記のマークが付いた多くの注釈があることがわかります。その中には、@ EnableConfigurationProperties注釈(オープン構成プロパティ)があり、バインドされたプロパティを持つこのBeanをSpringにインポートします。コンテナでは、その背後にあるパラメータはServerPropertiesクラスです。クリックして確認できます。
このクラスでは、@ ConfiguratioonPropertiesアノテーションがマークされており、その役割は、プロパティを構成ファイルから対応するBeanにバインドし、次に他のすべてのBeanにバインドすることです。このクラスに関連するプロパティは、グローバル構成ファイルで定義できます。つまり、グローバル構成ファイルで構成できるプロパティを実際に「制限」するクラスは、これらのXxxxPropertiesクラスであり、構成ファイルで定義されたプレフィックスのキーになります。単語の先頭にある属性のセットは一意に対応しています。
yml構成ファイルでserver:port:8081を構成する場合、ServerPropertiesのport属性を8081に割り当てるのと同じです。
総括する
この時点で、大まかに理解できます。グローバル構成のプロパティでは、server.portなどが@ConfiguratioonPropertiesアノテーションを介して対応するXxxx.Properties構成エンティティクラスにバインドされ、Beanにカプセル化されてから、@ EnableConfigurationPropertiesが渡されます。注釈はSpringコンテナにインポートされます。
また、多くのXxxxAutoConfiguration自動構成クラスはSpringコンテナーのJavaConfig形式であり、それらの役割はSpringコンテナーのBeanをインポートすることであり、インポートされたすべてのBeanに必要なプロパティはxxxxPropertiesBeanを介して取得されます。
Spring Bootが起動すると、META-INF / spring.factories構成ファイル内のすべての自動構成クラスが@EnableAutoConfigurationアノテーションを介して検索され、ロードされます。これらの自動構成クラスは、実際にはAutoConfigurationにちなんで名付けられています。これは、JavaConfig形式のSpringコンテナ構成クラスであり、server.portなどのPropertiesの最後に指定されたクラスを介してグローバル構成ファイルで構成されたプロパティを取得できます。XxxPropertiesクラスには、グローバル構成ファイルに対応する@ConfigurationPropertiesの注釈が付けられます。プロパティがバインドされている場合、それらをapplication.yml / propertiesファイルに設定すると、対応する構成クラスのプロパティを呼び出して割り当てるのと同じです。
参考資料:https://blog.csdn.net/u014745069/article/details/83820511?utm_medium = dispatch.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source = distribute.pc_relevant.none-task-blog -BlogCommendFromMachineLearnPai2-3.channel_param