@Autowired与@Resource区别

Bertha 。 2023-10-07 20:04 55阅读 0赞
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)进行注入,例如下面代码:

  1. public interface TestService {
  2. void test();
  3. }
  4. import org.springframework.stereotype.Service;
  5. @Service
  6. public class TestServiceImpl1 implements TestService{
  7. @Override
  8. public void test() {
  9. System.out.println("TestServiceImpl1 test 方法 ");
  10. }
  11. }

然后在使用时注入

  1. @Autowired
  2. private TestService testService;

系统会根据接口进行注入,如果这个接口只有一个实现类,那么会正常注入,如果没有实现类,它就会报错,可以进行如下处理

  1. @Autowired(required = false)
  2. private TestService testService;
2.2 有多个实现类时

在这里插入图片描述

  1. public interface TestService {
  2. void test();
  3. }

然后定义两个实现类

  1. import org.springframework.stereotype.Service;
  2. @Service
  3. public class TestServiceImpl1 implements TestService{
  4. @Override
  5. public void test() {
  6. System.out.println("TestServiceImpl1 test 方法 ");
  7. }
  8. }

TestServiceImpl2

  1. import org.springframework.stereotype.Service;
  2. @Service
  3. public class TestServiceImpl2 implements TestService{
  4. @Override
  5. public void test() {
  6. System.out.println("TestServiceImpl2 test 方法 ");
  7. }
  8. }

然后在测试使用注入时,必然会报错,因为@Autowired先按照byType匹配,匹配到了“testServiceImpl1”和“testServicempl2”,结果不唯一

  1. @Autowired
  2. private TestService testService;

可以结合@Qualifier

  1. @Autowired
  2. @Qualifier("testServiceImpl1")
  3. private TestService testService;
3 @Resource
  1. @Resource
  2. private TestService testService;

有多个实现类时,@Resource先按照byName匹配,此时的name是“testService”,没有匹配结果,只能按照byType进行配置,此时又匹配到了“testServiceImpl1”和“testServiceImpl2”,结果不唯一,只能抛出异常.

3.1 testServiceImpl1
  1. @Resource
  2. private TestService testServiceImpl1;

这次就能正确执行,并且输出结果为“userServiceImpl1”,@Resource通过byName匹配到了唯一的bean实例


发表评论

表情:
评论列表 (有 0 条评论,55人围观)

还没有评论,来说两句吧...

相关阅读