我正在使用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注释是如何工作的,那么我将能够解决这个问题。任何有关解决问题的帮助和建议都将不胜感激。
答案 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"/>