在 Spring 中将多个存储库自动装配到单个 DAO 中 - 不好的做法?

Posted

技术标签:

【中文标题】在 Spring 中将多个存储库自动装配到单个 DAO 中 - 不好的做法?【英文标题】:Autowiring multiple repositories into a single DAO in Spring - bad practice? 【发布时间】:2018-07-09 20:20:58 【问题描述】:

假设我有以下 Spring Mongo 存储库。 ObjectOne、ObjectTwo 和 ObjectThree 表示存储在同一数据库中不同集合中的文档

public interface RepositoryOne extends MongoRepository<ObjectOne, String> 


public interface RepositoryTwo extends MongoRepository<ObjectTwo, String> 


public interface RepositoryThree extends MongoRepository<ObjectThree, String> 

然后是单个 DAO 类

public class ExampleDAO 
    @Autowired
    private RepositoryOne repositoryOne;

    @Autowired
    private RepositoryTwo repositoryTwo;

    @Autowired
    private RepositoryThree repositoryThree;

    //Various methods performing operations with repositoryOne
    //Various methods performing operations with repositoryTwo
    //Various methods performing operations with repositoryThree

像上面那样将多个存储库自动装配到单个 DAO 中是否被认为是不好的做法?感觉这个类可能做的太多了,理想情况下我应该有一个单一的存储库来维护单一的责任。如果这是不好的做法,是否可以为每个存储库使用单独的 DAO,或者是否有一种 Spring 魔术方法可以创建单个存储库,我可以使用它来调用更具体的存储库?

【问题讨论】:

【参考方案1】:

为单个类承担多个不相关职责是一种不好的做法。如果它们是相关的,请考虑创建一个“服务”类并自动装配存储库。并且服务类中的方法也可以抽象存储库中的方法,例如:

class ExampleService 
    @Autowired
    private RepositoryOne repositoryOne;

    @Autowired
    private RepositoryTwo repositoryTwo;

    void saveEmployee(Employee e) 
        repositoryOne.save(e);
        repositoryTwo.update(e.getEmpId);
    

【讨论】:

【参考方案2】:

除非查看实际的业务逻辑,否则没有人能够判断您的 ExampleDAO 是否可以使用多个存储库。

但是,您的 ExampleDAO 类似乎充当业务服务(查看 here 以了解 DAO 与存储库的主题,它们实际上都是实现数据访问层的不同方式)。换句话说,您需要确保您的 ExampleDAO 类处理/拥有单一职责。

另外,另一个重要的一点是使用字段注入而不是使用构造函数注入是一种不好的做法。我建议你通过here 讨论这个问题。

【讨论】:

感谢您的链接,尤其是构造函数注入。

以上是关于在 Spring 中将多个存储库自动装配到单个 DAO 中 - 不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

@Primary 等效于自动装配的 Spring JPA 存储库

如何在 spring-servlet.xml 中自动装配 crud 存储库?

尽管有 @EnableJpaRepositories 注释,但 Spring JPA 未实现/自动装配存储库

使用 @DataJpaTest 的 Spring 测试无法使用 @Repository 自动装配类(但使用接口存储库可以工作!)

Spring Boot:来自库项目的自动装配 bean

关于 JPA 存储库和自动装配的 Java spring 问题