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

时间:2012-06-07 19:24:25

标签: spring

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

@Autowired
public static Test test;

4 个答案:

答案 0 :(得分:130)

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

答案 1 :(得分:66)

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

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

答案 2 :(得分:15)

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

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

答案 3 :(得分:13)

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

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}