@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)

相关推荐

  • 初识正则表达式

    技术初识正则表达式 初识正则表达式1 # 计算器 每天写一个小时2 # 选课系统 每天一个小时3 # re模块4 """正则表达式""" # *****非常重要5 """6 所有的模块要经历的两个步

    礼包 2021年11月15日
  • Git操作命令

    技术Git操作命令 Git操作命令1、新建代码库# 公众号:AllTests软件测试# 在当前目录新建一个Git代码库
    $ git init# 新建一个目录,将其初始化为Git代码库
    $ git ini

    礼包 2021年11月23日
  • 什么是TeamGantt

    技术什么是TeamGantt本篇内容主要讲解“什么是TeamGantt”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是TeamGantt”吧!  TeamGantt是一款

    攻略 2021年11月12日
  • 用比喻的修辞手法写一句话,用比喻和排比的手法写一句话

    技术用比喻的修辞手法写一句话,用比喻和排比的手法写一句话1、比喻:天边的一弯明月像条小船。 2、排比:不忘初心用比喻的修辞手法写一句话,牢记来时的根;不忘初心,走好现在的路;不忘初心,坚定未来的梦。 1、比喻:喻是一种

    生活 2021年10月22日
  • 女娲补天翻译,神话故事英语简短300

    技术女娲补天翻译,神话故事英语简短3001女娲补天翻译、女娲补天英文:
    It is said that there was no man when the sky andthe earth were separated

    生活 2021年10月22日
  • css技术有什么优点

    技术css技术有什么优点这篇文章主要讲解了“css技术有什么优点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css技术有什么优点”吧!CSS是Cascading Sty

    攻略 2021年12月10日