@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. 测试驱动开发(TDD)浅析

    .wj_nav { display: inline-block; width: 100%; margin-bottom: 0.375rem } .wj_nav span { display: inli ...

  2. go 遍历修改切片数据

    package main import "fmt" type good struct { id int64 sum int64 } func main() { good1 := g ...

  3. SecureCRT配置跳板机

    跳板机(Jump Server),也称堡垒机,是一类可作为跳板批量操作远程设备的网络设备,是运系统管理员或运维人员常用的操作平台之一. 大家知道,在日常的开发中,有可能我们的本机不能够直接连线上的服务 ...

  4. 为什么AI教师难以实现

    提供AI应用咨询+陪跑服务,有需要回复1 本周为一家教育公司提供了全天的AI的培训,后续涉及AI+教育领域的项目开发,而我去年就做过AI教师项目,所以对AI+教育有一定熟悉度. 下来后又拜访了一家互联 ...

  5. Code Runner MCP Server,来了!

    大家好!我是韩老师. 如果作为程序员的你,还不了解 MCP (Model Context Protocol) 的话,那韩老师劝你赶紧去补补课吧! 本文不对 MCP 进行详细介绍~ 简单来说,MCP i ...

  6. Delphi Richedit代码语法加亮显示

    procedure CodeColors(Form : TForm;Style : String; RichE : TRichedit;InVisible : Boolean); const // s ...

  7. Url base64加密

    class UrlEncryption { /** * base64编码 * * @param string * @return string */ public static function en ...

  8. AOP流程及原理

    目录 一.AOP结构介绍 @Pointcut 通知 原理 连接点 拦截器 二.Bean介入点 EnableAspectJAutoProxy AspectJAutoProxyRegistrar Anno ...

  9. 从excle中读取数据的方法

    倒入两个库:ExcelLibrary,Collections 首先,必须注意文件格式为xls 表格内容 open_Excel    C:\\Users\\Beckham\\Desktop\\a.xls ...

  10. Linux四剑客grep、find、sed、awk使用

    ‌介绍 Linux四剑客‌是指在Linux系统中非常常用的四个命令工具,它们分别是grep.find.sed和awk.这四个工具在Linux系统中具有非常强大的功能,可以方便快捷地对文本进行搜索.处理 ...