gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:47:30 26 4
gpt4 key购买 nike

是否有任何 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),并使所有成员字段 final。我相信 findbugs 甚至有一些不可变的 bean 检查器。

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

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

对于规则的各种异常(exception)情况,您可以对不需要是 final 的字段或需要忽略规则的类使用自定义注释。

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

的值

关于java - 查找非线程安全单例 spring 实现的代码质量规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21189385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com