2012-09-15 68 views
3

我发现了很多关于类成员变量的setter依赖注入的例子,但是发现很难找到任何关于使用spring的方法内部局部变量的setter依赖注入的例子。如何使用弹簧依赖注入局部变量?

我该怎么做?

+1

局部变量的依赖注入甚至意味着什么?请向我们展示一些代码,并解释您想要实现的目标! –

+1

你的意思是构造函数注入?或者注入没有setter的变量?... –

+0

也许我不清楚为什么要使用DI。 我看到链接[链接](http://www.tutorialspoint.com/spring/setter_based_dependency_injection.htm) 从示例类TextEditor方法spellCheck(),我认为如果spellChecker是像下面这样的局部变量: SpellChecker spellChecker =新的SpellChecker(); spellChecker.checkSpelling(); 然后如何替换'新的SpellChecker();'与DI? 或在这种情况下不应该使用DI? – user1169587

回答

1

在给出依赖注入能力之前,您给出的由TextEditor类使用的SpellChecker示例可能看起来像这样。您正在使用它的方法内创建类SpellChecker的新实例。

public class TextEditor { 

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

} 

如果你想分离的代码,并能够通过一个模拟的单元测试的目的,或通过您的依赖注入容器提供的另一种实现方式,以取代拼写检查,你必须改变类,并提供一个字段,这实例可以被注入。

public class TextEditor { 

    @Autowired 
    private SpellChecker spellChecker; 

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

} 

因为这仍然是不容易测试,因为你需要使用反射来注入模拟成私有字段,你可以提供一个二传手或者取出修改从外地民营使该字段包可见。因此,同一包中的单元测试可以访问此字段并提供模拟。

+0

是的,我的问题是“你必须改变类并提供一个可以注入此实例的字段”,这是否意味着它无法注入局部变量'spellChecker',但必须将其更改为成员变量使用DI? 作为一个侧面问题,我已经在代码示例之前缩进了四个空格,但为什么它仍然显示在一行上?你用什么方法发布上述示例代码? @ stefanglase @ Don @ Matt – user1169587

+1

是的,您必须更改类并引入依赖项的字段。有些方法可以捕获和注入类似'New SomeClass()'这样的语句的地方,但是你的类会告诉与执行时会发生什么不同的东西。有关此功能,请参阅PowerMock。并回答你的第二个问题:你不能在注释中格式化代码。 – stefanglase

+0

对不起,我的愚蠢,“但你的班级会告诉与执行时发生的事情不同的是什么”。无论如何,对于春天来说,DI不能用于局部变量吗?或者DI不是为局部变量设计的? – user1169587