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

B4d*_*0bi 11 java spring findbugs checkstyle pmd

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

private String helperVar;

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

private String convertValue() {
   return helperVar.trim();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ada*_*ent 1

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

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

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

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

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

您可能担心性能或 Spring 构造函数注入不够强大,但 Spring 在启动时已经进行了大量的反射,并且基于构造函数的注入现在变得相当强大,以至于您甚至可以使用@Value(${PROP}).