dependency-injection – 如何将依赖项注入存储库基类
发布时间:2020-12-14 04:55:27 所属栏目:百科 来源:网络整理
导读:Spring Data的各种@EnableXXXRepository注释允许您为存储库指定自定义基类,这些基类将用作存储库中方法的实现. 如果这样的基类需要访问ApplicationContext中的其他bean,那么如何获取这些注入?它没有开箱即用,因为Spring Data实例化了这些基类本身,只支持特
Spring Data的各种@EnableXXXRepository注释允许您为存储库指定自定义基类,这些基类将用作存储库中方法的实现.
如果这样的基类需要访问ApplicationContext中的其他bean,那么如何获取这些注入?它没有开箱即用,因为Spring Data实例化了这些基类本身,只支持特殊的存储依赖构造函数参数. 注意:我在this now deleted question的聊天中创建了这个答案,并认为它可能对其他人有价值,尽管最初的问题已经消失. 解决方法
在@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,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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |