2つの比較
- @ConfigurationProperties
@ConfigurationPropertiesを使用する場合、構成クラスのプロパティをyml設定ファイルにバインドする際、バインドしてIOCコンテナに注入するための@Componentアノテーションも追加する必要があります。@Componentを追加しないと無効になります。
- @EnableConfigurationProperties
@EnableConfigurationProperties の役割: @ConfigurationProperties アノテーションが付けられた構成クラスを有効にし、そのクラスを IOC コンテナに挿入し、管理のために IOC コンテナに渡します。この時点では、@Component を追加する必要はありません。構成クラスに。
実際のデモ
@ConfigurationProperties
構成クラスは次のとおりです。
@Component
@ConfigurationProperties(prefix = "demo")
@Data
public class DemoConfig {
private String name;
private Integer age;
}
yml設定ファイル
demo:
name: 张三
age: 20
テストコード
@Component
public class Test implements ApplicationRunner {
@Autowired
DemoConfig demoConfig;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(demoConfig);
}
}
構成クラスの @Component を削除するテスト
エラーは次のとおりです。
@EnableConfigurationProperties の使用
@Component
@EnableConfigurationProperties(DemoConfig.class)
public class Test implements ApplicationRunner {
@Autowired
DemoConfig demoConfig;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(demoConfig);
}
}
効果は次のとおりです。
@EnableConfigurationProperties が表示される理由
主な理由
SpringBoot での EnableAutoConfiguration の自動アセンブリ
結論から先に話しましょう
- EnableAutoConfiguration 自動アセンブリの機能。つまり、指定されたクラスをオブジェクトに構築し、それを Spring コンテナに入れて Bean オブジェクトにします。これは @Bean アノテーションに似ています。
- springboot が起動すると、プロジェクト内のすべての spring.factories ファイルがスキャンされます。
例を挙げる
- スプリングブートのデフォルトのスキャンパス
1. Springboot が起動すると、パス内のクラス ファイルをスキャンし、Bean 定義 BeanDefinition を生成し、Bean オブジェクトを作成する必要があります。デフォルトのスキャン パスは、起動クラスが配置されているディレクトリです。
2. 次のテスト ケースに示すように、
@Component が起動クラスが配置されているパッケージ ディレクトリ外のクラスに追加された場合でも、それらをスキャンして Bean オブジェクトを生成することはできません。
3. 起動クラスが配置されているパッケージ ディレクトリの外のクラスをスキャンして Bean オブジェクトを生成する場合は、起動クラスに @ComponentScan アノテーションを追加できます。
サードパーティの jar パッケージを導入します (これには Bean オブジェクトも含まれます)
1. ここでは、例としてローカルの自己パッケージ化された jar パッケージ (SDK) を使用します。
2. テスト SDK を準備します。
テスト プロジェクトに SDK を導入します。
3. テスト検証の実施
上の図からも分かるように、SDKを導入して使用するとBeanオブジェクトが見つからないと報告されますが、不思議なことにSDKのTestDemoBeanクラスに@Componentアノテーションが付いているのではありませんか?これは最初の点、springboot のデフォルトのスキャン パスに関連します。SDK の TestDemoBean パスは com.example.jardemo.xxxx で、テスト プロジェクトのスキャン パスは com.example.csdn です。スキャンできません。
4. 質問する
5. SDK を変更し、構成ファイル spring.factories を追加します。
再パッケージをウェアハウスに置き、インポートされた jar パッケージを忘れずに再ロードし、次のように spring.factories ファイルを確認します。
注意: SDK をパッケージ化するときに、リソース ディレクトリ内のファイルがパッケージ化されていないことに気付く人もいます。pom.xml ファイル構成を変更してください。
6. テスト コードをもう一度確認します。
まとめ
1. 上記の内容は主に次のことを言います: SDK を提供するときに、他の人がこの SDK の Bean オブジェクトを簡単に使用できるようにするために、その resource/META-INF ディレクトリに spring.factories ファイルを作成する必要があります。 EnableAutoConfiguration を使用して、Bean オブジェクトに変換する必要がある Bean オブジェクトを変換します。クラスは Bean オブジェクトになります。
2. これにより、他のプロジェクトが SDK を参照するときに、スタートアップ クラスにスキャンする必要があるパスを記述する必要がなくなります 3. 実際には、構成クラスでは
@ConfigurationProperties+@Component: を使用できますが、 (1)この
メソッドは、Spring が起動時にクラスの @Component をスキャンすると、それを Bean オブジェクトに変換します。また、このメソッドは SDK (サードパーティの JAR パッケージ) に含まれているため、 spring.factories PathのEnableAutoConfigurationに設定クラスを追加してspringでスキャンできるようにする必要がある
(2) そこで問題ですが、設定項目が多い場合はspring.factoriesのEnableAutoConfigurationが原因ではないでしょうかさらに、このタイプのパスは巨大で、次のようにメンテナンスが不便です。
したがって、この構成クラスには @EnableConfigurationProperties を使用できます。使用する必要がある構成クラスにこのアノテーションを追加すると、@EnableConfigurationProperties アノテーションで指定されたクラス オブジェクトに自動的にアノテーションが付けられ、Bean オブジェクトが作成され、Spring に書き込むことができなくなります。 . 工場は上記のとおりです。
4. 再パッケージして試してみる:
要約する
簡単に理解すると、
@ConfigurationProperties+@Component = @EnableConfigurationProperties となり、深く学ぶ人はこれを行うことで理解と印象をさらに深めることができます。職場では、どちらを使用するべきかという決まった方法はありません。ご自身の習慣に合わせてお使いいただけます。実用的な乾物を共有するための専用アカウント「Anqianmahou」です。コンテンツは継続的に更新されています。