2

Spring Data JPA (Tomcat 7) を使用するプロジェクトに取り組んでいます。BeanFactoryPostProcessorを動的に作成するために を実装していますDataSource。しかし問題は、私DataSourceの情報 (名前、URL など) がデータベース自体に保存されていることです。

@Component 
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 

  // This doesn't work
  @Autowired DatabaseService databaseService;

  public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    // my code here ...
    // ...
  }
}

ご覧のとおりDataSource、データベースからすべての のリストを取得できるサービスを挿入しようとしましたが、機能しません。データベースに接続してBeanFactoryPostProcessorクラス内でそのリストを取得する方法はありますか? 他の回避策は大歓迎です。:)

4

1 に答える 1

0

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
      }
    }
    
于 2014-10-07T20:15:33.487 に答える