BeanFactoryPostProcessors は、Spring の非常に特別な種類の概念です。これらはインスタンス上で動作するコンポーネントであり、作成されるBeanDefinitionBean インスタンスのメタモデルです。
つまり、BFPPs が呼び出された時点では、メタモデルが後処理されようとしているため (名前が示すように)、Bean インスタンスはまだ作成されていません。したがって、依存する Beanは、コンテナーのライフサイクルの非常にBFPP早い段階で初期化されます。したがって、 のアプリケーション コンポーネントに依存しないこと、または本当に必要な場合は、多くのダウンストリーム コンポーネントの作成を必ずしもトリガーしない Bean のみに依存することを強くお勧めします。BFPP
とは言っBFPPても、通常は多くのインフラストラクチャ コンポーネントを作成する必要があるため、特に s のリポジトリに依存するべきではありません。構成データベース (JDBC URL、ユーザー名、パスワードなど) に接続するために必要な構成プロパティを取得し、使用される新しいものを作成するためだけに使用される使い捨てを作成することをお勧めしますDataSource。最終的にアプリケーションによって。BeanDefinitionDataSource
したがって、推奨される手順は次のとおりです(頭のてっぺんから-微調整が必要な場合があります):
- の自動配線を削除します
DataSource
@PropertySource接続する座標を含むプロパティへのポイントを構成します
その値をPropertySourceのコンストラクターに挿入しBFPPます。
class YourBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public YourBeanFactoryPostProcessor(@Value("#{properties.url}) String url, …) {
// assign to fields
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 1. Create throw-away DataSource
// 2. Create JdbcTemplate
// 3. Use template to lookup configuration properties
// 4. Create BeanDefinition for DataSource using properties just read
// 5. Register BeanDefinition with the BeanFactory
}
}