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



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

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

我知道这个样本很可怕,但它是最简单的方式来表明我的意思。

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

有没有一种方法可以在不手动查看代码的情况下找到这些事件?有没有任何静态代码检查器可以自动检查这个和它的每个变体?

您可能无法接受这一点,但我有时会使用运行时bean反射来验证代码的一致性。

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

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

如果有一个字段不是最终字段(即无效代码),您只需抛出一个异常,您的Spring应用程序就不会启动。

对于规则的各种异常,您可以对不需要是最终字段的字段或需要忽略规则的类使用自定义注释。

您可能担心性能问题,或者Spring构造函数注入功能不够强大,但Spring在启动时已经进行了大量的反射,而基于构造函数的注入近年来变得相当强大,因此您甚至可以使用@Value(${PROP})执行属性占位符值。

您可以尝试使用

FindBugs库

它有一些内置方法。

你并不需要什么,但它可以根据你的需要扩展。这是的一个很好的例子

Daniel Schneller博客

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

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

最新更新