微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

dependency-injection – 如何将依赖项注入存储库基类

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(Repository@R_848_4045@ion @R_848_4045@ion) {
        Object targetRepository = super.getTargetRepository(@R_848_4045@ion);
        if (targetRepository instanceof MyBaseClass) {
            ((MyBaseClass) targetRepository).setSomeBean(bean);
        }
        return targetRepository;
    }
}

一个complete working example on Github.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