【问题标题】:How can I autowire static fields in spring without Sonarqube issue?如何在没有 Sonarqube 问题的情况下在 spring 中自动连接静态字段?
【发布时间】:2018-06-21 06:19:26
【问题描述】:

从这个解决方案中我知道我可以在 spring 中自动装配静态字段。

@Component
public class AdminUtil {

    private static IAirportService airportService;

    @Autowired
    public AdminUtil(IAirportService portService) {
        AdminUtil.airportService = portService;
    }

    ...

 }

但是声纳说:静态字段不应该在构造函数中更新 (RSPEC-3010)

有没有其他方法可以在 spring 中自动装配静态字段?还是我忽略这个?

【问题讨论】:

  • 不要。你为什么还要这样做?很抱歉,但这表明对控制反转甚至static 的含义存在根本性的误解。注意 SonarQube 的警告 - 不要这样做。
  • 这可能有什么用途?
  • @BoristheSpider 在这个 util 文件中包含一些转换器,计算等方法。我需要在一个方法中使用它。
  • 但是在你有一个实例之前你不能 - 这就是声纳警告的意思。出于所有意图和目的,这使它成为非静态的。您创建的东西是 Spring Bean - 因此会发生自动装配。所以注入你需要的bean。使用静态方法破坏了 IoC 并违背了它的目的 - 更好的解耦,因此更高的可测试性。

标签: java spring dependency-injection sonarqube autowired


【解决方案1】:

Spring 的想法是 Components 默认实例化一次并在整个应用程序中重用。只要组件不保持状态,就应该保存它。 考虑到您的代码示例,最简单的解决方案是不要将 airportService 设为静态。

【讨论】:

  • 虽然第一条评论是正确的,但它并不相关。例如,Spring 通过建立 bean 的依赖关系来确定创建它们的顺序做了一些聪明的事情——这打破了这一点;您的应用程序可能会随机抛出 NPE。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多