@Autowired与@Resource区别
  TEZNKK3IfmPf 2023年11月13日 38 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)进行注入,例如下面代码:

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 有多个实现类时

@Autowired与@Resource区别

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实例


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   17天前   40   0   0 java
TEZNKK3IfmPf