Spring Bootは多くの標準の依存関係モジュールを提供することを学びました。開発者が関連する依存関係をMaven pomファイルに追加する限り、Spring Bootは必要なSpring Beanを自動的に作成し、このアプリケーションのコンテキストに挿入します。
この記事では、FreeMarkerの自動構成を例に取り、動作原理とロードプロセスの説明に焦点を当てます。FreeMarkerは比較的単純であるため、Spring Bootソースコードには3つのクラスしかないため、ケースとして理解するのは比較的簡単です。
EnableAutoConfigurationは何をするのに役立ちますか?
@EnableAutoConfigurationアノテーションを覚えていますか?
最初に確認しましょう。
@RestController
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.lianggzone.springboot" })
public class WebMain {
public static void main(String[] args) throws Exception {
SpringApplication.run(WebMain.class, args);
}
}
そこで、@ EnableAutoConfigurationのソースコードを分析します。
ここで重要なのは、@ ImportアノテーションによってインポートされたインポートautoimportImportSelectorクラスが最も重要なことであり、getCandidateConfigurationsメソッドのSpringFactoriesLoader.loadFactoryNamesを通じてspring.factoriesファイルをスキャンすることです。
ここで、SpringFactoriesLoaderのソースコードを調べています。
突然、spring.factoriesファイルが非常に重要であることに気付きましたか?そうです、Spring Bootはこのファイルの内容をスキャンして、使用可能な自動構成を判別します。FreeMarkerを例にして、それがどのように構成されているかを見てみましょう。
したがって、Spring Bootは、EnableAutoConfigurationパラメーターのSpring.factoriesファイルをスキャンして自動構成を行い、ロードします。
ここの構成パラメーターclass-FreeMarkerProperties
構成パラメーターは、application.propertiesで直接設定できます。その接頭辞はspring.freemarkerでなければならないことがわかりました。
自動構成クラス-FreeMarkerAutoConfigurationの
コアアノテーションは
、「スプリングブートの説明と実用的なソースコード分析-箱から出して、組み込みのミステリー」で言及されており、@ ConditionalOnClassパラメータの対応するクラスは、クラスパスディレクトリに存在する場合にのみ解決されることが言及されています構成クラス。それ以外の場合、アノテーションによって変更された構成クラスは解析されません。
Spring Bootは、RedisAutoConfiguration、MongoRepositoriesAutoConfiguration、ElasticsearchAutoConfigurationなど、多くの自動構成クラスを提供します。これらの自動構成クラスは、必要なクラスがクラスパスに存在するかどうかを判別します。存在する場合は、関連する構成を自動的に構成します。それ以外の場合は、構成しません。自動構成、したがって、開発者が関連する依存関係をMavenのpomファイルに追加した後、これらの依存関係は多くのjarパッケージをクラスパスにダウンロードします。これらのライブラリを使用すると、自動構成がトリガーされるため、簡単に使用できます。モジュールの機能の。
さらに、メインのアノテーション@EnableConfigurationPropertiesがあります。これは主に、前述の構成パラメータークラスをロードするために使用されます。
Bean
のソースコードを挿入するのは非常に理解しやすいので、主に2つの注意点について説明します。
最初のアノテーションは@ConditionalOnMissingBean(name = "freeMarkerViewResolver")で、コンテナがBeanを指定していない場合の処理を指定します。
2番目のコメントは、@ ConditionalOnPropertyであり、指定されたプロパティに指定された値があるかどうか、つまり、application.propertiesに構成がない場合、デフォルトはtrue、つまり条件が満たされます。