是否有任何 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 reflection验证代码一致性。
对于您的用例,我将首先让我的所有 bean 使用基于 constructor
的注入(inject),并使所有成员字段 cuối cùng
。我相信 findbugs 甚至有一些不可变的 bean 检查器。
第二次为你的用例做代码一致性我会使用 Spring BeanPostProcessor
或者只是一个实现 ApplicationContextAware
然后遍历 ApplicationContext 的类。现在您只需检查在您的应用程序上下文中加载的 bean(只需检查 bean 类的包名称)以确保所有字段都是 cuối cùng
。是的,您将需要一个更宽松的安全管理器或启用您的安全策略以允许私有(private)变量反射,但对于大多数人来说,这不是问题,特别是如果您已经使用了类似 hibernate 的东西。
如果有一个不是最终的字段,即无效代码,你只是抛出一个异常,你的 Spring 应用程序将不会启动。
对于规则的各种异常(exception)情况,您可以对不需要是 final 的字段或需要忽略规则的类使用自定义注释。
您可能担心性能或 Spring 构造函数注入(inject)功能不够强大,但 Spring 在启动时已经进行了大量反射,并且基于构造函数的注入(inject)现在变得相当强大,以至于您甚至可以做属性占位符@Value(${PROP})
.
的值
Tôi là một lập trình viên xuất sắc, rất giỏi!