2012-02-28 73 views
0

我了解如何,但似乎无法正式塑造定义。春天DI?接口类型?

由于已知的DI可以通过构造函数或setter或接口完成。 我对最新的一种基于界面的DI感到困惑,是否在春季使用?

更新:我在这里给了错误的检查,导致错误的理解。

要解决它:

说我们有setter和在二传手我们注入一些类实现的接口。这是通过setter还是接口认为是DI?

http://martinfowler.com/articles/injection.html#UsingAServiceLocator 本文共分DI上:。

“主要有三种风格的依赖注入我使用他们的名字是构造器注入,Setter注入和接口注入。如果在当前关于Inversion of Control的讨论中,你将会听到这些被称为类型1 IoC(接口注入),类型2 IoC(setter注入)和类型3 IoC(构造函数注入)的讨论。很难记住,这就是为什么我使用了我在这里的名字。“

Else服务定位符模式用于IoC,它是实际使@Autowired成为可能的模式吗? - 也就是说,并非所有的类都需要在xml中声明为DI,因为我们可以将它们声明为@Repository或@Controller,或者如果我记得正确的话,可以再次声明它们。

谢谢,

回答

3

自动装配的接口装置线实现该接口的bean。这依赖于bean工厂中实际存在的实现。

@Autowired 
UserService us; // wire a bean implementing UserService 

-

@Service 
public class UserServiceImpl implements UserService { 
    // the @Service annotation causes this implementation of UserService to 
    // be made available for wiring in the bean factory. 
} 

值得注意的是,如果你通过线接口,Spring会想到那里的bean工厂实现该接口存在一个且只有一个豆。如果找到多个bean,则会抛出错误,您将不得不指定要连线的bean(使用@Qualifier注释)。

编辑:

配线时,则可以电线的成员变量或setter方法。

@Autowired 
UserService us; 

-

@Autowired 
public void setUserService(UserService us) { 
    this.us = us; 
} 

这两个产生相同的结果。不同的是,在前者中,Spring将使用反射将变量us设置为实现UserService的bean。在后者中,Spring将调用setUserService方法,传递相同的UserService实例。

+0

请与其他DI方法比较,因为现在我更加困惑。我明白了意思,但让我们暂时离开@Autowired。(忘了上下文:组件扫描 - 说我们没有它)请通过setter和接口显示DI之间的差异 - 你可以在setter中设置接口 - 然后通过接口或通过setter调用什么?那么为什么它通过设置器或接口在DI上正式分配。 – Aubergine 2012-02-28 09:19:37

+0

“通过设置者和界面的DI之间的区别” - 苹果和橙子,他们没有任何关系。见上面的编辑。 – pap 2012-02-28 09:29:12

+0

我完全理解你在做什么以及它是如何工作的(我自己实现了,它的工作非常出色)这就是我认为它无法比拟的。但为什么本文的作者将接口注入与setter和构造函数注入一起沿着这条线? – Aubergine 2012-02-28 09:37:09