107

为什么我们不能在 Spring bean 中自动装配静态实例变量。我知道还有另一种方法可以实现这一点,但只是想知道为什么我们不能以下面的方式做到这一点。

例如

@Autowired
public static Test test;
4

4 回答 4

164

因为当类加载器加载静态值时,还不一定加载 Spring 上下文。所以类加载器不会正确地在 bean 中注入静态字段并且会失败。

于 2014-02-19T08:49:24.237 回答
75

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

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

于 2012-06-07T19:27:51.100 回答
17

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

静态变量不是 Object 的属性,而是 Class 的属性。弹簧自动布线是在对象上完成的,在我看来,这使设计更加简洁。您可以将自动连接的 bean 对象部署为单例,并实现与将其定义为静态的相同。

于 2012-06-08T07:35:40.313 回答
17

通过这个解决方案,您可以在 spring 中自动装配静态字段。

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}
于 2016-09-20T08:53:31.673 回答