SpringBoot内蔵スターターの多様性を構築する方法ですか?--SpringBoot源(VI)

注:ソースコード解析相当SpringBootバージョン2.1.0.RELEASE

1古いの確認

Benpianアクセス外部の構成プロパティの値がどのようにXxxPropertiesクラスのプロパティに関連付けられていますか?--SpringBoot源(V)

古い、みましょう簡単にレビュー記事の内容を見直し、我々はSpringBootに分析1 の外部構成プロパティの値はXxxPropertiesクラスのプロパティがどのように結びついている今、外部のプロパティの重要なステップは、概要を結合、ソースコード-関連しました次のように:

  1. 最初は、@EnableConfigurationPropertiesコメントimportEnableConfigurationPropertiesImportSelectorポストプロセッサ。
  2. EnableConfigurationPropertiesImportSelectorED後処理Spring容器が登録されConfigurationPropertiesBeanRegistrar、およびConfigurationPropertiesBindingPostProcessorRegistrar2 bean;
  3. 前記容器の登録タイプ容器の登録及び2のポストプロセッサ。ConfigurationPropertiesBeanRegistrarSpringXxxPropertiesbeanConfigurationPropertiesBindingPostProcessorRegistrarSpringConfigurationBeanFactoryMetadataConfigurationPropertiesBindingPostProcessor
  4. ConfigurationBeanFactoryMetadataポストプロセッサの初期化注釈メタデータは、外部の構成で論理関連するその後の結合特性の使用のために保存。bean factory@Bean
  5. ConfigurationPropertiesBindingPostProcessorポストプロセッサ外部構成属性値がバインドされているXxxPropertiesに委託論理プロパティConfigurationPropertiesBinderオブジェクトは、ConfigurationPropertiesBinderオブジェクトと論理的なプロパティは、最終的に委託バインディングBinder完了するために、オブジェクト。

目に見える、それは上記のように重要であるステップ5

2はじめに

我々はすべて知っているように、SpringBootはさまざまな建てStarterスタート信頼を、我々は非常に我々の開発作業を削減する、非常に使いやすいです。Starterスタート依存、我々はこのプロジェクトは、ライブラリ、このライブラリを必要とするかを検討する必要がないgroupIdartifactIdは何ですか?このライブラリのバージョンの導入を心配しないように他の依存関係との競合もありません。

栗の場合:今、私たちは、限りの導入として、Webプロジェクトを開発したいspring-boot-starter-webのバージョンに依存するの導入に関係なく、始動がそれに依存しています。私たちはこのように紹介として、導入された依存関係かを検討する必要が以前のようにspring-webspring-webmvcの依存;また、これらのライブラリの導入のどのバージョンを検討し、他のライブラリと競合することはありません。

我々は自動的に起因する自動設定で起動関係に、今日構成されたソースコードのSpringBootを分析しないようにBenpianは最初、我々は通常、マクロ分析に使用構築するために透視Mavenプロジェクトに立って、手に関係の行く手に依存している組み込みの様々なSpringBoot Starterですどのように構築するには?

3 Mavenの依存オプションのラベル転送

構築された様々なSpringBootの分析ではStarter構造原理の前に、私たちは最初の下にMavenを知っているoptionalラベルが重要な役割を果たしているので、ラベル。
Mavenのoptionalラベル、すなわち直接ギブ栗を説明する以下のない依存任意の送達手段を示しています。

そこに例えばABおよびC3つのライブラリ、C依存BB依存Aここでは3ライブラリを見ていpom.xmlたファイルは:

// A的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <groupId>com.ymbj</groupId>
        <artifactId>A</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <groupId>com.ymbj</groupId>
        <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--注意是可选依赖-->
    <dependencies>
        <dependency>
            <groupId>com.ymbj</groupId>
            <artifactId>A</artifactId>
            <version>1.0-SNAPSHOT</version>
        <optional>true</optional>
        </dependency>
    </dependencies>

</project>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <groupId>com.ymbj</groupId>
        <artifactId>C</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.ymbj</groupId>
            <artifactId>B</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

上記の3つABCのライブラリーpom.xmlショー、Bライブラリの依存関係のAライブラリーは、その後、C順番にライブラリが依存するBライブラリー、次いで、約、とお考え下さい構築するためのMavenのパッケージCライブラリを、Aライブラリはに導入されていませんか?

答えは間違いなく何のために、BインポートライブラリAライブラリを使用しては依存している&lt;optional&gt;true&lt;/optional&gt;、Mavenの程度ではないoptionalラベルが値に設定されtrue、その後、Cライブラリの再導入Bライブラリの依存関係、時にAライブラリがに導入されることはありませんCライブラリ。

Mavenの関連で推移依存性があり、同時にexclusionsタグは、この子を表すことになり、ライブラリの依存関係は、ここでは詳細に説明されていない、除外しました。

