2017-07-27 9 views
3

Springデータのさまざまな@EnableXXXRepositoryアノテーションを使用すると、リポジトリのメソッドの実装として使用されるリポジトリのカスタム基本クラスを指定できます。リポジトリベースクラスに依存関係を挿入する方法

ApplicationContextの他のBeanへのアクセスが必要な場合は、どのように注入するのですか? Spring Dataはそれらの基本クラス自体をインスタンス化し、特殊なストア依存のコンストラクタパラメータのみをサポートするため、そのままでは機能しません。

注:チャットでこの回答をthis now deleted questionに作成し、元の質問はなくても、他の人にとっては価値があると考えました。

答えて

4

@Enable...Repository注釈では、repositoryBaseClassrepositoryFactoryBeanClassを指定します。このように:示すように、それは、たとえば、あなたは、コンストラクタを介して注入SomeBeanのインスタンスを取得することができ、春の豆ですので、ので、そのRepositoryFactoryBeanクラスで

@EnableMongoRepositories(
    repositoryBaseClass = MyBaseClass.class, 
    repositoryFactoryBeanClass = MyRepositoryFactoryBean.class) 

、あなたは、通常の依存性注入を使用することができます以下:

public class MyRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable> extends MongoRepositoryFactoryBean<T,S,ID>{ 

    private final SomeBean bean; 

    public MyRepositoryFactoryBean(Class repositoryInterface, SomeBean bean) { 
     super(repositoryInterface); 
     this.bean = bean; 
    } 

} 

あなたRepositoryFactoryBean今 'getFactoryInstance' を上書きしてカスタムRepositoryFactoryのインスタンスを作成します。

@Override 
protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) { 
    return new MyMongoRepositoryFactory(operations, bean); 
} 

これを実行すると、注入するBeanを渡すことができます。上記の例ではbeanです。

そして、この工場は最終的にあなたのリポジトリベースクラスをインスタンス化します。おそらくそれを行うための最善の方法は、既存のファクトリクラスにすべてを委任し、ちょうどミックスに依存の注入を追加することです:

public class MyMongoRepositoryFactory extends MongoRepositoryFactory { 

    private final SomeBean bean; 

    MyMongoRepositoryFactory(MongoOperations mongoOperations, SomeBean bean) { 
     super(mongoOperations); 
     this.bean = bean; 
    } 

    @Override 
    protected Object getTargetRepository(RepositoryInformation information) { 
     Object targetRepository = super.getTargetRepository(information); 
     if (targetRepository instanceof MyBaseClass) { 
      ((MyBaseClass) targetRepository).setSomeBean(bean); 
     } 
     return targetRepository; 
    } 
} 

complete working example on Githubがあります。

関連する問題