1 基本说明
1.1 相同点
@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
1.2 不同点
@Autowird 属于spring框架,默认使用类型(byType)进行注入,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置非必须 ,也可以结合@Qualifier注解指定名称进行使用。
@Resource是JavaEE自带的注解,默认按照名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时再按照类型(byType)进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
2 @Autowird
2.1 只有一个实现类时
@Autowird 属于spring框架,默认使用类型(byType)进行注入,例如下面代码:
public interface TestService {
void test();
}
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl1 implements TestService{
@Override
public void test() {
System.out.println("TestServiceImpl1 test 方法 ");
}
}
然后在使用时注入
@Autowired
private TestService testService;
系统会根据接口进行注入,如果这个接口只有一个实现类,那么会正常注入,如果没有实现类,它就会报错,可以进行如下处理
@Autowired(required = false)
private TestService testService;
2.2 有多个实现类时
public interface TestService {
void test();
}
然后定义两个实现类
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl1 implements TestService{
@Override
public void test() {
System.out.println("TestServiceImpl1 test 方法 ");
}
}
TestServiceImpl2
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl2 implements TestService{
@Override
public void test() {
System.out.println("TestServiceImpl2 test 方法 ");
}
}
然后在测试使用注入时,必然会报错,因为@Autowired先按照byType匹配,匹配到了“testServiceImpl1”和“testServicempl2”,结果不唯一
@Autowired
private TestService testService;
可以结合@Qualifier
@Autowired
@Qualifier("testServiceImpl1")
private TestService testService;
3 @Resource
@Resource
private TestService testService;
有多个实现类时,@Resource先按照byName匹配,此时的name是“testService”,没有匹配结果,只能按照byType进行配置,此时又匹配到了“testServiceImpl1”和“testServiceImpl2”,结果不唯一,只能抛出异常.
3.1 testServiceImpl1
@Resource
private TestService testServiceImpl1;
这次就能正确执行,并且输出结果为“userServiceImpl1”,@Resource通过byName匹配到了唯一的bean实例