組み込みのスターター4 SpringBootは、さまざまなを構築する方法ですか?

私たちは今、建てられ、様々なSpringBoot探るStarter終わりには、それを構築する方法ですか?

覚えておいてくださいSpringBootソースモジュールと構造を分析する方法?この記事のモジュールSpringBoot分析の内部との間の関係?ソースコードを初めて目には、内部ブロック図をSpringBoot:

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图1 </センター>

我々は、すべて知っている、のSpringBoot Starter構造原理の本質が自動的に設定されているので、図から分かるように1内部SpringBootソースプロジェクトをとStarterその自動設定4つの関連モジュールがありますspring-boot-startersspring-boot-actuator-autoconfigurespring-boot-autoconfigurespring-boot-test-autoconfigure各モジュールの役割を見てくださいSpringBootソースモジュールと構造を分析する方法?記事ではなく、ここではそれらを繰り返します。

だから、spring-boot-startersモジュールは自動的に3つの関連モジュールの背面に構成されたxxx-autoconfigure、それが何であるかの関係モジュール?

この時点で、私たちは見てみましょうspring-boot-starters構造は何モジュール内?

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图2 </センター>

図2は、図1のから分かるspring-boot-startersモジュール様々な特注SpringBootが含まstarterspring-boot-starter-xxxビルトインSpringBootの様々なためstarterいつもと、あまりにもspring-boot-starter-web良い頼る探索するスタート。

私たちは、最初のを見てspring-boot-starter-web、モジュールの内部構造:

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图3 </センター>

あなたは見ることができるspring-boot-starter-web唯一のモジュール内.flattened-pom.xmlpom.xml、文書の任意のコードなし私たちが期待したものを超えたビット。我々は、すべてのWeb機能のSpringBootの導入を使用する際に知ってspring-boot-starter-web頼りにし始め、そして今spring-boot-starter-web、その後、コードの単一の行が存在しないモジュールspring-boot-starter-webを構築するために正確にどのように?今は、図1に示しますspring-boot-autoconfigure自動設定モジュールに?

この時点で、私たちは見てする必要があるspring-boot-starter-webモジュールpom.xmlファイルの内容:

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图4 </センター>

これは、図4で見ることができるspring-boot-starter-webのモジュールの依存関係spring-boot-starterspring-boot-starter-tomcatspring-webおよびspring-webmvc他のモジュールではなく、実際に依存spring-boot-autoconfigure自動設定モジュール!

以来spring-boot-starter-webで行うためのモジュールspring-boot-autoconfigure関連の自動設定モジュール、そのspring-boot-starter-webモジュールがオンに間接的に依存しなければなりませんspring-boot-autoconfigure自動設定モジュール。

図4にマークとマーク「フォーカス」spring-boot-starterモジュールは、その最もあるspring-boot-starter-xxxモジュールがコアしたモジュールベースStarterの自動設定、ログとを含む、YAML支持体。この時点で、私たちは時の注意を払わなければなら多分それはに依存し、ファイルの自動設定モジュール。spring-boot-starterpom.xmlspring-boot-autoconfigure

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图5 </センター>

図5から分かるように、私たちの前にそれは、間違っていないと思われることがあるspring-boot-starter依存モジュールspring-boot-autoconfigure自動設定モジュール!したがって、ここで我々は結論付けることができます:spring-boot-starter-webモジュールにはコードではありませんが、によってspring-boot-starterモジュール間接的に依存してspring-boot-autoconfigureその開始依存の機能を実現するために、自動設定モジュール。

この時、私たちは見てspring-boot-autoconfigureモジュールパッケージの自動設定の内部構造:

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图6 </センター>

赤いボックスによって、図6は、我々は知ることができspring-boot-starter-web、もともとにより自動設定に依存する機能の開始をspring-boot-autoconfigureモジュールwebパケットを実装するクラス。

ここでspring-boot-starter-web、我々は明らかに依存している基本原則の建設を開始、しかし、我々は入手していない、特に重要なキーポイントがあります。Mavenの持つ重要な点はoptional、いくつかの効果にラベルを付けます。

ポイントを取得する、の問題について考えてみましょう:通常、我々は開発webプロジェクトが導入されたのはなぜspring-boot-starter-webスタート依存した後、spring-boot-autoconfigureモジュールwebの自動設定クラスに関連付けられ、自動的に作業が再生されますか?

私たちは、自動化されたコンフィギュレーションクラスの仕事は、多くの場合が原因であることを知っている必要がありclasspath、ここに、クラスの存在DispatcherServletAutoConfiguration、自動的に、より良いポイントを取得するためのエントリポイントとして構成され、このクラス。
下を見てDispatcherServletAutoConfiguration自動設定が有効である可能条件?

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图7 </センター>

