【问题标题】:SonarQube bug: Singleton class writes to a field in an Unsynchronized mannerSonarQube 错误:单例类以非同步方式写入字段
【发布时间】:2021-12-20 21:38:58
【问题描述】:

在 SonarQube 扫描中,它在下面提到的行中显示了一个主要错误。问题是,单例类以非同步方式写入字段。我无法弄清楚,为什么这是一个问题?

@Configuration
@ConfigurationProperties(prefix = "app")
public class UrlConfigs() {

   @Autowired
   private List<UrlItems> item;

   //Getter & Setter

}

@Component
public class UrlItems {

   private String url;
   private String location;

   // Getter

   public void setUrl(String url){
      this.url = url; // ISSUE: Singleton class writes to a field in an unsynchronized manner
   }

   public void setLocation(String location) {
       this.location = location; // ISSUE: Singleton class writes to a field in an unsynchronized manner
   }

}

【问题讨论】:

    标签: java spring spring-boot sonarqube


    【解决方案1】:

    通常使用 spring 的 @Component 注释注释的类是单例,除非指定了不同的范围(如请求)。这就是这个类的完全相同的 instance 将被 spring 注入到这个类被自动装配的每个地方。通过为单例单独线程的内部字段提供设置器,可以以不同步的方式设置值,从而弄乱类的内部逻辑。

    通常,SonarQube 应提供有关如何解决此类警告的其他信息和提示。

    最简单的警告修复方法是将 synchronized 关键字添加到 setter 方法。为了使您的代码至少有可能正确,需要将这种同步添加到各个成员的所有读写使用中。这很可能会导致其他问题 - 不谈论性能......

    问题应该是

    为什么在@Component 类中需要状态,有没有办法避免这种状态?

    要回答这个问题,需要知道这个类及其成员是如何实际使用的。

    如果您只在@ConfigurationProperties 类的上下文中使用UrlItems,则不需要自动连接它,也不需要@Component 类,而需要一个简单的Java bean。 Spring 将根据需要创建此类的实例。

    【讨论】:

    • 所以@Component 是问题所在。那么代替自动装配,可以使用“新”关键字吗?私有列表 项目 = 新的 ArrayList();。这是解决问题的好方法吗?
    • 如果您只在@ConfigurationProperties 类的上下文中使用UrlItems,则不需要自动连接它,也不需要@Component 类,而需要一个简单的Java bean。 Spring 将根据需要创建此类的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多