如果有多个类实现一个接口,那么@autowired 是如何工作的? [复制]
Posted
技术标签:
【中文标题】如果有多个类实现一个接口,那么@autowired 是如何工作的? [复制]【英文标题】:if there are more than one classes implementing one interface ,then how does @autowired work? [duplicate] 【发布时间】:2015-05-25 09:44:51 【问题描述】:(spring mvc)首先我不知道下面写的对不对。如果是对的,那么我不明白@autowired在这里是如何工作的。如果是错的,那么我应该怎么做我有不止一个类来实现一个接口。
public interface UserDao
public User findUserByUserName(String username);
public class UserDaoImpl1 implements UserDao
@Override
public User findUserByUserName(String username)
.......
public class UserDaoImpl2 implements UserDao
@Override
public User findUserByUserName(String username)
.......
@Service
public class UserServiceImpl implements UserService
@Autowired
private UserDao userDao;//how does atuowired work here?
@Override
public User loginCheck(User user)
......
【问题讨论】:
你检查了吗? 【参考方案1】:当你有不止一门课时,你可以做两件事:
使用@Qualifier
annotation 并告诉应该注入哪个实现(spring 默认限定符是 bean 的名称),这样做将注入第二个 bean 实现:
@Autowired
@Qualifier("userDaoImpl2")
private UserDao userDao;
您可以在 bean 上使用 @Primary
,这样当有多个实现且接口为 @Autowire
时,一个实现总是优于另一个实现。
可以根据应该了解自动装配的一方来进行选择,如果您希望注入依赖项的类易于更改并且不知道实现细节,您应该使用 选项 2 并且如果你想控制依赖选项1是更好的选择。
如果存在多个选项,Spring 应该抛出异常(因此您的代码应该抛出异常,告诉您存在多个自动装配候选者)。它应该看起来像:
嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 独特的 bean 类型 [com.package.name.UserDao] 定义: 预期单个匹配 bean,但找到 2:[userDaoImpl1, userDaoImpl2]
这里是很好的link,它解释了细节。
【讨论】:
这没有回答您的问题,您需要进一步澄清吗? 谢谢你的好意,对我帮助很大。我学习Spring或者编程的时间不长,感觉不用考虑太多就熟悉了。再次感谢您。 我问这个是因为你首先接受了而不是不接受的答案,所以我认为缺少一些东西。如果它解决了您的问题,请接受答案,其他人也会将其视为已回答,这就是 SO 的工作原理。 对不起,我会记住的。 如果使用这个-那么它将紧密耦合对吗????-我们不想使用紧密耦合的@Autowired @Qualifier("userDaoImpl2") private UserDao userDao以上是关于如果有多个类实现一个接口,那么@autowired 是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot中的autowired注解可以修饰接口吗?
springboot中如何注入一个多个实现类service接口