gpt4 book ai didi

java - 在 Spring Boot 项目中声明同一类/DAO 的多个实例是否有害?

转载 作者:行者123 更新时间:2023-12-01 17:34:35 27 4
gpt4 key购买 nike

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

在我的一个小测试 Spring boot 项目服务中,我注意到我最终执行了两者依赖注入(inject)和正常的类实例化。我使用 JPA Repository 来制作我的存储库层,并 Autowiring 存储库类,以便我可以像这样使用它们。

@Autowired 
customerAccountRepo

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

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

最佳答案

我有一些建议:

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

您选择 Spring 并抛弃 Java EE 是明智之举。这是二十年前的死标准。

关于java - 在 Spring Boot 项目中声明同一类/DAO 的多个实例是否有害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61062594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com