SonarQube 错误:Singleton class 以不同步的方式写入字段
SonarQube bug: Singleton class writes to a field in an Unsynchronized manner
在 SonarQube 扫描中,它在下面提到的行中显示了一个主要错误。问题说,Singleton class 以不同步的方式写入字段。我想不通,为什么这是个问题?
@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
}
}
通常 class 用 spring 的 @Component
注释注释的是单例,除非指定了不同的范围(如请求)。这与 class 的 实例 将由 spring 在每个 class 自动装配的地方注入。通过为单例的内部字段提供 setter ,单独的线程可以以不同步的方式设置值,搞乱 class.
的内部逻辑
通常 SonarQube 应提供有关如何解决此类警告的附加信息和提示。
最简单的警告修复方法是将 synchronized
关键字添加到 setter 方法。为了使您的代码至少有可能正确,需要将此同步添加到各个成员的所有读取和写入用法中。这很可能会导致其他问题——不谈性能……
问题应该是
Why do you need state in an @Component class and are there ways to avoid this state?
要回答这个问题,需要知道 class 及其成员的实际使用方式。
如果您仅在 @ConfigurationProperties class 的上下文中使用 UrlItems
,则不需要自动连接它并且不需要 @Component class但是一个简单的 Java bean。 Spring 将根据需要创建此 class 的实例。
在 SonarQube 扫描中,它在下面提到的行中显示了一个主要错误。问题说,Singleton class 以不同步的方式写入字段。我想不通,为什么这是个问题?
@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
}
}
通常 class 用 spring 的 @Component
注释注释的是单例,除非指定了不同的范围(如请求)。这与 class 的 实例 将由 spring 在每个 class 自动装配的地方注入。通过为单例的内部字段提供 setter ,单独的线程可以以不同步的方式设置值,搞乱 class.
通常 SonarQube 应提供有关如何解决此类警告的附加信息和提示。
最简单的警告修复方法是将 synchronized
关键字添加到 setter 方法。为了使您的代码至少有可能正确,需要将此同步添加到各个成员的所有读取和写入用法中。这很可能会导致其他问题——不谈性能……
问题应该是
Why do you need state in an @Component class and are there ways to avoid this state?
要回答这个问题,需要知道 class 及其成员的实际使用方式。
如果您仅在 @ConfigurationProperties class 的上下文中使用 UrlItems
,则不需要自动连接它并且不需要 @Component class但是一个简单的 Java bean。 Spring 将根据需要创建此 class 的实例。