(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){
......
}
}
答案 0 :(得分:7)
当你有多个课程时,你可以做两件事:
使用@Qualifier
注释并告诉应该注入哪个实现(spring default限定符是bean的名称),这样做会注入第二个bean实现:
@Autowired
@Qualifier("userDaoImpl2")
private UserDao userDao;
您可以在bean上使用@Primary
,这样当一个实现有多个且接口为@Autowire
时,总是优先于另一个实现。
可以根据应该了解自动装配的方面进行选择,如果您希望注入依赖关系的类很容易更改并且不知道应该使用选项2 的实现细节,如果你想控制依赖关系选项1 是更好的选择。
如果存在多个选项,Spring应该抛出异常(因此您的代码应抛出异常,告诉您存在多个自动装配候选者)。它应该看起来像:
嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 独特的豆类 [com.package.name.UserDao]定义如下: 预期单个匹配bean但找到2:[userDaoImpl1,userDaoImpl2]
这是很好的解释细节的link。