【问题标题】:Is declaring multiple instances of the same class/DAO in a Spring Boot project harmful?在 Spring Boot 项目中声明同一类/DAO 的多个实例是否有害?
【发布时间】:2020-04-06 23:07:12
【问题描述】:

我刚开始接触 Spring,来自纯 Java EE 背景,所以像 IOC 和依赖注入这样的东西对我来说都是新的。根据 Spring 文档,我了解对于任何调用其依赖项实例的类,我可以选择将这些依赖项自动装配为依赖注入的一种形式。这实际上与我们在 java 中经常做的通常的实例声明不同,如下所示:Animal animal1 = new Animal()

在我的一项小型测试 Spring Boot 项目服务中,我注意到我最终会同时进行 依赖注入和正常的类实例化。我使用 JPA Repository 来制作我的 repo 层,并自动装配 repo 类,以便我可以像使用它们一样使用它们。

@Autowired 
customerAccountRepo 

这一切都很好。我还有一个 DAO customerMembershipValidity,它的属性是其他声明的 POJO,并且有一些公共辅助函数来设置 DAO 的属性。然而,为了使用这个 DAO,我发现自己以传统方式创建了多个 DAO 实例,实例化 CustomerMembershipValidity customerMembershipValidity1 = new CustomerMembershipValidity() 在整个服务中多次调用公共辅助方法,例如 customerMembershipValidity.setNewExpiry()。我认为不需要自动装配,因为我正在处理 DAO 或 POJO,而不是其他服务......或者我应该吗?

目前,当我进行单元测试时,代码似乎可以正常工作,但我想知道这是否会损害代码的整体寿命和敏感性,或者在我运行时是否可以预见最终会在 E2E 中中断Spring Boot 应用程序。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    我有一些建议:

    1. DAO 应该是您注入到需要它的服务 bean 中的单例 Spring Bean。确保您的 DAO 中没有可变的共享状态 - 只是数据库操作。
    2. 我编写的 DAO 可能会使用映射器函数将 ResultSet 映射到对象/集合,但我认为不需要帮助器。
    3. Spring 偏好是使用构造函数注入。您不应该使用 setter 或 autowired 属性来注入依赖项。
    4. 如果你使用new,那意味着对象不在Spring的控制之下。对方法范围内的对象调用 new 是合适的,但不是像 DAO 这样的 Spring Bean。
    5. 单元测试和生产是两个不同的东西。我更喜欢将 Spring 排除在单元测试之外。我为 JUnit 测试调用 new,但不是生产代码。测试 DAO 后,我可以对依赖它的服务使用模拟。

    您明智地选择了 Spring 而将 Java EE 抛在脑后。这是一个二十岁的死标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-04
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2017-02-02
      • 2019-07-03
      相关资源
      最近更新 更多