なお、図7に示されて、DispatcherServletAutoConfiguration自動的に構成することができる条件の一つ@ConditionalOnClass(DispatcherServlet.class)のみということclasspathに存在しDispatcherServlet.class、その後、クラスDispatcherServletAutoConfiguration作業に自動構成ロジック。

そして、DispatcherServletこのクラスがあるspring-webmvcの下に示すように、依存関係ライブラリ:

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图8 </センター>

この時点で、私たちは見てspring-boot-autoconfigureモジュールpom.xmlを導入するために、ファイルspring-webmvcの状況に依存します:

SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)
<センター>图9 </センター>

図9に示すように、spring-boot-autoconfigureモジュールが導入されたspring-webmvc、この依存性はときoptionalに設定されtrue、元の依存任意です。すなわち、spring-webmvcこの依存しますライブラリが中に導入されるspring-boot-autoconfigure代わりに、間接的に依存に導入されるので、モジュールspring-boot-autoconfigureのモジュールspring-boot-starter-webの開始依存性を。

この時点で、私たちは見てみましょうドキュメントの依存:<センター>図10 </センター>spring-boot-starter-webpom.xml
SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)

図10に示すように、spring-boot-starter-web最初の依存性は、明示的に導入spring-webmvc依存関係のすなわち導入spring-webmvc時間がないのoptionalラベルを、そしてのでDispatcherServlet、このクラスにあるspring-webmvc、の依存関係ようにclasspath存在DispatcherServletこのクラスは、DispatcherServletAutoConfigurationこのクラスが有効に来る自動的に設定します。もちろん、web他の自動構成のクラスに関連したこの原則を反映することです。

この時点で、我々はまた、理解spring-boot-autoconfigureモジュールを導入すべき理由spring-webmvcオプションの依存関係として、この依存性を、その目的は、にあるspring-boot-starter-web明示的に開始導入されるエネルギー依存性spring-webmvc私たちは長いの導入などとして、Webプロジェクトを開発しているので、この依存性(この劇決定的な役割)spring-boot-starter-webスタート依存性、自動的に構成するWeb関連のクラスはとてもボックスのうちこれは、有効になりますspring-boot-starter-web依存の開始の構造原理。

前述のspring-boot-starter-actuatorspring-boot-starter-testおよびその他の組み込みspring-boot-starter-xxx始めたの建設原則的には、あまりにも依存しますが、spring-boot-starter-actuator依存しているspring-boot-actuator-autoconfigurespring-boot-starter-test依存しているspring-boot-test-autoconfigureモジュールの塗りつぶしが精巧ではありません。

思考文書は20以上の任意の依存関係を導入し、なぜスタートのみ導入頼ることは、この依存関係を?spring-boot-actuator-autoconfigurepom.xmlspring-boot-starter-actuatormicrometer-core

5 SpringBoot模倣カスタムパッケージ構造スターター

様々な内蔵の以前の分析SpringBoot Starter我々はカスタムでハンズオンを見て練習することができそうだとすれば、実務と理論、原則を構築するStarter方がずっといい。

以下は、カスタム提供してStarter簡単なのがDemo、これは、Demo完全に模倣SpringBootビルトインStarterパッケージの内部構造の書き込みに、SpringBootの詳細情報は、各種のために構築されたStarter有用な構造原理。

ここでDemogithubのアドレスと興味を持っている小さなパートナーにそれをお勧めします。
カスタムスターターの内部構造を模倣Springbootまた、カスタマイズする方法をStarter、MyBatisのは、参照することができ、スプリング・ブート・スターター書かれています。

6まとめ

まあ、様々に建てSpringBoot Starterこの目的のために、分析の建設の原則は、今重要なポイントを要約します:

  1. spring-boot-starter-xxxコードに依存しないを開始しないが、上に直接的または間接的に依存xxx-autoconfigureモジュール、xxx-autoconfigureモジュールが取りspring-boot-starter-xxx開始依存性の自動設定を実現します。
  2. xxx-autoconfigure自動設定モジュールは、いくつかの任意の依存関係を導入し、これらの依存関係は任意に送信されていないspring-boot-starter-xxx依存起動構成されているスタート依存、キー ;
  3. spring-boot-starter-xxxスタート依存性が明示的にオプションの自動設定機能にいくつかの依存を紹介します。
  4. 長い依存の導入として、手動でいくつかを作成することなく、箱から出して使用することができるよう上記で調製した3ステップの後、我々はこのプロジェクトを始めたbeanというように。

オリジナルは、ヘルプ賛美聖歌を指して、容易ではありません!

著者は限られているとおりにエラーがテキストであった場合、また、あなたに感謝し、記入してください。

参考:
1、Mavenの依存を完全に理解推移


[ソース]は、学習の交流とともに、ノート公衆番号に注意を歓迎します。
SpringBoot内蔵スターターの多様性を構築する方法ですか? --SpringBoot源(VI)

おすすめ

転載: blog.51cto.com/14747176/2478625