@Resource和@Autowired都是自动装配,作用类似,用法有区别。
一、@Resource与@Autowired的区别
@Resource是Java注解。
默认按byName(根据名称进行匹配)进行注入,如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType。
Spring将@Resource注解的name属性解析为bean的名称,type属性解析为bean的类型,如果使用name属性,则使用byName的自动注入策略;如果使用type属性,则使用byType的自动注入策略;如果同时指定name 和type属性(不建议这么做)则注入方式为byType+byName。
@AutoWired是spring的注解。
默认的注入方式为byType(根据类型进行匹配),会优先根据接口类型去匹配并注入 Bean (接口的实现类)。当一个接口存在多个实现类的时候,byType这种方式就无法正确注入对象了,因为这个时候 Spring 会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。这个时候,注入方式会变为 byName(根据名称进行匹配),这个名称通常就是类名(首字母小写)。另外,如果type无法辨别注入对象时,也可以配合@Qualifier或@Primary注解来分辨注入类。
二、@Resourece注入方式有两种。
1、接口+实现类名:
2、接口+接口名,并指定实现类名称:
//正确,注入名称为employeeServiceImpl1的bean
@Resource
private EmployeeService employeeServiceImpl1;
//正确,注入名称为employeeServiceImpl2的bean
@Resource
private EmployeeService employeeServiceImpl2;
//正确,注入名称为employeeServiceImpl2的bean
@Resource(name = "employeeServiceImpl2")
private EmployeeService employeeService;
如果同一个接口有多个同名实现类,需要在@Service的属性中命名实现类来做区分,便于后面注入时指定实现类名称。
@Service("a")
public class EmployeeServiceImpl implements EmployeeService{
......
}
@Service("b")
public class EmployeeServiceImpl implements EmployeeService{
......
}
@Resource(name = "a")
private EmployeeService employeeService;
三、 @Autowired注入方式有三种。
1、接口+实现类名;
2、接口+接口名,并搭配@Qulifier注解指定实现类名称,如:@Qulifier(value="a");
@Autowired
@Qualifier(value = "a")
private EmployeeService employeeService;
如果同一个接口,有多个同名实现类,但不同包,那么也需要在实现类上的@Service属性中命名实现类名称,便于后面引入时做区分。