@Autowired和@Resource的区别

@Resource

有两个常用属性name、type,所以分4种情况

  1. 指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常
  2. 指定name:通过name找到唯一的bean,找不到抛出异常
  3. 指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
  4. 都不指定:通过字段名作为key去查找,找到则赋值;找不到则再通过字段类型去查找,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException

@Autowired

@Autowired由Spring提供,只按照byType注入

@Autowired只有一个属性required,默认值为true,为true时,找不到就抛异常,为false时,找不到就赋值为null

@Autowired按类型查找,如果该类型的bean不唯一,则抛出异常;可通过组合注解解决@Autowired()@Qualifier("baseDao")

相同点

  1. Spring都支持
  2. 都可以作用在字段和setter方法上

不同点

  1. Resource是JDK提供的,而Autowired是Spring提供的
  2. Resource不允许找不到bean的情况,而Autowired允许(@Autowired(required = false)
  3. 指定name的方式不一样,@Resource(name = "baseDao"),@Autowired()@Qualifier("baseDao")
  4. Resource默认通过name查找,而Autowired默认通过type查找

总结

@Autowired自动注解,一个类,俩个实现类,Autowired就不知道注入哪一个实现类,需要配合@Qualifier按照name注入,而Resource有name属性,可以区分。

举例说明

@Autowired

在service层,让StudentServiceImpl1,StudentServiceImpl2实现StudentService借口

在controller层,使用@Autowired注入则会抛出异常,idea直接提示使用@Qualifier进行区分,解决方案有四种:

1:@Autowired+@Qualifier("studentServiceImpl1")则可以进行区分

2:去掉一个StudentService的实现类,则可以直接按照类型进行装配

3:**@Autowired+@Primary****,自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。(只对接口的多个实现生效)

4: @Resource(name = "studentServiceImpl1"),不指定name会抛出异常。如果只有StudentServiceImpl1,删掉StudentServiceImpl2,则可以直接使用@Resource,根据类型查找唯一值

@Service
public class StudentServiceImpl1 implements StudentService { @Override
public void getStudentAge() {
System.out.println("查到学生的年龄");
}
} @Service
public class StudentServiceImpl2 implements StudentService { @Override
public void getStudentAge() {
System.out.println("查到学生的年龄");
}
}

错误写法:

@Slf4j
@RestController
public class StudentController {
@Autowired
StudentService studentService;
@RequestMapping("/student")
public String handle01(){
studentService.getStudentAge();
return "student";
}
}

正确的@Autowired+@Qualifier写法:

@Slf4j
@RestController
public class StudentController {
@Autowired
@Qualifier("studentServiceImpl1")
StudentService studentService;
@RequestMapping("/student")
public String handle01(){
studentService.getStudentAge();
return "student";
}
}

正确的@Autowired+@Primary写法:

@Service
@Primary
public class StudentServiceImpl1 implements StudentService {
@Override
public void getStudentAge() {
System.out.println("查到学生的年龄");
}
}

正确的@Resource写法:

@Slf4j
@RestController
public class StudentController {
@Resource(name = "studentServiceImpl1")
StudentService studentService;
@RequestMapping("/student")
public String handle01(){
studentService.getStudentAge();
return "student";
}
}

Springboot笔记<4>@Autowired和@Resource的区别的更多相关文章

  1. java @Autowired与@Resource的区别

    @Autowired与@Resource的区别     1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认 ...

  2. Spring 注释 @Autowired 和@Resource 的区别

    Spring 注释 @Autowired 和@Resource 的区别 一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired ...

  3. @Autowired 与@Resource的区别(详细)

    参考:@Autowired 与@Resource的区别(详细) spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@Pos ...

  4. java面试题之@Autowired和@Resource的区别

    @Autowired和@Resource的区别: 1.都可以用来装配bean,都可以写在字段或者方法上: 2. @Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果允许为nul ...

  5. @Autowired 与@Resource的区别详解

    spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  6. 关于@Autowired和@Resource注解区别

    区分一下@Autowired和@Resource两个注解的区别: 1.@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配 2.@A ...

  7. @Autowired 与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2  @Autowired默认按类型装配(这个注解是属业spring的),默认情况下 ...

  8. @Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  9. spring @Autowired或@Resource 的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属于spring的),默认情况下必 ...

  10. Spring中@Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

随机推荐

  1. rust学习笔记(3)

    变量 变量默认是不可变的 不能使用没有初始化的变量 作用域 变量离开作用域之后会直接释放, 无法再次使用; 在内部代码块中定义的变量会导致外部的变量被遮蔽 类型转换 部分类型可以隐式转换, 部分类型需 ...

  2. windows goland go exec "gcc": executable file not found in %PATH%

    问题 windows 本地缺少 gcc 编译器 解决方案 下载安装使用 MinGW-w64 第一种 https://winlibs.com/#download-release 下载后解压到磁盘中,然后 ...

  3. 查看、安装python指定版本的包、安装卸载第三方模块

    python安装/卸载第三方包 (1)安装第三方包: 安装指令pip install xxx (xxx,需安装的包名) 安装特定版本的package:通过使用==, >=, <=, > ...

  4. docker pause 命令使用

    暂停正在运行的镜像容器 用途是在启动的容器的过程又的容器启动快了 有的还没有就绪 调试过程使用 a3: 正在运行的镜像容器简称 暂停: docker pause a3 解除暂停: docker unp ...

  5. 小白的第一篇blog

    Markdown学习 1.标题 要写标题可用#加空格,再下字,然后再用回车键. 2.字体 1.粗体打法:在文字两侧加两个* 如:hello world! 2.斜体打法:在文字两侧加一个* 如: hel ...

  6. 【JDBC第7章】DAO及相关实现类

    第7章:DAO及相关实现类 DAO:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create.Retrival.Update.Delete),而不包含任何业务相 ...

  7. 最爱lx-music的音源哪里去了?

    最爱lx-music,让你满心喜欢,可是音源没有了,因为被投诉给全部关了. 公心作者增加了自定义源. 六音提供了音源,做了一件大善事.注意的是音源会一直初始化.那就下载适合的版本: 欣赏阿鲁阿卓如痴如 ...

  8. cxGrid布局的保存和恢复

    //恢复布局IniFileName := ExtractFilePath(Application.ExeName) + 'Layout/' + Self.Name + '.ini';if FileEx ...

  9. 一文速通Python并行计算:06 Python多线程编程-基于队列进行通信

    一文速通 Python 并行计算:06 Python 多线程编程-基于队列进行通信 摘要: 队列是一种线性数据结构,支持先进先出(FIFO)操作,常用于解耦生产者和消费者.慢速生产-快速消费场景中,队 ...

  10. eclipse安装OpenExplorer插件--快速打开文件目录

    eclipse安装OpenExplorer插件--快速打开文件目录功能: 1.下载: github: 下载地址:https://github.com/samsonw/OpenExplorer/down ...