如何对局部变量使用spring依赖项注入?

如何对局部变量使用spring依赖项注入?,spring,dependency-injection,Spring,Dependency Injection,我找到了许多关于类成员变量的setter依赖注入的示例,但发现在使用spring的方法中很难找到关于局部变量的setter依赖注入的示例 如何做到这一点?您给出的TextEditor类使用拼写检查器的示例在能够注入依赖项之前可能是这样的。您正在使用该类拼写检查器的方法内创建该类拼写检查器的新实例 public class TextEditor { public void doSomething() { new SpellChecker().checkSpelling()

我找到了许多关于类成员变量的setter依赖注入的示例,但发现在使用spring的方法中很难找到关于局部变量的setter依赖注入的示例


如何做到这一点?

您给出的TextEditor类使用拼写检查器的示例在能够注入依赖项之前可能是这样的。您正在使用该类拼写检查器的方法内创建该类拼写检查器的新实例

public class TextEditor {

    public void doSomething() {
        new SpellChecker().checkSpelling();
    }

}
如果您想将代码解耦,并能够用一个用于单元测试的mock或依赖项注入容器提供的另一个实现来替换拼写检查器,那么您必须更改类并提供一个可以注入此实例的字段

public class TextEditor {

    @Autowired
    private SpellChecker spellChecker;

    public void doSomething() {
        spellChecker.checkSpelling();
    }

}

由于这仍然不容易测试,因为您需要使用反射将模拟注入到该私有字段中,因此您可以提供一个Setter,或者通过从字段中删除修改器private使字段包可见。因此,同一个包中的单元测试可以访问此字段并提供模拟。

局部变量的依赖注入意味着什么?请向我们展示一些代码,并解释您试图实现的目标!你是说注射吗?或者注入没有设置器的变量?…也许我不清楚为什么要使用DI。我看到示例类TextEditor方法spellCheck()中的链接,我认为如果spellChecker是局部变量,比如下面的spellChecker spellChecker=new spellChecker();拼写检查器。检查拼写();那么如何替换“新拼写检查器();”和迪?或者在这种情况下不应该使用DI?DI的想法是,为了灵活性/测试能力的目的,它将提供拼写检查。我还注意到您指定了“class”成员变量。DI主要关注对象实例而不是类,尽管大多数容器默认使用单例的形式来重用实例。对于拼写检查,最好使用setter注入,它将设置实例变量。“局部”变量作为堆栈中的变量,在提供的钩子之外通常不使用。听起来您可能需要更多地了解DI和策略模式。是的,我的问题是“您必须更改类并提供一个可以注入此实例的字段”。这是否意味着无法注入局部变量“spellChecker”,但必须将其更改为成员变量才能使用DI?作为一个附带问题,我已经在代码示例之前缩进了四个空格,但为什么它仍然显示在一行上?您使用了什么方法发布上述示例代码@stefanglase@Don@MattYes,您必须更改类并为依赖项引入一个字段。在使用了
new SomeClass()
之类的语句的地方,有一些方法可以捕获和注入,但是您的类在执行时会告诉您一些不同的情况。有关此功能,请参见PowerMock。回答你的第二个问题:你不能在注释中格式化代码。对不起,我的愚蠢,“但是你的类在执行时会告诉你一些不同的事情”是什么意思?无论如何,对于spring,DI不能用于局部变量?或者DI不是为局部变量设计的?像
new SpellChecker()
这样的语句不应翻译为
get singleton instance from dependency container
。是的,您是正确的,Spring不会注入方法变量。