Spring MVC - @Autowired如何运作?

时间:2014-01-22 06:53:29

标签: java spring spring-mvc dependency-injection autowired

我正在使用Java和Spring开发Web应用程序。我是春天的新人,所以作为一个学习的机会,我基本上得到了一个现有的应用程序,并被告知要扩展它。 我无法理解@Autowired的工作方式。我理解依赖注入的高级概念,但我想知道@Autowired注释如何知道要注入的接口的具体实现?

为了将我的问题放到上下文中,我将解释我遇到的问题:

  

我有一个名为 PostDao 接口,以及一个名为 PostDaoImpl ,它实现了 PostDao < / strong>即可。然后我有另一个名为 PostDaoPublicImpl ,它扩展了 PostDaoImpl 。这些类存在于我的持久层中。

     

然后我有一个名为 PostService 接口,以及一个名为 PostServiceImpl ,它实现了 PostService 即可。然后,我有另一个名为 PostServicePublicImpl ,它扩展了 PostServiceImpl 。这些类存在于我的服务层中。

PostServiceImpl 中,以下行注入以下对象:

@Autowired private PostDao postDao; 
//This injects an object of the class PostDaoImpl

我的问题是,在 PostServicePublicImpl 中我如何获得与上面相同的声明,但是它注入了类 PostDaoPublicImpl 的对象:

@Autowired private PostDao postDao; 
//This injects an object of the class PostDaoPublicImpl

我觉得如果我理解@Autowired注释是如何工作的,那么我将能够解决这个问题。任何有关解决问题的帮助和建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

首先,您需要understand how Autowiring works

然后在bean定义中,定义 autowire strategy - 对于我们的案例,让它为 byName

<bean id="postDaoPublicImpl" class="com.yourpackage.PostDaoPublicImpl" autowire="byName" />

这意味着,如果任何类有一个名为“postDaoPublicImpl”的属性,它是上面bean的bean id,将自动注入bean实例

之后在您的班级PostServicePublicImpl定义属性,如此

class PostServicePublicImpl  {

@Autowired private PostDaoPublicImpl postDaoPublicImpl; 
//here Spring will auto inject PostDaoPublicImpl implementation, since this property name matches the bean id and (auto wiring strategy is "byName")

}

答案 1 :(得分:1)

我找到了解决问题的简单方法。使用@Qualifier标记,我可以为接口的每个实现提供唯一的名称。然后在自动连接对象时,我只提供一个限定符,并且注入与限定符匹配的实现的对象。

答案 2 :(得分:0)

将此添加到您的applicationContext

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>