通过组件构造函数自动装配静态成员

wel*_*lly 3 java spring static dependency-injection

我知道这个编译,但我的问题是,这是一个好主意吗?我很好奇为什么它可能不是一个好主意.更好的是,如果SomeStaticClass是@Component,还有其他选择,但它也必须是MyComponent的静态成员.我的理解是它的设计很糟糕,让Spring自动装配静态成员.根据我所读到的,我仍然不太明白为什么.说我有以下内容:

@Component
public final class MyComponent {

  private static SomeStaticClass someStaticClass;

  @Autowired
  MyComponent(SomeStaticClass someStaticClass) {
    MyComponent.someStaticClass = someStaticClass;
  }

}
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 8

设计糟糕的原因很少:

  • static 可变字段通常是一个糟糕的设计

  • 使测试更难 - 一旦设置了这个字段,它将在下一个测试中保持设置,可能会产生隐藏的相互依赖性

  • 如果你想拥有两个实例MyComponent,每个实例都不同,该SomeStaticClass怎么办?混沌.

  • 你不能通过static字段或setter autowiring 注入值,它是明确禁止的.必须有这样的理由.

  • 为什么你甚至需要那个?你有static方法MyComponent吗?为什么?

  • 如果上述情况属实,那么MyComponent.staticMethod()在构造函数初始化该字段之前如何阻止调用呢?Spring的重点是返回完全填充的安全bean