マッド神はもちろんのSpringBootシリーズはSpringBoot2.2.5バージョンに基づいて、ピンク歓迎注意怒っを学ぶために転送され、理解しやすい、と述べました。
マイクロチャンネル公衆数は:マッド神は言った(開始) 嗶哩嗶哩:マッド神は言ったJava(ビデオ)
作者の許可なしに転載を禁止されています
動作原理お問い合わせ
我々はHelloSpringBootを書き、最後にそれを実行する方法である、Mavenプロジェクトの前に、私たち一般のpom.xmlファイル掘り下げから。
pom.xml
父依存性
それは親プロジェクトに主に依存している場合は、主にフィルタやプラグインの管理プロジェクトリソース!
< 親> < groupIdを> org.springframework.boot </ groupIdを> < たartifactId >春・ブート・スターター・親</ たartifactId > < バージョン> 2.2.5.RELEASE </ バージョン> < relativePath /> <! - 検索リポジトリから親- > </ 親>
依存親があることを見出し、それへのポイント、
< 親> < groupIdを> org.springframework.boot </ groupIdを> < たartifactId >春ブート依存関係</ たartifactId > < バージョン> 2.2.5.RELEASE </ バージョン> < relativePath > ../../spring-ブート依存関係</ relativePath > </ 親>
ここでは、実際の管理は、ローカルバージョン、コントロールセンターのSpringBootのバージョンに依存するすべてのアプリケーションをSpringBootです。
私たちはインポートした後の依存は、デフォルトのバージョンを記述する必要はありませんが、インポートされたパッケージは、手動で構成バージョンへの必要性に依存して管理されていない場合。
スターター春ブートスターター
< 依存> < groupIdを> org.springframework.boot </ groupIdを> < たartifactId >春・ブート・スターター・ウェブ</ たartifactId > </ 依存関係>
-theブートスターター-springboot xxxは:springbootシーンスターターです
スターター-ブーツ-春のWeb:Webモジュールが依存正常に動作して助けに私たちをアセンブリを導入し;そして
、シーンが抽出されているすべての機能をSpringBootスターターの数(スターター)を作った我々は唯一のプロジェクトでこれらのスターターを導入する必要があり、すべての関連の輸入に依存します、我々は、インポート機能を使用してどのような種類のですシーンスターターができます。私たちの未来はまた、独自のスターターをカスタマイズすることができます。
マスター・ブート・クラス
分析のpom.xmlオーバー起動クラスを見て
デフォルトのプライマリ起動クラス
// @SpringBootApplicationは、メインクラスマークする // 説明をこれで春ブートアプリケーション @SpringBootApplication パブリック クラスSpringbootApplication { 公共の 静的な 無効メイン(文字列[] args)を{ //は私が開始するために期待していなかった、それが起動するための方法だと思いましたサービス SpringApplication.run(SpringbootApplication。クラス、引数); } }
しかし、単純な起動クラスは容易ではありません!のは、これらの注釈が何を行っている分析してみましょう
@SpringBootApplication
役割:このクラスのクラスのマーキングの説明はSpringBootのメインクラス構成で、SpringBootはSpringBootアプリケーションを起動するには、このクラスのmainメソッドを実行する必要があります。
このコメントを入力してください:あなたは上記を参照することができ、他の多くのノートがあります!
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( タイプ = FilterType.CUSTOM、 クラス = {TypeExcludeFilter。クラス} )、@Filter( タイプ = FilterType.CUSTOM、 クラス = {AutoConfigurationExcludeFilter。クラス} )} ) パブリック @ インタフェースSpringBootApplication { // ... }
@ComponentScan
このコメントは、XMLコンフィギュレーションの要素に対応春、で非常に重要です。
アクション:自動的にスキャンし、ロードコンポーネントまたは資格Beanは、Bean定義は、容器IOCにロードされます
@SpringBootConfiguration
アクション:SpringBootの設定クラス、クラスのラベルには、このクラスSpringBoot構成であることを示しています。
私たちは、この注釈付きビューに行くし続けます
// 以下@Componentに得られる点 @Configuration パブリック @ インタフェースSpringBootConfiguration {} @Component パブリック @ インタフェース構成{}
@Configurationここで、これは、構成のような構成であり、対応するスプリングXML構成ファイルです。
これは@Component内部を説明し、クラス自体も、それはアプリケーションを起動するための責任がある春のコンポーネントです開始します!
私たちは、SpringBootApplication注釈を振り返る続けています。
@EnableAutoConfiguration
@EnableAutoConfiguration:自動設定機能をオンにします
私たちは、自分のものを設定する必要がありますが、今SpringBootは自動的に設定するために私たちを助けることができる前に、有効にするには、自動設定機能で自動設定をSpringBootターンを伝える@EnableAutoConfiguration。
[表示]をクリックスルーの注意事項は以下のとおりです。
@AutoConfigurationPackage:自動構成パッケージ
@import({レジストラ。クラス}) パブリック @ インタフェースAutoConfigurationPackage { }
@import:春底注釈@import、容器アセンブリに導入
Registrar.classアクション:パッケージには、次のクラスとサブパケットの全てがコンテナ春内のすべてのコンポーネントをスキャンするマスターブートパッケージ。
この分析は、オーバー前のステップに後退され、外観に続けます
@import({AutoConfigurationImportSelector.class}):容器アセンブリに導入。
AutoConfigurationImportSelector:自動設定のインポートセレクタ、それはコンポーネントがそれをインポートセレクタのだろうか?私たちは、ソースコードを見に行った、このクラスをクリックしてください:
図1に示すように、このクラスは、このような方法を有しています
// 設定候補を取得し 、保護リスト<文字列> getCandidateConfigurations(AnnotationMetadataメタデータ、AnnotationAttributes属性){ // getSpringFactoriesLoaderFactoryClass()メソッド // リターンを私たちは、インポート設定ファイルの先頭に自動的に注釈付きクラスが開始された参照点である。EnableAutoConfiguration 一覧<文字列>設定= SpringFactoriesLoader.loadFactoryNames(この .getSpringFactoriesLoaderFactoryClass()、この.getBeanClassLoader()); Assert.notEmpty(構成、。「いいえ自動設定クラスはMETA-INFで見つかっ/、あなたがAカスタムパッケージされている場合は使用してspring.factoriesファイルは、makeという正しい確かです」。); 戻り値の設定; }
図2は、このターンでは、静的メソッドSpringFactoriesLoaderクラスを呼び出します!私たちは、SpringFactoriesLoaderクラスloadFactoryNames()メソッドを入力します。
公共の 静的リストの<string> loadFactoryNames(<?>クラスfactoryClass、@NullableのClassLoaderクラスローダー){ 文字列factoryClassName = factoryClass.getName()。 // 这里它又调用了loadSpringFactories方法 リターン(一覧)loadSpringFactories(クラスローダー).getOrDefault(factoryClassName、Collections.emptyList()); }
図3は、我々はloadSpringFactories方法をクリックし続けます
プライベート 静的な地図<文字列、リスト<文字列>> loadSpringFactories(@Nullableクラスローダクラスローダが){ // クラスローダを取得し、我々はここで取得するためのリターンを見ることができることはEnableAutoConfigurationクラスが自身をマークしている MultiValueMap <文字列、文字列>結果= (MultiValueMap)キャッシュ.get(クラスローダー); IF(!結果= nullを){ 返す検索結果を; } 他{ 試み{ // リソース"META-INF / spring.factories"を取得する 列挙=クラスローダのURL = <のURL>!nullのクラスローダ?。 getResources( "META-INF / spring.factories "):ClassLoader.getSystemResources(「META-INF /スプリング。工場」); LinkedMultiValueMap結果 = 新しい新LinkedMultiValueMap(); // 読み取りトラバーサルリソース、プロパティとなっパッケージ しばらく(urls.hasMoreElements()){ URL URL = (URL)urls.nextElement(); UrlResourceリソース = 新しい新しいAのUrlResource (URL); プロパティプロパティ = PropertiesLoaderUtils.loadProperties(リソース); イテレータvar6 = properties.entrySet()イテレータ();. 一方(var6.hasNext()){ エントリ <?、> =エントリ(エントリ)var6.next (); ストリングfactoryClassName = ((文字列)entry.getKey())(トリム)。 文字列[] var9 = StringUtils.commaDelimitedListToStringArray((文字列)entry.getValue())。 int型 var10 = var9.length。 用(INT var11 = 0; var11 <var10; ++ var11){ 文字列factoryName = var9 [var11]。 result.add(factoryClassName、factoryName.trim())。 } } } cache.put(クラスローダ、結果)。 戻り値の結果; }キャッチ(のIOExceptionのvar13){ スロー 新しい( "[META-INF / spring.factories]位置から負荷工場にできません"、IllegalArgumentExceptionを、var13)。 } } }
spring.factories:4は、ファイルの複数の発生見つけ、グローバル検索を
spring.factories
自動的に根本的な原因を構成している。私たちのオープンソースspring.factoriesによると、我々は自動的に設定ファイルをたくさん見ました!
WebMvcAutoConfiguration
WebMvcAutoConfiguration:私たちは、自動的にちょうど例のためのオープンな外観を、見つけるために、上記のクラスで構成されました
一つは、あなたが慣れるために探して、自分自身の理解のいくつかの種類を見つけることができ、これらはJavaConfigの設定クラスであることを見ることができる、といくつかの豆を注入しています!
したがって、検索は自動的に実パスから全てのMETA-INF / spring.factoriesプロファイルを構成し、前記対応org.springframework.boot.autoconfigure。構成アイテムバッグの下、反射によってマーク対応するインスタンスに次いで、凝集され、IOCコンテナのインスタンスにロードされるコンテナ設定IOCクラスのJavaConfig @Configuration形。
結論:
-
SpringBoot EnableAutoConfigurationは、META-INFで指定された値を取得する/起動時にクラスパスをspring.factories
-
これらの値は自動的に血管内にクラスとして構成され、クラスが自動的に私たちを助けるために仕事に自動設定のために設定が有効になります。
-
J2EE全体の総合的なソリューションと自動構成が瓶にspringboot、自動構成されています。
-
それは、このシナリオでは、コンテナに必要なすべてのコンポーネントをインポートし、これらのコンポーネントを構成することで自動設定クラス(xxxAutoConfiguration)輸入コンテナの多くを与えるだろう。
-
自動コンフィギュレーション・クラスと、手動で我々は機能部品そのような作業を注入する構成を記述する必要がなくなります。
今、私たちは、おそらく我々は、後に再び深まる、SpringBoot、下の動作原理を理解する必要があります!
SpringApplication
簡単な方法
私が最初にmainメソッドを実行していると思ったが、サービスを開くために期待していませんでした。
@SpringBootApplication パブリック クラスSpringbootApplication { 公共 静的 ボイドメイン(文字列[]引数){ SpringApplication.run(SpringbootApplication。クラス、引数)。 } }
SpringApplication.run分析
二つの部分、SpringApplicationがインスタンス、第一次の分析方法は、実行する方法です。
SpringApplication
このクラスは、次の4つのことを行うために、主に次のとおりです。
1は、アプリケーションの種類推論一般的なプロジェクトまたはWebプロジェクトであります
初期化子に利用可能なすべての初期化、属性セットを見つけてロードする2、
3、すべてのアプリケーションのリスナーを見つけ、リスナーにプロパティを設定します
4、推論及びメインメソッドのクラス定義が提供され、動作はメインクラスを見つけるために
ビューのコンストラクタ:
公共SpringApplication(ResourceLoader resourceLoader、クラス... primarySources){ // ...... この .webApplicationType = WebApplicationType.deduceFromClasspath(); この .setInitializers(この.getSpringFactoriesInstances(); この .setListeners(この .getSpringFactoriesInstances(ApplicationListener。クラス)); この .mainApplicationClass = この.deduceMainApplicationClass(); }
実行フロー分析法
この写真は、ソースコードと一緒にして見つけることができます!