Spring Boot 2 の自動構成原理

目次

1. @AutoConfigurationPackage アノテーションの機能は何ですか?

2. @Import(AutoConfigurationImportSelector.class) は何をしているのですか?

3. Spring MVC は Spring Boot で自動構成をどのように実装しますか?


Spring Boot を使用したことがあるハンサムな人なら、アプリケーションのスタートアップ クラスに@SpringBootApplicationアノテーションがある限り、それは Spring Boot アプリケーションであり、必要な Bean が自動的に設定されることを知っています。どうやってやったのですか?

唯一の手掛かりは @SpringBootApplication アノテーション自体です。Ctrl キーを押しながらクリックしてこの注釈を開くと、他の 3 つの注釈 (@Target とその他のメタ注釈を除く) がアタッチされていることがわかります。そのうちの 1 つは @EnableAutoConfiguration が調査対象の自動構成に関連しており、自動構成が開きます。プロジェクト全体のスイッチの設定。

このアノテーションにより自動構成がどのように可能になるのでしょうか? 続けて Ctrl キーを押しながらクリックして @EnableAutoConfiguration 注釈を開くと、2 つの注釈が添付されていることがわかります。

そこに秘密があるようです。これら2 つの注釈を注意深く研究する必要があります。最初のものをチェックしてください!

1. @AutoConfigurationPackage アノテーションの機能は何ですか?

この注釈をクリックすると、他には何もないことがわかりますが、AutoConfigurationPackages.Registrar という名前の内部クラスがインポートされています。

Registrar クラスをクリックすると、Spring フレームワークの ImportBeanDefinitionRegistrar インターフェイスが実装されていることがわかります。実装されている registerBeanDefinitions() は、起動時に Spring によって呼び出されます。register() メソッドは、メソッド名が何を登録しているかを確認するために registerBeanDefinitions() で呼び出されるのだと思います。>_>

register() メソッドの複雑な操作を見てみましょう。このコードが理解できないのですか? デバッグするには、ここにブレークポイントを作成する必要があります。

このコードを見て、そのコードを通してBeanを作成します。タイプはBasePackage (基本パッケージ)です。このプロジェクトの基本パッケージ名はcn.itripに設定し、最後にSpring IoCコンテナにBeanを登録します。Beanの名前はorgです。 .springframework.boot.autoconfigure.AutoConfigurationPackages。実際、これは Spring の IoC コンテナに Bean を登録する別の方法であり、クラスに @Service および @Component アノテーションを追加するのと同じ効果があります。

要約すると、 @AutoConfigurationPackage アノテーションの主な目的は、自動的に構成する必要があるパッケージのコレクションに cn.itrip パッケージを追加することです。Spring Boot プロジェクトのスタートアップ クラスが配置されている同じレベルのパッケージが、ここで追加されたエントリである Bean を自動的に構成するのも不思議ではありません。

2. @Import(AutoConfigurationImportSelector.class) は何をしているのですか?

まず、Spring フレームワークによって提供される ImportSelector インターフェイスは、@Configuration アノテーションが付けられたクラスを選択的にインポートするために使用されることを理解する必要があります。ここでインポートされた AutoConfigurationImportSelector クラスは ImportSelector インターフェイスを実装しているため、その process() は起動時に Spring フレームワークによって呼び出されます。

上のデバッグのスクリーンショットを見てください。左下隅はスレッド スタックの呼び出しパスで、呼び出しの順序は process() -> getAutoConfigurationEntry() -> getCandidateConfigurations() です。途中で何が起こるかは気にしませんが、 getCandidateConfigurations() メソッドに到達すると、ここに Assert アサーションがあることがわかり、自動構成クラスが META に見つからないというエラー メッセージが表示されます。 INF/spring.factories ファイル。

このメソッドをさらに追跡すると、SpringFactoriesLoader.loadFactoryNames() ->loadSpringFactories() が呼び出され、実際に META-INF/spring.factories にロードされます。では、このファイルの中の宝物は何でしょうか?このファイルを開いて確認してください。このファイルは Spring Boot の自動構成 jar パッケージ内にあります。

spring.factories ファイルには、Spring が統合できるさまざまなモジュール、サードパーティのフレームワーク、またはミドルウェアの自動構成クラスがリストされており、クラス名はすべてXxx AutoConfiguration の形式になっていることがわかりますこれらの Xxx AutoConfigurations は実際には同じ jar パッケージ内にあり、インポートされたモジュールおよびサードパーティ フレームワークの Bean の自動構成を担当します。

その方法として、Web プロジェクトで一般的に使用される SpringMVC フレームワークを例に挙げてみましょう。

3. Spring MVC は Spring Boot で自動構成をどのように実装しますか?

Spring Boot で Spring MVC フレームワークを使用するには、spring-boot-starter-web スターターをインポートするだけでよいことがわかっています。従来の Spring XML では非常に多くの Bean を設定する必要がありましたが、もうそれらを設定する必要はありません。これが自動設定の理由でしょうか? 前のセクションに従って、まず spring.factories ファイル内の Web の自動構成と、どの自動構成クラスがリストされているかを確認します。

経験によれば、名前を見て最初に推測すると、Spring MVC のフロントエンド コントローラー DispatcherServlet は、上の赤いボックス内の最初の DispatcherServletAutoConfiguration クラスによって作成されるはずです。確認するには、DispatcherServletAutoConfiguration クラスを開いて確認してください。

最初に、クラスに関するいくつかの注釈が表示されます。

  • @AutoConfigurationOrder アノテーションは、最初に実行される実行順序を指定します。
  • @Configuration アノテーションは、このクラスを使用して @Bean でさまざまなファクトリ メソッドを定義できることを示します。
  • @ConditionOnWebApplication アノテーションは、このクラスの Bean が Web プロジェクト環境でのみ構成されることを示します。
  • @ConditionOnClass(DispatcherServlet.class) は、Spring MVC パッケージの依存関係をインポートする場合にのみこのクラスの Bean が設定されることを示します (DispatcherServlet クラスはクラスパスで検索できます)。
  • @AutoConfigureAfter アノテーションは、このクラスの Bean を構成するには、まず ServletWebServerFactoryAutoConfiguration クラスの Bean を作成する必要があることを指定します。

上記のコードの定数からわかるように、自動的に構成されたフロント コントローラー、IoC コンテナー内の Bean 名は、dispatcherServlet とも​​呼ばれます。

もちろん、Spring MVC の自動構成について説明しなければならないクラスがもう 1 つあります。それは、  WebMvcAutoConfigurationクラスです。従来の Spring MVC が XML で設定する必要があるビュー パーサーやメッセージ コンバーターなどの Bean はすべて、この自動設定クラスで作成されます。

毎日コードを書くのはとても退屈なので、一緒に WeChat ビデオ アカウントをプレイしましょう!

 

おすすめ

転載: blog.csdn.net/liudun_cool/article/details/108193207