3

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

参考这个例子:

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

我知道@Autowired 注释可用于自动链接属性上的bean。

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

我有一个ContactDAO接口,它的实现类名为ContactDAOImpl

接下来在ContactServiceImpl类中有这个变量使用@Autowired注释:

@Autowired
private ContactDAO contactDAO;

我的第一个疑问与ContactDAO是一个接口这一事实有关,那么我在接线什么?具体类型:ContactDAOImpl ? 如果是,是 Spring Framework 做的吗?

第二个疑问与spring-servlet.xml配置文件中没有ContactDAO orf ContactAOImpl类的 bean 定义有关......为什么?是因为ContactDAOImpl类使用@Repository注释进行了注释吗?

谢谢

安德烈亚

4

3 回答 3

5

我的第一个疑问与 ContactDAO 是一个接口这一事实有关,那么我在接线什么?具体类型: ContactDAOImpl ? 如果是,是 Spring Framework 做的吗?

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

第二个疑问与 spring-servlet.xml 配置文件中没有 ContactDAO orf ContactAOImpl 类的 bean 定义有关......为什么?是因为 ContactDAOImpl 类使用@Repository 注释进行了注释吗?

如果您在实现中使用注释 ( @Component, @Repository, @Service, @Controller) 进行配置,则无需在 xml 中显式定义 bean(尽管您也可以这样做)。

编辑:我的这个旧答案可能会更清楚地说明在 Spring 中使用注释。

于 2013-02-23T09:49:35.537 回答
2

您的两个问题的答案是“是”和“是”。

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

注释是声明 Spring bean的@Repository另一种(更简单)方式。只有当您在 Spring xml 文件中有一个元素告诉它发现带注释的 bean 时,它才有效。

于 2013-02-23T09:48:03.650 回答
2

Spring 将自动扫描您的所有类并找到所有带注释的类并注册它们,这在您的 Spring 配置中将告诉它这样做:

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

因此,您无需@Repository在配置文件中声明您的。

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

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

查看有关Annotation Configuration的 Spring 文档。

于 2013-02-23T09:50:36.797 回答