寻找有状态的单身豆

Aar*_*lla 6 java singleton spring state

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

class Foo {
    private List<String> errors;

    public void addError(String error) { ... }
    public List<String> getErrors();
}
Run Code Online (Sandbox Code Playgroud)

虽然代码似乎有效,但这是一个单独的Spring bean,并且它被注入了几个独立的地方,并且bean的使用者认为它们每个都有自己的错误列表.所以这引入了微妙的错误.

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

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

Aar*_*lla 1

在投入更多的大脑(我们和其他人的)之后,我们想出了这个方法:

  1. 安装 a ,BeanPostProcessor确保所有单例 bean(即 bean 定义中的范围)在实际 bean 类型上Singleton都有自定义注释。@Stateless

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

    如果缺少注释,工厂会抛出错误。

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

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