Spring 如果有多个类实现一个接口,@autowired是如何工作的?

Spring 如果有多个类实现一个接口,@autowired是如何工作的?,spring,model-view-controller,automation,autowired,Spring,Model View Controller,Automation,Autowired,(spring mvc)首先,我不知道下面的文字是否正确。如果它是正确的,那么我不理解@autowired在这里是如何工作的。如果它是错误的,那么当我有多个类来实现一个接口时,我应该怎么做 public interface UserDao{ public User findUserByUserName(String username); } public class UserDaoImpl1 implements UserDao{ @Override public U

(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){
                ......
        }
}

当您有多个课程时,您可以做两件事:

  • 使用
    @Qualifier
    注释并告诉应该注入哪个实现(spring默认限定符是bean的名称),这样做将注入第二个bean实现:

    @Autowired
    @Qualifier("userDaoImpl2")
    private UserDao userDao;
    
  • 您可以在bean上使用
    @Primary
    ,这样当存在多个实现且接口为
    @Autowire
    时,一个实现总是比另一个实现更可取

  • 可以根据应该了解自动布线的方面进行选择,如果您希望注入依赖项的类易于更改并且不知道实现细节,则应使用选项2,如果您希望控制依赖项,则选项1是更好的选择

    若存在多个选项,Spring应该抛出异常(所以您的代码应该抛出异常,告诉您存在多个自动连接候选项)。它应该是这样的:

    嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 类型的唯一bean [com.package.name.UserDao]定义为: 应为单个匹配bean,但找到2:[userDaoImpl1,userDaoImpl2]


    这是解释细节的好方法。

    您检查过了吗?这并没有回答您的问题,你需要更多的东西来澄清吗?谢谢你的帮助。它帮助了我很多。我已经学习了很长一段时间的Spring或编程,我觉得在我熟悉它之前我没有必要考虑太多。再次感谢。我问这个是因为你第一次接受了,而不是未被接受的答案,所以我觉得有些东西是。丢失的请接受答案,如果它解决了您的问题,其他人也会认为它是被回答的,这就是它的工作原理。我很抱歉。我会记住它。如果使用这个-那么它将是紧密耦合的权利???-我们不想使用tighly耦合的@Autowired@Qualifier(“userDaoImpl2”)私有UserDao UserDao