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

if there are more than one classes implementing one interface ,then how does @autowired work?

(spring mvc)首先我不知道下面写的是对还是not.if是对的,然后我不明白@autowired是如何工作的here.if是错误的,那么当我有多个类来实现一个接口时我该怎么办

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

当你拥有多个 class 时,你可以做两件事:

  1. 使用 @Qualifierannotation 并告诉应该注入哪个实现(spring 默认限定符是 bean 的名称)所以这样做将注入第二个 bean 实现:

    @Autowired
    @Qualifier("userDaoImpl2")
    private UserDao userDao;
    
  2. 您可以在 bean 上使用 @Primary,这样当有多个实现且接口为 @Autowire.

    时,一个实现总是优先于另一个实现

可以根据应该了解自动装配的方面进行选择,如果您希望 class 注入依赖项的 es 易于更改并且不知道实现细节,您应该选择 option 2 如果你想控制依赖关系 option 1 是更好的选择。

如果存在多个选项 Spring 应该抛出异常(因此您的代码应该抛出异常告诉您存在不止一个自动装配候选者)。它应该看起来像:

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.package.name.UserDao] is defined: expected single matching bean but found 2: [userDaoImpl1, userDaoImpl2]

这里很好 link 解释了细节。