为什么我们不能在春天自动装配静态字段

Ash*_*shu 92 spring

为什么我们不能在Spring bean中自动装配静态实例变量.我知道还有其他方法可以达到这个目的但只是想知道为什么我们不能以这种方式做到这一点.

例如

@Autowired
public static Test test;
Run Code Online (Sandbox Code Playgroud)

And*_*a T 136

因为当类加载器加载静态值时,尚未加载Spring上下文.因此,类加载器不会正确地在bean中注入静态类,并且会失败.

  • 感谢一个看似实际回答问题的答案,而不仅仅是表达了一半Java语言不好的观点. (44认同)

Tom*_*icz 67

因为使用静态字段会鼓励使用静态方法.静态方法是邪恶的.依赖注入的主要目的是让容器为您创建对象并连接它们.它也使测试更容易.

一旦开始使用静态方法,就不再需要创建对象实例,并且测试要困难得多.此外,您无法创建给定类的多个实例,每个实例都注入了不同的依赖项(因为该字段是隐式共享的并且创建全局状态 - 也是邪恶的).

  • 这个答案完全没有意义.Spring并没有强加你的测试策略.答案是,当类加载器实例化静态类时,尚未加载Spring库. (44认同)
  • 我遇到的一个警告是在测试期间.如果你想在SpringJUnit4ClassRunner中使用```@ BeforeClass```,并且让该方法在测试中访问bean```@Autowired```,你基本上不能.这很烦人. (11认同)
  • @AndreaT的答案应该是公认的答案. (5认同)
  • 这个答案解释了为什么它不应该.但真正的动机是,当框架试图将静态类连接到bean时,它可能还没有被类加载器加载. (4认同)
  • 静态方法更容易测试,而不是更难.让spring自动注入依赖项看起来不错,但这实际上是测试的难点.模拟,存根和测试双打是代码气味,而不是静态方法. (2认同)

ssk*_*ssk 15

根据OOP概念,如果静态变量是自动装配的,那将是糟糕的设计.

静态变量不是Object的属性,但它是Class的属性.弹簧自动接线是在物体上完成的,这使我的设计清晰.您可以将自动连线bean对象部署为单例,并实现与将其定义为静态相同.


Par*_*nki 14

通过此解决方案,您可以在春天自动装配静态字段.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Bugfinder会抱怨从非静态方法设置静态字段. (4认同)