2013-02-23 162 views
3

我在Spring框架中很新,我对使用@Autowired注释和接口声明有一些疑问。在Spring框架中使用** @ Autowired **注释和接口声明的一些疑问

参考下面这个例子:

http://viralpatel.net/blogs/spring3-mvc-hibernate-maven-tutorial-eclipse-example/

我知道@Autowired注解可以用来在属性会自动链接豆。

在前面的例子中,我有以下的情况:

我有一个的ContactDAO接口,它的命名ContactDAOImpl

接下来在类ContactServiceImpl实现类有这个变量使用annoted @Autowired

@Autowired 
private ContactDAO contactDAO; 

我的第一个疑问是关于事实联系DAO接口所以我布线什么?具体类型:ContactDAOImpl?如果是的话,Spring框架是做到这一点的吗?

第二个疑问是有关事实为spring-servlet.xml配置文件中没有一个bean definizion为的ContactDAO ORF ContactAOImpl类......为什么?是因为ContactDAOImpl类是使用@Repository注释?

感谢

安德烈

回答

5

我的第一个疑问是关于这个事实,即ContactDAO是一个接口 所以我在接线什么?具体类型:ContactDAOImpl?如果是的话,是不是这个Spring Framework的 呢?

只要只有一个匹配的实现,Spring将自动为您接口的实现。还有一种方法可以通过使用@Qualifier@Autowired并命名实现来将多个候选项的单个实现与自动装配匹配。

第二个疑问是有关事实为spring-servlet.xml 配置文件中没有一个bean definizion为的ContactDAO ORF ContactAOImpl类......为什么?是否因为ContactDAOImpl类是 使用@Repository注释进行注释?

如果您使用您的实现进行配置注释(@Component@Repository@Service@Controller),你不需要在XML明确定义豆(尽管你可以做到这一点也可以)。

编辑:this我的旧回答可能会在Spring中使用注释揭示更多的光芒。

2

的回答您的两个问题是,和Yes。

实际上,您可能没有在服务中使用自动装配的ContactDAOImpl实例,而是代理的实例,该实例会删除ContactDAOImpl的实例。代理通常会处理事务,翻译异常等。

@Repository注释是声明Spring bean的替代(更简单)方法。它只在Spring xml文件中有一个元素告诉它发现带注释的bean时才起作用。

+0

谢谢...另一个问题(也许是愚蠢的)...如果我有一个像上一个案例,巫婆我的ContactServiceImpl类中有一个自动化的ContactDao变量会发生什么,但我有两个不同的ContactDao实现接口?什么是Spring的选择? – AndreaNobili 2013-02-23 09:51:29

+1

Spring会选择一个注释(使用Repository或另一个Spring组件注释)。如果两者都注释了,你会得到一个异常,并且必须使用限定符注释来指定你想要自动装配的那一个。这是记录:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-annotation-config – 2013-02-23 10:05:36

2

Spring会自动扫描所有的类并找到所有注解的类并进行注册,这在Spring的配置会告诉它做的是:

<context:component-scan base-package="my.base.package" /> 

因此,你不需要来声明@Repository在配置文件。

对于您的问题的第一部分,这是IOC pattern的取消固定;你的Service类只知道DAO的接口,这意味着它不依赖于实现。

在扫描过程中,Spring会查找所有带注释的类,当您询问@Autowired时,它将尝试找到您已注释过的那个类,该类是您要求拥有Autowired的接口的实现者。

查看关于Annotation Configuration的Spring文档。