2017-07-27 47 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