@Autowired 与@Resource的异同点

技术@Autowired 与@Resource的异同点 @Autowired 与@Resource的异同点前言
最近写代码的时候,碰到一个小问题;可以看到,Spring Boot不推荐使用@Autowi

@Autowired和@Resource的异同

前言

最近写代码的时候,遇到了一个小问题;

可以看出,Spring Boot不建议使用@Autowired进行属性注入。

我以前也是这样写的,从来没觉得有什么不对。看到这个错误,我咯噔一下,然后突然想,@Autowired和@Resource有什么区别?

然后我发现我完全记不住了。

因此,写下这张纸条来记录它。

解释为什么Spring Boot不建议使用@Autowired进行属性注入。

@Autowired是spring定义的注释,与Spring框架强耦合,如果换成其他框架可能不支持。

@Resource是JSR-250定义的一个注释,它是一个支持几乎所有spring mvc的Java标准。

换句话说,@Autowired工作,@Resource工作,@Autowired不工作,@Resource仍然工作。

但是现在java程序员几乎和Spring程序员平起平坐,所以这样说似乎没有必要。

简单举例

LaymanController.java

@控制器

公共类LaymanController(

@自动连线

公共LaymanService laymanService

@GetMapping(值='/sayHello ')

public void SayHello(){ 0

laymanservice . SayHello();

}

}

LaymanService

公共接口LaymanService {

void SayHello();

}

LaymanServiceImpl

@服务

公共类LaymanServiceImpl实现LaymanService{

public void SayHello(){ 0

system . out . println(‘你好,我是外行’);

}

}

@Autowired

@Autowired是默认的按类型注入.默认情况下,它要求依赖对象必须存在。如果允许空值,其必需的属性可以设置为false。

公共@接口Autowired {

#注册时必须存在此类型。如果不存在,将报告错误。

boolean必选()默认值为true

}

如果注入类型可能为空,可以按如下方式配置:@Autowired(必选=false)

无论如何,让我们谈谈以下示例的加载顺序:

@自动连线

公共LaymanService laymanService

项目启动后,因为我们在LaymanServiceImpl上配置了@Service注释,它将被CompentScan扫描到容器中,并注册为bean。

因为没有指定name属性,所以用默认值(类名的第一个字母改为小写)命名bean(laymanServiceImpl)

@Autowired查找laymanService类型的bean,如果没有,则查找名为LaymanService的bean。

显然,有一个名为laymanServiceImpl(多态)的LaymanService类型的bean,注入成功了!

做个小改动,让它报个错

此时,我们添加另一个名为LaymanServiceImpl2的类。

LaymanServiceImpl2.java

@服务

公共类LaymanServiceImpl2实现LaymanService{

public void SayHello(){ 0

系统退出

.println("你好,我是layman2");
}
}

此时,IOC容器中,存在两个类型为LaymanService的bean,一个名为laymanServiceImpl,另一个名为laymanServiceImpl2

那么,项目启动会报错,为什么

因为@Autowired默认按类型匹配,而且只匹配一个,现在找到两个,它不知道应该注入哪个

于是它纠结,迷茫,最后一咬牙,还是报错吧。

如何解决该BUG

使用@Qualifier 注解。

修改代码。

LaymanServiceImpl2改动如下:

@Service("laymanService")
public class LaymanServiceImpl2 implements LaymanService{
	public void sayHello(){
		System.out.println("你好,我是layman"); 
	}		
}

@Service("laymanService")为LaymanServiceImpl2 指定bean的name属性

LaymanController.java 改动如下:

	@Autowired
	@Qualifier("laymanService")
    public LaymanService laymanService;

@Autowired扫描到两个类型为LaymanService 的bean,但是@Qualifier指定了bean的名称,因此它会去查找名为laymanService的bean,找到一个,装配成功!

@Autowired加载顺序图

@Resource

@Resource默认按名称进行装配,且有两个极其重要的属性:name和type

Spring将@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。

逻辑

如果既不指定name,也不指定type,则按照Name进行装配(默认为变量名)
如果指定name,则从上下文中查找名称(id)唯一匹配的bean进行装配,找不到则抛出异常
如果指定type,则从上下文中找到类型唯一匹配的bean进行装配,找不到或者找到多个,抛出异常
如果同时指定name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

// 默认查找名为laymanService的bean,如果找到唯一一个,则匹配,如果找不到,再按类型去查找
@Resource  
public LaymanService laymanService;

@Resource的装配顺序

  1. 既不指定name,也不指定type

  2. 指定name

  1. 指定type

  2. 同时指定name和type

为什么不推荐使用@Autowired,可是依然那么人用

  • 历史遗留问题(以前就这一种方式,开发用习惯了,改不了。)
  • 省事,bean的名字不用写。(按类型匹配,只要扔个@service就行了),@resource要写@service("service_name"),否则就要两次查找,浪费性能。(@resource先找name,因为默认名不匹配,所以找不到,还会再找type,而@Autowired直接找type)

但是,架构设计考虑性能的话,推荐使用@resource

一是因为耦合度,契合大部份java框架。
二是写上@service("service_name"),访问速度会很快,毕竟可以通过name精准搜索。

缺点是,每个bean都要手动添加name属性。

补充

@AutowiredcommonAnnotationBeanPostProcessor处理器负责处理,而@ResourceautowiredAnnotationBeanPostProcessor处理器负责处理。

有兴趣的可以看看源码:

推荐的源码博客:https://blog.csdn.net/ijavaweb/article/details/25553231

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/157193.html

(0)

相关推荐

  • Mac v1.3.3如何使用专业视频转码器手刹?

    技术Mac专业的视频转码器HandBrake for Mac v1.3.3怎么用Mac专业的视频转码器HandBrake for Mac v1.3.3怎么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因

    攻略 2021年12月24日
  • 井川,日本有没有“常叶”这个姓

    技术井川,日本有没有“常叶”这个姓鹤田 香取 野泽 麻生 小田切 草翦 稻垣 木村 中居 濑户 山下 酒井 松本 石田 柴崎 藤原 福山 江口 唐泽 长泽 椎名 松岛 白石 铃木

    生活 2021年10月28日
  • JAVA多线程怎么实现用户任务排队并预估排队时长

    技术JAVA多线程怎么实现用户任务排队并预估排队时长这篇文章主要介绍“JAVA多线程怎么实现用户任务排队并预估排队时长”,在日常操作中,相信很多人在JAVA多线程怎么实现用户任务排队并预估排队时长问题上存在疑惑,小编查阅

    攻略 2021年12月9日
  • 如何理解Java设计模式责任链模式

    技术如何理解Java设计模式责任链模式本篇文章给大家分享的是有关如何理解Java设计模式责任链模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、责任链模

    攻略 2021年10月23日
  • 偶数的概念,奇数和偶数的概念0是什么数

    技术偶数的概念,奇数和偶数的概念0是什么数1993年我国颁布的《中华人民共和国国家标准》(GB3100-3102-93)《量和单位》(11-2.9)P311页,规定自然数包括0。在以往的教学中,关于自然数的组成,有两种情

    生活 2021年10月24日
  • C#操作Excel实现的实例分析

    技术C#操作Excel实现的实例分析C#操作Excel实现的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#操作Excel是怎么样执行的呢?我们在

    攻略 2021年11月24日