構成クラス (@Configuration の下にあるこのクラス) は、実際には @ マークが付いたファクトリと同等です。 Bean アノテーションのメソッドはファクトリ メソッドと同等です。
次の例を考えてみましょう。
@Configuration // 注意点1: 配置类其实相当于一个工厂, 标注 @Bean 注解的方法相当于工厂方法 static class MyConfig { @Bean public Bean1 bean1() { System.out.println("bean1()"); return new Bean1(); }
将来 Bean1 のインスタンスを生成したい場合の場合は、まず myConfig Bean というインスタンス (これはファクトリです) を見つけてから、このファクトリ内で「bean1」というメソッドを呼び出して Bean1 オブジェクトを生成する必要があります。
静的変更のない @Bean ファクトリ メソッド (インスタンス ファクトリと呼ばれる) の場合、最初に構成クラス myConfig のインスタンスを作成する必要があります。静的変更のあるものは静的メソッドであり、myConfig のクラス オブジェクトを取得するだけで済みます。 、そして直接、方法だけです。
@Bean はメソッドのオーバーロードをサポートしていません。オーバーロードされたメソッドが複数ある場合、ファクトリ メソッドとして選択できるのは 1 つだけです
@Configuration @MapperScan("aaa") // 注意点1: 配置类其实相当于一个工厂, 标注 @Bean 注解的方法相当于工厂方法 static class MyConfig { // 注意点2: @Bean 不支持方法重载, 如果有多个重载方法, 仅有一个能入选为工厂方法 @Bean public Bean1 bean1() { System.out.println("bean1()"); return new Bean1(); } @Bean public Bean1 bean1(@Value("${java.class.version}") String a) { System.out.println("bean1(" + a + ")"); return new Bean1(); } @Bean public Bean1 bean1(@Value("${java.class.version}") String a, @Value("${JAVA_HOME}") String b) { System.out.println("bean1(" + a + ", " + b + ")"); return new Bean1(); }
オーバーロードされたメソッドがある場合メソッドでは、パラメータに注入する必要がある値が多いほど、優先度が高くなります。
@デフォルトでアノテーションが付けられたクラスに対してプロキシが生成されるため、設定を簡単に削除することはできません。目的は、@Bean メソッドが相互に呼び出すときに、そのシングルトンが確実に削除されるようにすることです。特性は引き続き保証されます
#@Configuration BeanFactory ポストプロセッサがある場合、インスタンス ファクトリ メソッドによって MyConfig が事前に作成され、依存関係の注入が失敗します。解決策は、静的ファクトリ メソッドを使用するか、直接 @Bean のメソッド パラメータの依存性注入については、MapperScanner の代わりにアノテーション メソッドを使用できます
@SpringBootApplication は、 @ComponentScan、@EnableAutoConfiguration、および @SpringBootConfiguration で構成される結合アノテーション:
通常の @Configuration と比較した場合、@SpringBootConfiguration と通常の @Configuration の唯一の違いは、前者ではアプリ全体で 1 回だけ出現する必要があることです。メイン構成クラスはそれに基づいて決定する必要があり、プログラム全体への入り口はメイン構成クラスに基づいて見つけることができるためです
@ComponentScan:コンポーネント スキャン
excludeFilters - に使用されます。コンポーネントのスキャン中に除外し、自動構成クラスも除外します。
@EnableAutoConfiguration は、次のアノテーションで構成される結合アノテーションでもあります
@AutoConfigurationPackage – スキャンの開始パッケージを記憶するために使用されます。は、それによってマークされたクラスが記録されているパッケージ
@Import(AutoConfigurationImportSelector.class) META-INF/spring.factories のロードに使用される自動構成クラス (自動構成クラスとは、メインの構成クラスが構成されていないため、自動構成クラスが使用されます)
@Import を使用して自動構成クラスを直接導入しない理由
理由は 2 つあります:
メイン構成クラスと自動構成クラスを強く結合させます。メイン構成クラスは、どのようなスレーブ構成があるかを認識すべきではありません。
@Import (自動構成クラス) を使用します。 .class) を直接使用します。導入された構成解析の優先順位が高くなります。メイン構成が提供されていない場合は、自動構成クラスの解析をデフォルト構成として使用する必要があります。
したがって、 @Import(AutoConfigurationImportSelector.class)
AutoConfigurationImportSelector.class から
META-INF/spring.factories を読み取るために使用されます。 のクラスは弱い結合を実装します。
AutoConfigurationImportSelector.class は DeferredImportSelector インターフェイスを実装し、自動構成の解析がメイン構成の解析より遅くなるようにします
以上がSpringboot 自動構成と @Configuration 構成クラス インスタンスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。