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

时间:2015-03-22 09:13:32

标签: spring model-view-controller automation autowired

(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 个答案:

答案 0 :(得分:7)

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

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

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

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

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

      

    嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   独特的豆类   [com.package.name.UserDao]定义如下:   预期单个匹配bean但找到2:[userDaoImpl1,userDaoImpl2]

    这是很好的解释细节的link