在@Enable...Repository
註釋中指定repositoryBaseClass
和repositoryFactoryBeanClass
。就像這樣:
@EnableMongoRepositories(
repositoryBaseClass = MyBaseClass.class,
repositoryFactoryBeanClass = MyRepositoryFactoryBean.class)
在這種RepositoryFactoryBean
類,你可以正常使用依賴注入,因爲它是一個Spring bean,因此,舉例來說,你可以通過構造注入的SomeBean
一個實例,如圖所示如下:
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。