如果有多个 类 实现一个接口,那么@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 时,你可以做两件事:
使用 @Qualifier
annotation 并告诉应该注入哪个实现(spring 默认限定符是 bean 的名称)所以这样做将注入第二个 bean 实现:
@Autowired
@Qualifier("userDaoImpl2")
private UserDao userDao;
您可以在 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 解释了细节。
(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 时,你可以做两件事:
使用
@Qualifier
annotation 并告诉应该注入哪个实现(spring 默认限定符是 bean 的名称)所以这样做将注入第二个 bean 实现:@Autowired @Qualifier("userDaoImpl2") private UserDao userDao;
您可以在 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 解释了细节。