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

6
Spring Data的各种@EnableXXXRepository注释允许您为存储库指定自定义基类,该基类将用作存储库中方法的实现。如果这样的基类需要访问ApplicationContext中的其他bean,如何注入它们?这不是开箱即用的,因为Spring Data自己实例化这些基类,仅支持特殊的存储库相关构造函数参数。注意:我在聊天中创建了这个答案this now deleted question,尽管原始问题已经删除,但我认为这可能对其他人有价值。
1个回答

9
@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现在通过覆盖“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;
    }
}

在Github上有一个完整的工作示例,请点击链接


它的工作非常好,但是在MyRepositoryFactoryBean的构造函数中如何注入SomeBean而不使用@Autowire注释呢? - ihebiheb
1
谢谢你,我终于能够让它工作了。此外,这也是我厌恶Spring的原因——为了获取一个对象引用而需要跳过这么多麻烦的步骤,这实在是疯狂的。 - Madbreaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接