如何将依赖项注入存储库基类

时间:2017-07-27 08:28:11

标签: dependency-injection spring-data

Spring Data的各种@EnableXXXRepository注释允许您为存储库指定自定义基类,这些基类将用作存储库中方法的实现。

如果这样的基类需要访问ApplicationContext中的其他bean,那么如何注入这些bean?它没有开箱即用,因为Spring Data实例化了这些基类本身,只支持特殊的存储依赖构造函数参数。

注意:我在与this now deleted question的聊天中创建了这个答案,并认为它可能对其他人有价值,尽管最初的问题已经消失。

1 个答案:

答案 0 :(得分:6)

@Enable...Repository注释中指定repositoryBaseClassrepositoryFactoryBeanClass。像这样:

@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现在通过覆盖&#39; getFactoryInstance&#39;来创建自定义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