@Resource和@Autowired都是Spring容器在启动时做bean的自动注入时使用的
@Resource的用法
1、name和type都没有指定时,优先找name为当前变量名的bean,根据name找不到时则去找type为当前变量类型的bean
2、只使用name属性,则使用byName的自动注入策略,bean的name是不允许重复的
3、只使用type属性,则使用byType自动注入策略,从上下文中找到唯一的bean进行装配,找不到或是找到多个都会抛出异常
4、如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
//TODO
}
@Resource(name = "jobTrigger")
private CronTrigger cronTrigger;
//name和type都没有指定时,优先找name为restTemplate的bean,根据name找不到时则去找type为RestTemplate的bean
@Resource
private RestTemplate restTemplate;
@Resource(type = RestTemplate.class)
private RestTemplate restTemplate;
@Service("cService")
public class CommonServiceImpl implements ICommonService {
//TODO
}
@Service("cService2")
public class CommonService2Impl implements ICommonService {
//TODO
}
@Resource(name = "cService",type = ICommonService.class)
private ICommonService commonService;
//没有指定name和type时,优先找name为cService2的bean,根据name找不到时则去找type为ICommonService的bean
@Resource
private ICommonService cService2;
@Autowired的用法
1、默认是按照类型装配依赖对象(等同于@Resource(type = ***.class))
2、要求依赖对象必须存在,如果依赖对象允许null值,可以设置它的required属性为false
3、如果我们想按照名称(等同于@Resource(name= "***"))来装配,可以结合@Qualifier注解一起使用
4、上述例子中的接口ICommonService如果不止CommonServiceImpl一个实现类时,装配接口类时会报错
a、在其中一个实现类加@Primary注解,装配接口类会默认装配该实现类
b、同3中在装配接口类时使用结合@Qualifier使用,指定唯一的实现类
c、直接装配实现类
@Autowired
private CommonServiceImpl commonService;
@Autowired(required = false)
@Qualifier("cService")
private ICommonService commonService;
@Service("cService2")
@Primary
public class CommonService2Impl implements ICommonService {
//TODO
}
//未指定Qualifier时默认加载CommonService2Impl,当CommonService2Impl未加Primary注解直接装配接口类会报错
@Autowired
private ICommonService commonService2;
//加载CommonServiceImpl则须指定Qualifier
@Autowired
@Qualifier("cService")
private ICommonService commonService;
@Autowired
public SMController(@Qualifier("cService2") ICommonService commonService) {
this.commonService = commonService;
}