注:ソースコード解析相当SpringBootバージョン2.1.0.RELEASE
1古いの確認
Benpianアクセス外部の構成プロパティの値がどのようにXxxPropertiesクラスのプロパティに関連付けられていますか?--SpringBoot源(V)
古い、みましょう簡単にレビュー記事の内容を見直し、我々はSpringBootに分析1 の外部構成プロパティの値はXxxPropertiesクラスのプロパティがどのように結びついている今、外部のプロパティの重要なステップは、概要を結合、ソースコード-関連しました次のように:
- 最初は、
@EnableConfigurationProperties
コメントimport
のEnableConfigurationPropertiesImportSelector
ポストプロセッサ。 EnableConfigurationPropertiesImportSelector
ED後処理Spring
容器が登録されConfigurationPropertiesBeanRegistrar
、およびConfigurationPropertiesBindingPostProcessorRegistrar
2bean
;- 前記容器の登録タイプ、容器の登録及び2のポストプロセッサ。
ConfigurationPropertiesBeanRegistrar
Spring
XxxProperties
bean
ConfigurationPropertiesBindingPostProcessorRegistrar
Spring
ConfigurationBeanFactoryMetadata
ConfigurationPropertiesBindingPostProcessor
ConfigurationBeanFactoryMetadata
ポストプロセッサの初期化注釈メタデータは、外部の構成で論理関連するその後の結合特性の使用のために保存。bean
factory
@Bean
ConfigurationPropertiesBindingPostProcessor
ポストプロセッサ外部構成属性値がバインドされているXxxProperties
に委託論理プロパティConfigurationPropertiesBinder
オブジェクトは、ConfigurationPropertiesBinder
オブジェクトと論理的なプロパティは、最終的に委託バインディングBinder
完了するために、オブジェクト。
目に見える、それは上記のように重要であるステップ5。
2はじめに
我々はすべて知っているように、SpringBootはさまざまな建てStarter
スタート信頼を、我々は非常に我々の開発作業を削減する、非常に使いやすいです。でStarter
スタート依存、我々はこのプロジェクトは、ライブラリ、このライブラリを必要とするかを検討する必要がないgroupId
とartifactId
は何ですか?このライブラリのバージョンの導入を心配しないように他の依存関係との競合もありません。
栗の場合:今、私たちは、限りの導入として、Webプロジェクトを開発したい
spring-boot-starter-web
のバージョンに依存するの導入に関係なく、始動がそれに依存しています。私たちはこのように紹介として、導入された依存関係かを検討する必要が以前のようにspring-web
とspring-webmvc
の依存;また、これらのライブラリの導入のどのバージョンを検討し、他のライブラリと競合することはありません。
我々は自動的に起因する自動設定で起動関係に、今日構成されたソースコードのSpringBootを分析しないようにBenpianは最初、我々は通常、マクロ分析に使用構築するために透視Mavenプロジェクトに立って、手に関係の行く手に依存している組み込みの様々なSpringBoot Starter
ですどのように構築するには?
3 Mavenの依存オプションのラベル転送
構築された様々なSpringBootの分析ではStarter
構造原理の前に、私たちは最初の下にMavenを知っているoptional
ラベルが重要な役割を果たしているので、ラベル。
Mavenのoptional
ラベル、すなわち直接ギブ栗を説明する以下のない依存任意の送達手段を示しています。
そこに例えばA
、B
およびC
3つのライブラリ、C
依存B
、B
依存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つA
、B
とC
のライブラリーpom.xml
ショー、B
ライブラリの依存関係のA
ライブラリーは、その後、C
順番にライブラリが依存するB
ライブラリー、次いで、約、とお考え下さい構築するためのMavenのパッケージC
ライブラリを、A
ライブラリはに導入されていませんか?
答えは間違いなく何のために、B
インポートライブラリA
ライブラリを使用しては依存している<optional>true</optional>
、Mavenの程度ではないoptional
ラベルが値に設定されtrue
、その後、C
ライブラリの再導入B
ライブラリの依存関係、時にA
ライブラリがに導入されることはありませんC
ライブラリ。
Mavenの関連で推移依存性があり、同時にexclusions
タグは、この子を表すことになり、ライブラリの依存関係は、ここでは詳細に説明されていない、除外しました。
組み込みのスターター4 SpringBootは、さまざまなを構築する方法ですか?
私たちは今、建てられ、様々なSpringBoot探るStarter
終わりには、それを構築する方法ですか?
覚えておいてくださいSpringBootソースモジュールと構造を分析する方法?この記事のモジュールSpringBoot分析の内部との間の関係?ソースコードを初めて目には、内部ブロック図をSpringBoot:
<センター>图1 </センター>
我々は、すべて知っている、のSpringBoot Starter
構造原理の本質が自動的に設定されているので、図から分かるように1内部SpringBootソースプロジェクトをとStarter
その自動設定4つの関連モジュールがありますspring-boot-starters
、spring-boot-actuator-autoconfigure
、spring-boot-autoconfigure
とspring-boot-test-autoconfigure
。各モジュールの役割を見てくださいSpringBootソースモジュールと構造を分析する方法?記事ではなく、ここではそれらを繰り返します。
だから、spring-boot-starters
モジュールは自動的に3つの関連モジュールの背面に構成されたxxx-autoconfigure
、それが何であるかの関係モジュール?
この時点で、私たちは見てみましょうspring-boot-starters
構造は何モジュール内?
<センター>图2 </センター>
図2は、図1のから分かるspring-boot-starters
モジュール様々な特注SpringBootが含まstarter
:spring-boot-starter-xxx
。ビルトインSpringBootの様々なためstarter
いつもと、あまりにもspring-boot-starter-web
良い頼る探索するスタート。
私たちは、最初のを見てspring-boot-starter-web
、モジュールの内部構造:
<センター>图3 </センター>
あなたは見ることができるspring-boot-starter-web
唯一のモジュール内.flattened-pom.xml
とpom.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
ファイルの内容:
<センター>图4 </センター>
これは、図4で見ることができるspring-boot-starter-web
のモジュールの依存関係spring-boot-starter
、spring-boot-starter-tomcat
、spring-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-starter
pom.xml
spring-boot-autoconfigure
<センター>图5 </センター>
図5から分かるように、私たちの前にそれは、間違っていないと思われることがあるspring-boot-starter
依存モジュールspring-boot-autoconfigure
自動設定モジュール!したがって、ここで我々は結論付けることができます:spring-boot-starter-web
モジュールにはコードではありませんが、によってspring-boot-starter
モジュール間接的に依存してspring-boot-autoconfigure
その開始依存の機能を実現するために、自動設定モジュール。
この時、私たちは見てspring-boot-autoconfigure
モジュールパッケージの自動設定の内部構造:
<センター>图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
自動設定が有効である可能条件?
<センター>图7 </センター>
なお、図7に示されて、DispatcherServletAutoConfiguration
自動的に構成することができる条件の一つ@ConditionalOnClass(DispatcherServlet.class)
のみということclasspath
に存在しDispatcherServlet.class
、その後、クラスDispatcherServletAutoConfiguration
作業に自動構成ロジック。
そして、DispatcherServlet
このクラスがあるspring-webmvc
の下に示すように、依存関係ライブラリ:
<センター>图8 </センター>
この時点で、私たちは見てspring-boot-autoconfigure
モジュールpom.xml
を導入するために、ファイルspring-webmvc
の状況に依存します:
<センター>图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-web
pom.xml
図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-actuator
、spring-boot-starter-test
およびその他の組み込みspring-boot-starter-xxx
始めたの建設原則的には、あまりにも依存しますが、spring-boot-starter-actuator
依存しているspring-boot-actuator-autoconfigure
、spring-boot-starter-test
依存しているspring-boot-test-autoconfigure
モジュールの塗りつぶしが精巧ではありません。
思考:文書は20以上の任意の依存関係を導入し、なぜスタートのみ導入頼ることは、この依存関係を?
spring-boot-actuator-autoconfigure
pom.xml
spring-boot-starter-actuator
micrometer-core
5 SpringBoot模倣カスタムパッケージ構造スターター
様々な内蔵の以前の分析SpringBoot Starter
我々はカスタムでハンズオンを見て練習することができそうだとすれば、実務と理論、原則を構築するStarter
方がずっといい。
以下は、カスタム提供してStarter
簡単なのがDemo
、これは、Demo
完全に模倣SpringBoot
ビルトインStarter
パッケージの内部構造の書き込みに、SpringBootの詳細情報は、各種のために構築されたStarter
有用な構造原理。
ここでDemo
githubのアドレスと興味を持っている小さなパートナーにそれをお勧めします。
カスタムスターターの内部構造を模倣Springboot。また、カスタマイズする方法をStarter
、MyBatisのは、参照することができ、スプリング・ブート・スターター書かれています。
6まとめ
まあ、様々に建てSpringBoot Starter
この目的のために、分析の建設の原則は、今重要なポイントを要約します:
spring-boot-starter-xxx
コードに依存しないを開始しないが、上に直接的または間接的に依存xxx-autoconfigure
モジュール、xxx-autoconfigure
モジュールが取りspring-boot-starter-xxx
開始依存性の自動設定を実現します。xxx-autoconfigure
自動設定モジュールは、いくつかの任意の依存関係を導入し、これらの依存関係は任意に送信されていないspring-boot-starter-xxx
依存起動構成されているスタート依存、キー ;spring-boot-starter-xxx
スタート依存性が明示的にオプションの自動設定機能にいくつかの依存を紹介します。- 長い依存の導入として、手動でいくつかを作成することなく、箱から出して使用することができるよう上記で調製した3ステップの後、我々はこのプロジェクトを始めた
bean
というように。
オリジナルは、ヘルプ賛美聖歌を指して、容易ではありません!
著者は限られているとおりにエラーがテキストであった場合、また、あなたに感謝し、記入してください。
参考:
1、Mavenの依存を完全に理解推移
[ソース]は、学習の交流とともに、ノート公衆番号に注意を歓迎します。