首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Data:将多个存储库接口集成到一个“存储库”服务类中

Spring Data:将多个存储库接口集成到一个“存储库”服务类中
EN

Stack Overflow用户
提问于 2016-11-24 15:44:10
回答 2查看 13.6K关注 0票数 6

由于数据库的设计,我有相当多的JpaRepository扩展存储库接口。

为了构造一个简单的对象,即Person,我必须对大约4-5个存储库进行方法调用,因为数据是这样分布在整个数据库中的。类似这样的代码(请原谅伪代码):

代码语言:javascript
复制
@Service
public class PersonConstructService {

    public PersonConstructService(Repository repository,
                                  RepositoryTwo repositoryTwo,
                                  RepositoryThree repositoryThree) {

        public Person constructPerson() {
            person
                .add(GetDataFromRepositoryOne())
                .add(GetDataFromRepositoryTwo())
                .add(GetDataFromRepositoryThree());

            return person;
        }

        private SomeDataTypeReturnedOne GetDataFromRepositoryOne() {
            repository.doSomething();
        }

        private SomeDataTypeReturnedTwo GetDataFromRepositoryTwo() {
            repositoryTwo.doSomething();
        }

        private SomeDataTypeReturnedThree GetDataFromRepositoryThree() {
            repositoryThree.doSomething();
        }
    }
}

PersonConstructService类使用所有这些接口来构造一个简单的Person对象。我从PersonConstructService类内部的不同方法调用这些存储库。我考虑过将这个类扩展到多个类中,但我不认为这是正确的。

相反,我想使用一个包含创建Person对象所需的所有存储库的repositoryService。这是一种好的方法吗?在Spring中有可能吗?

我问的原因是,有时注入到一个类中的服务的数量大约是7-8个。这绝对不是什么好事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-24 20:27:42

我认为你不能/不应该创建一个像抽象这样的元库。存储库有一个定义良好的含义,从概念上讲,它们是Hibernate/JPA/Datastore实体的CRUD服务(有时甚至更多:-)。我想这对他们来说已经足够了。任何更多的东西都是令人困惑的。

现在我要提出的是一种“智能”的方式来构建你的" Person“对象,它能够自动感知任何对Person对象的意义有贡献的新服务。

问题的症结在于:

service你可以让你的存储库实现一个给定的接口,比如说

  • ,它有一个方法,比如说PersonDataProvider,它会让你的@实现
  • 的BeanFactoryPostProcessor接口,允许你检查容器中所有这样的PersonDataProvider实例,并将它们注入到你的服务中(请参阅How to collect and inject all beans of a given type in Spring XML configuration)
  • Your @BeanFactoryPostProcessor实现中的公认答案,然后依次要求所有的PersonDataProvider贡献他们的数据。

我可以扩展一点,但对我来说,这似乎是一条可行的道路。

有人可能会说这不是干净的(它使你的存储库意识到在服务层发生的“一些事情”,他们不应该这样做),人们可以解决这个问题,但以这种方式暴露解决方案的要点会更简单。

编辑:因为这篇文章是第一次写的,所以我意识到Spring可以自动检测和注入特定类型的所有bean,而不需要PostProcessors。在这里查看被接受的答案:Autowire reference beans into list by type

票数 2
EN

Stack Overflow用户

发布于 2017-11-07 08:33:49

我认为它是一个在服务层上非常合理和实用的数据聚合。这在Spring中是完全可以实现的。如果您有权访问存储库代码,则可以将它们全部命名为:

代码语言:javascript
复制
@Repository("repoOne")
public class RepositoryOne {

@Repository("repoTwo")
public class RepositoryTwo {

并根据需要将它们注入到聚合服务中:

代码语言:javascript
复制
@Service
public class MultipleRepoService {

    @Autowired
    @Qualifier("repoOne")
    private RepositoryOne repositoryOne;

    @Autowired
    @Qualifier("repoTwo")
    private RepositoryTwo repositoryTwo;

    public void doMultipleBusiness() {
        repositoryOne.one();
        repositoryTwo.two();
    }
}

事实上,如果它们是不同的类,您甚至不需要命名和限定它们,但如果它们在层次结构中或具有相同的接口...

此外,如果自动装配不是一个案例,您可以直接注入构造方法:

代码语言:javascript
复制
public void construct(@Qualifier("repoOne")RepositoryOne repoOne,
                          @Qualifier("repoTwo")RepositoryTwo repoTwo) {
        repoOne.one();
        repoTwo.two();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40780570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档