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方法时,它可以正常工作.但是当在多用户环境中执行它时,将导致不可预测的错误/行为.
有没有办法找到这些出现而无需手动完成代码?是否有任何静态代码检查器可以自动检查这个及其每个变化?
这可能对您来说不可接受,但我有时会使用运行时 bean反射来验证代码一致性。
对于您的用例,我首先让我的所有 bean 使用 constructor
基于注入并创建所有成员字段final
。我相信 findbugs 甚至有一些不可变的 bean 检查器。
其次,为了确保您的用例的代码一致性,我将使用 Spring或仅使用一个实现然后遍历 ApplicationContext 的BeanPostProcessor
类。ApplicationContextAware
现在,您只需检查在您的应用程序上下文中加载的 bean(只需检查 beans 类的包名称)以确保所有字段都是final
. 是的,您将需要一个更宽松的安全管理器,或者启用您的安全策略以允许私有变量反射,但对于大多数人来说,这不是问题,特别是如果您已经使用了休眠之类的东西。
如果有一个字段不是最终的,即无效代码,您只需抛出一个异常,您的 Spring 应用程序将不会启动。
对于规则的各种例外,您可以对不需要最终的字段或需要忽略该规则的类使用自定义注释。
您可能担心性能或 Spring 构造函数注入不够强大,但 Spring 在启动时已经进行了大量的反射,并且基于构造函数的注入现在变得相当强大,以至于您甚至可以使用@Value(${PROP})
.
归档时间: |
|
查看次数: |
1260 次 |
最近记录: |