Spring 为什么可以';我们不能在春天自动连接静电场吗?

Spring 为什么可以';我们不能在春天自动连接静电场吗?,spring,autowired,Spring,Autowired,为什么我们不能在Springbean中自动连接静态实例变量。我知道还有另一种方法可以实现这一点,但我只是想知道为什么我们不能用下面的方法来实现 e、 g 因为使用静态字段会鼓励使用静态方法。静态方法是邪恶的。依赖项注入的主要目的是让容器为您创建对象并连接它们。它还使测试更容易 一旦您开始使用静态方法,您就不再需要创建对象的实例,测试也就困难多了。此外,您不能创建给定类的多个实例,每个实例都注入了不同的依赖项(因为该字段是隐式共享的,并且创建了全局状态,这也是邪恶的)。根据OOP概念,如果静态变量

为什么我们不能在Springbean中自动连接静态实例变量。我知道还有另一种方法可以实现这一点,但我只是想知道为什么我们不能用下面的方法来实现

e、 g


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


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

根据OOP概念,如果静态变量是自动连接的,则设计将是糟糕的

静态变量不是对象的属性,而是类的属性。 Spring自动布线是在对象上完成的,在我看来,这使设计更加清晰。
您可以将auto-wired bean对象部署为singleton,并实现与定义静态对象相同的功能。

因为当类加载器加载静态值时,Spring上下文还不一定加载。
因此,类加载器将无法在bean中正确注入静态字段,并将失败。

通过此解决方案,您可以在spring中自动连接静态字段。

@Component
public class TestClass {

    private static Test test;

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

我遇到的一个警告是在测试期间。如果您想在SpringJUnit4ClassRunner中使用
@BeforeClass
,并让该方法在测试中访问bean
@Autowired
。。你基本上不能。这很烦人。这个答案解释了为什么它不应该“t。但真正的动机是,当框架试图将静态类连接到bean中时,它可能还没有被类装入器装入。这个答案完全没有意义。Spring不会强制实施您的测试策略。答案是当静态类由类装入器实例化时,还没有加载Spring库。@AndreaT的答案应该是可以接受的答案。静态方法更容易测试,而不是更难。让spring自动注入依赖项看起来不错,但实际上这是测试的更困难的途径。mock、stub和test double都是代码气味,而不是静态方法。感谢您给出了一个似乎能真正回答这个问题的答案,而不是仅仅表示一半Java语言是个坏主意。“静态类”?这似乎不正确,因为Mockito能够将对象注入静态字段,类似于spring如何进行自动布线……尽管我不知道实现是否相同。需要更多信息。Mockito无法模拟静态方法。您需要使用Powermock来模拟静态方法BugFinder会抱怨从非静态方法设置静态字段。@从非静态方法引用静态成员的Neftanic有效,相反的方法不能让您了解引用的其他方法。您可以通过构造函数自动连线或使用@PostConstuct
@Component
public class TestClass {

    private static Test test;

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