确保弹簧组件无状态

时间:2017-01-23 10:06:28

标签: java eclipse spring multithreading

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

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

public String thisGetterShouldNotBeHere() {
    return intermediateResults;
 }
}

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

是否有办法阻止向Spring Singleton添加状态,例如通过某种静态分析仪? SonarQube插件? Eclipse插件? 谢谢你的建议。

2 个答案:

答案 0 :(得分:2)

MutabilityDetector似乎能够完全满足您的需求:

  

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

     
      
  • 在单元测试中,使用assertImmutable(MyClass.class)之类的断言。你的班级真的是不变的吗?你刚刚做出改变后怎么办?
  •   
  • 作为FindBugs插件。你用@Immutable注释的那些类实际上是吗?   在运行时。您的API是否需要被赋予不可变对象?   从命令行。您想在整个代码库中快速运行Mutability Detector吗?
  •   

无论如何,我建议添加一个明确的合同,声明该类应该通过javadoc或通过类本身的@Immutable注释不可变,以允许(明智的)开发人员维护阶级要求。 (如果Mutability Detector无法检测特定类型的不变性,例如:Are String, Date really immutable?

答案 1 :(得分:1)

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

  • 仅允许最终属性
  • 扩展给定的课程
  • 是最终的
  • 使用构造函数依赖注入

但是,据我所知,没有专门为此配置的工具。

或者,您可以创建@Immutable注释并在那里实施检查。