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

luo*_*hao 8 model-view-controller spring automation autowired

(春天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){
                ......
        }
}
Run Code Online (Sandbox Code Playgroud)

Nen*_*zic 8

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

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

    @Autowired
    @Qualifier("userDaoImpl2")
    private UserDao userDao;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你可以@Primary在bean上使用,这样当一个实现有多个接口时,总是优先于另一个实现@Autowire.

可以根据应该知道自动装配的一方做出选择,如果你想要注入依赖关系的类很容易改变而不知道实现细节你应该选择2,如果你想控制依赖关系选项1是更好的选择.

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

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

这是解释细节的好链接.