gpt4 book ai didi

java - 寻找有状态的单例 bean

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:03 26 4
gpt4 key购买 nike

今天,我们在代码中发现了这种模式:

class Foo {
private List<String> errors;

public void addError(String error) { ... }
public List<String> getErrors();
}

虽然代码似乎有效,但这是一个单例 Spring bean,它被注入(inject)到几个独立的位置,bean 的使用者假设他们每个人都有自己的错误列表。所以这会引入细微的错误。

显而易见的解决方案是教育开发人员避免此类错误,但我想知道是否有静态或运行时代码分析工具可以发现此类错误。

例如,bean 后处理器可以在 bean 返回之前分析它并查找不是 @Autowired 的私有(private)字段。

最佳答案

在为此倾注了更多(我们和其他人的)大脑之后,我们想出了这种方法:

  1. 安装一个 BeanPostProcessor,它确保所有单例 bean(即 bean 定义中的范围是 Singleton)都有自定义注解 @无状态 实际 bean 类型。

    我们选择了自定义注释而不是重用 @Singleton,因为我们在其他地方也需要此功能。

    如果注释丢失,工厂会抛出错误。

  2. 在单元测试中,我们使用不带自定义注释的 ClassPathScanningCandidateComponentProvider 来定位类路径中的所有类。然后我们可以进行复杂且昂贵的测试,以确保 bean 的状态在初始配置后(即发生 Autowiring 后)没有变化。

如果我们将 Autowiring 的字段移到构造函数中,第二步可能会变得更容易一些,但我们不喜欢采用很多参数的方法。如果 Java 或 IDE 可以从 bean 代码生成构建器,那就太好了。由于情况并非如此,我们坚持使用 Autowiring 的字段和/或 setter 。

关于java - 寻找有状态的单例 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805570/

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