Spring @Autowire、@Qualifier和@Resource注解

场景:当一个接口有多个实现类时,Spring的Bean注入需要指定继承类,主要有以下两种方式:
1、@Resource是JDK提供的注解,默认就是按照byName的方式寻找bean,一般一个name对应一个bean,当找不到与名称匹配的bean才会按照类型装配(byType)
2、@Autowire + @Qualifier
@Autowire注解按照类型,即注解的字段的类型寻找该类型的实例bean,这种方式成为byType。这种方式会引发歧义,比如UserDAO整个框架可能有N多个该对象,那么Spring框架会采用一定规则寻找bean(转换为byName寻找,失败后报错)
@Qualifier(“XXX”)Spring的Bean注入配置注解,该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的bean,这样就消除了byType方式产生的歧义

接口:

public interface UserService {
    User findById(int id);
}

实现类:

@Service("userService1")
@Transactional("firstTransactionManager")
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
    @Override
    public User findById(int id) {
        return this.userRepository.findOne(id);
    }
}

@Service("userService2")
@Transactional("secondTransactionManager")
public class UserSecondServiceImpl implements UserService {
    @Autowired
    private UserSecondRepository userRepository;
    @Override
    public User findById(int id) {
        return this.userRepository.findOne(id);
    }
}

注入方式:

@Autowired
@Qualifier("userService3")
private UserService userService;
------------------------------ or
@Resource(name="userService3")
private UserService userService;

你可能感兴趣的:(Spring)