Jen*_*der 4 dependency-injection spring-data
@EnableXXXRepositorySpring Data 的各种注释允许您为存储库指定自定义基类,这些基类将用作存储库中方法的实现.
如果这样的基类需要访问其他bean,那么ApplicationContext如何获取注入?它没有开箱即用,因为Spring Data实例化了这些基类本身,只支持特殊的存储依赖构造函数参数.
注意:我在聊天中创建了这个现在已删除的问题的答案,并认为它可能对其他人有价值,尽管最初的问题已经消失.
在@Enable...Repository注释中指定a repositoryBaseClass和repositoryFactoryBeanClass.像这样:
@EnableMongoRepositories(
repositoryBaseClass = MyBaseClass.class,
repositoryFactoryBeanClass = MyRepositoryFactoryBean.class)
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
您RepositoryFactoryBean现在RepositoryFactory通过覆盖'getFactoryInstance'来创建自定义的实例.
@Override
protected RepositoryFactorySupport getFactoryInstance(MongoOperations operations) {
return new MyMongoRepositoryFactory(operations, bean);
}
Run Code Online (Sandbox Code Playgroud)
这样做时,它可以传递要注入的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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |