【问题标题】:Some doubts about the use of **@Autowired** annotation and interface declaration in Spring FrameworkSpring Framework中使用**@Autowired**注解和接口声明的一些疑惑
【发布时间】:2013-02-23 09:39:26
【问题描述】:

我是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 类...为什么?是因为 ContactDAOImpl 类使用 @Repository 注释进行了注释吗?

谢谢

安德烈亚

【问题讨论】:

    标签: java spring spring-mvc annotations autowired


    【解决方案1】:

    我的第一个疑问与 ContactDAO 是一个接口有关 那我在接线什么?具体类型: ContactDAOImpl ?如果是,是 做它的 Spring 框架?

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢...另一个问题(可能是愚蠢的)...如果我有像上一个这样的案例会发生什么,在我的 ContactServiceImpl 类中有一个自动连接的 ContactDao 变量,但我有ContactDao 接口的两种不同实现? Spring 选择的实现是什么?
      • Spring 会选择一个被注解的(带有 Repository 或另一个 Spring 组件注解)。如果两者都被注释,您将得到一个异常,并且必须使用限定符注释指定您想要自动装配的一个。这已记录在案:static.springsource.org/spring/docs/3.1.x/…
      【解决方案3】:

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

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

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

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

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

      查看Annotation Configuration 上的 Spring 文档。

      【讨论】:

        猜你喜欢
        • 2013-02-13
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 2015-06-21
        相关资源
        最近更新 更多