如果有多个类实现一个接口,那么@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】:

当你有不止一门课时,你可以做两件事:

    使用@Qualifierannotation 并告诉应该注入哪个实现(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 是如何工作的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

自动装配[@Autowired]的歧义性

SpringBoot中的autowired注解可以修饰接口吗?

关于@Autowired使用注意点

springboot中如何注入一个多个实现类service接口

@Autowired、@Resource和@Qualifier之间的区别

Spring中 如果该Service有多个实现类,它怎么知道该注入哪个ServiceImpl类?