用于查找非线程安全单例弹簧实现的代码质量规则

时间:2014-01-17 15:20:08

标签: java spring checkstyle findbugs pmd

是否有任何Checkstyle,PMD或Findbugs规则可以找到以下非线程安全的Spring单例实现?

private String helperVar;

public String getValue(String value) {
   helperVar = value;
   return convertValue();
}

private String convertValue() {
   return helperVar.trim();
}

我知道这个样本很糟糕,但这是展示我的意思的最简单方法。

在单次执行中从bean执行getValue方法时,它可以正常工作。 但是当在多用户环境中执行它时,将导致不可预测的错误/行为。

有没有办法找到这些出现而不需要手动完成代码?是否有任何静态代码检查器可以自动检查这个及其每个变体?

2 个答案:

答案 0 :(得分:1)

这可能是您不能接受的,但我有时会使用运行时bean reflection来验证代码一致性。

对于您的用例,我首先会使我的所有bean都使用基于constructor的注入,并使所有成员字段final。我相信findbugs甚至还有一些不可变的豆类检查器。

要为您的用例执行代码一致性,我将使用Spring BeanPostProcessor或仅使用实现ApplicationContextAware的类,然后遍历ApplicationContext。现在,您只需检查在您的应用程序上下文中加载的bean(只需检查beans类的包名称),以确保所有字段都是final。是的,你需要一个更宽松的安全管理器或允许你的安全策略允许私有变量反射,但对于大多数这不是一个问题,特别是如果你已经使用像hibernate这样的东西。

如果某个字段不是最终字段,即无效代码,则只会抛出异常,而您的Spring应用程序将无法启动。

对于规则的各种例外,您可以对不必为final的字段或需要忽略该规则的类使用自定义注释。

你可能会关注性能或者Spring构造函数注入不够强大但是Spring在启动时已经做了大量的反射,基于构造函数的注入现在变得相当强大,这样你甚至可以做属性占位符值为@Value(${PROP})

答案 1 :(得分:1)

您可以尝试使用

FindBugs library

它有一些内置的方法。

没有您需要的产品,但可以根据您的需求进行扩展。这是一个很好的例子

Daniel Schneller blog

  

检测器的一般思想是在类的字节码中找到某些模式。为此,它将读取.class文件并将它们放入使用访问者模式实现的模式匹配器中。阅读时会调用适当的访问者方法,具体取决于手头的元素(方法,字段声明等)。编写检测器意味着实现一个或多个这些方法,建立一个关于类的目的的想法

好的是,最终它是您可以包含在测试模块中的Java代码。我想你也可以添加编译器警告但不确定。