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