确保弹簧组件是无状态的

当开发人员将可变性引入Spring组件时,我们遇到了多线程问题。 像这样的东西:

@Component //singleton
public class MyComponent {
...
private String intermediateResults;
public String businessMethod() {
 ... fills in intermediateResults;
}

public String thisGetterShouldNotBeHere() {
    return intermediateResults;
 }
}

这导致了多线程的bug - 字段intermediateResults已经从不同的线程访问。

是否有一种方法可以防止通过某种静态分析器向Spring Singleton添加状态? SonarQube插件? Eclipse插件? 感谢您的建议。


谷歌的MutabilityDetector似乎能够完全满足你的需求:

Mutability Detector旨在分析Java类并报告给定类的实例是否不可变。 它可以使用:

  • 在单元测试中,使用assertImmutable(MyClass.class)之类的断言。 你的课程实际上是不可变的吗? 那刚刚做出的改变之后怎么样?
  • 作为FindBugs插件。 你用@Immutable注解的那些类是他们实际上? 在运行时。 你的API是否需要被赋予不可变对象? 从命令行。 你想在整个代码库中快速运行Mutability Detector吗?
  • 无论如何,我会建议添加一个明确的合同,声明该类应该是不可变的,要么通过javadoc要么通过类本身的@Immutable注释,以便(明智的)开发人员维护类的必备条件。 (如果谷歌的探测器未能检测到特定类型的不变性,例如:是字符串,日期真的不可变?)


    你可以用任何静态分析器(如FindBugs,PMD和Checkstyle)来实现你自己的规则来检查你的类:

  • 只允许最终属性
  • 扩展给定的类
  • 是最后的
  • 使用构造函数依赖注入
  • 但是,据我所知,没有专门配置的工具。

    或者,您可以创建@Immutable注释并在其中执行检查。

    链接地址: http://www.djcxy.com/p/38173.html

    上一篇: Make sure spring component is stateless

    下一篇: Make Gradle use Maven local repository for downloading artifacts