2017-07-27 44 views
3

Spring Data的各种@EnableXXXRepository注释允许您为存储库指定一个自定义基类,该类将用作存储库中方法的实现。如何将依赖项注入存储库基类

如果这样的基类需要访问ApplicationContext中的其他bean,如何获得这些注入?它不能直接使用,因为Spring Data自身实例化了这些基类,仅支持特殊的存储相关构造函数参数。

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

回答

4

@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; 
    } 
} 

有一个complete working example on Github