目次
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 ビデオ アカウントをプレイしましょう!