@Enable...Repository
注釈では、repositoryBaseClass
とrepositoryFactoryBeanClass
を指定します。このように:示すように、それは、たとえば、あなたは、コンストラクタを介して注入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があります。