spring源码-@Autowired、@Resource注解底层原理

Spring框架中@Autowired与@Resource注解使用对比及最佳实践 配置类和@Bean注解提供了一种强大的方式来定义和优化Spring中的依赖注入。使用可以创建复杂的Bean配置,并通过@Bean注解来明确指出每个Bean的创建方法。进一步地,通过@Autowired和@Resource在@Bean方法中的应用,可以灵活地控制依赖项的注入,最终实现精确的依赖管理。高级模式如@Primary和@Profile注解,则为在不同的运行环境下管理和选择正确的Bean提供了便利。 阅读详情

上篇博客说了自动注入模型的使用,这篇笔记打算记录下自动注入模型中,autowireMode为0的情况,也就是我们经常用到的@Autowired、@Resource注解的原理

首先对于这两个注解,都是由后置处理器来完成解析的,解析的时机是一样的,在第六个后置处理器执行的时候;但是是由不同的后置处理器来完成解析的
@Autowired注解:

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues

@Resource注解:

org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues

前言

1、这两个注解,都是在第六个后置处理器执行的时候,进行解析的,但是在第三个处理器

org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

执行的时候,会先解析一下当前bean中有哪些属性要进行注入,在第六个后置处理器执行的时候,就无须进行解析,直接从map中获取要注入的属性即可

2、这两个注解虽然是由不同的后置处理器处理的,但是处理的思想、步骤大致都是一样的:

  1. 会先尝试获取bean中添加了该注解的方法(method)和属性(field)
  2. 找到之后,会根据实现类的优先级、或者是name等从容器中或者beanDefinitionMap中找到对应的属性
  3. 通过filed.set()完成属性的注入

3、这里有几个点要先行说明:

  • 对于@Resource注解,会根据要注入属性的name,从单实例池中获取bean,完成属性注入
  • 对于@Autowired注解,我们通常说是现根据类型注入,如果找到多个或者没有找到,再根据name进行注入;这里要说明的是:spring在解析@Autowired注解的时候,并不是直接从单实例池中查找bean,而是先从beanDefinitionMap中,根据type查找,如果找到多个,再根据name从单实例池中查找,只有找到确定要注入哪个类,才会从单实例池中找到对应的bean,完成注入
  • 当然,和@Autowired注解配合使用的注解有好几个,在下面会一一解析

@Autowired

在这里插入图片描述
这是@Autowired注解解析的整个流程,其中,和@Autowired注解配合使用的有几下几个注解:
@Qualifier
@Primary
@Priority

第一个注解使用在field上,在根据类型从beanDefinitionMap中找到bean之后,会判断哪个beanName是否是合格的;如果要注入的bean有多个实现类,会优先注入@Qualifier注解指定的实现类

第二个直接是在类上使用的,在未添加@Qualifier注解的场景下,如果有多个实现类,会判断哪个实现类上添加了@Primary注解,添加了,就注入该实现类

第三个注解也是加载类上,如果既没有添加@Qualifer、也没有添加@Priority注解,那么,会判断哪个实现类的优先级比较高,值越小,优先级越高

这是

org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency

的部分代码

/**
 * @Autowired注解源码 三
 *  查找要注入的bean,按照type来查找,如果匹配到一个,就获取到这个实例,然后返回,返回之后,会调用field.set();注入进去
 *  如果找到了多个,那就先判断哪个实现类有@primary注解,如果都没有注解,那就判断priority的优先级
 *
 *  这个方法中,对Qualifier注解进行了处理;如果一个接口有多个实现类,但是没有加@Qualifier注解,那么就会返回多个
 *
 *  如果@Qualifier指定的value在spring容器中没有,这里返回的map集合就是空
 *
 */
Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
if (matchingBeans.isEmpty()) {
	if (isRequired(descriptor)) {
		// 如果匹配到的要注入的bean是null,就报错
		raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
	}
	return null;
}

String autowiredBeanName;
Object instanceCandidate;

if (matchingBeans.size() > 1) {
	/**
	 * 如果根据类型,匹配到有多个bean,那就判断@Primary注解和@Priority注解;
	 *  所以:可以得出一个结论:
	 * 	  当一个接口有多个实现类的时候,添加了@Qualifier注解,同时在一个类上添加了@Primary注解,那么会注入@Qualifier注解对应的bean
	 *
	 * 	在下面的这个推断方法中:
	 * 	 1.会先判断@Primary注解
	 * 	 2.再判断@Priority注解声明的优先级
	 * 	 3.如果两个注解都没有,那就根据controller中注入的service的name和matchingBeans中的beanName进行匹配
	 * 	   如果匹配上,就注入匹配上的beanName对应的beanClass
	 * 	   这里需要注意的是:根据name查询的时候,会先根据type从beanDefinitionMap中查询到符合类型的beanDefinitionNames
	 * 	   然后从beanDefinitionNames中依次匹配,是否和name一致
	 */
	autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);
	if (autowiredBeanName == null) {
		if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {
			return descriptor.resolveNotUnique(type, matchingBeans);
		}
		else {
			// In case of an optional Collection/Map, silently ignore a non-unique case:
			// possibly it was meant to be an empty collection of multiple regular beans
			// (before 4.3 in particular when we didn't even look for collection beans).
			return null;
		}
	}
	/**
	 * 如果能找到一个,那就根据name获取到对应的instance实例,然后再field.set();
	 */
	instanceCandidate = matchingBeans.get(autowiredBeanName);
}
else {
	// We have exactly one match.
	Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();
	autowiredBeanName = entry.getKey();
	instanceCandidate = entry.getValue();
}

if (autowiredBeanNames != null) {
	autowiredBeanNames.add(autowiredBeanName);
}
if (instanceCandidate instanceof Class) {
	/**
	 * 根据获取到的beanName和type从容器中查找。如果没有找到,就创建
	 * 这里才是真正的从单实例池中获取对象,如果对象没有,就创建
	 */
	instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);
}

在注释中,详细注释了哪行代码解析了哪个注解,我想着重看下
determineAutowireCandidate这个方法

/**
 * 如果根据type获取到有多个符合的bean,那就来这个方法中,推断出其中的一个
 * @param candidates:推断出来的多个bean
 * @param descriptor:要注入的属性对应的类型,如果是接口,那这里就是接口的类型
 * @return
 */
@Nullable
protected String determineAutowireCandidate(Map<String, Object> candidates, DependencyDescriptor descriptor) {
	Class<?> requiredType = descriptor.getDependencyType();
	/**
	 * 判断哪个bean有@Primary注解,返回注解对应的beanName
	 */
	String primaryCandidate = determinePrimaryCandidate(candidates, requiredType);
	if (primaryCandidate != null) {
		return primaryCandidate;
	}
	/**
	 * 如果都没有添加@Primary注解,那就判断bean是否有添加@Priority注解,注解值越小,优先级越高;返回优先级高的beanName
	 */
	String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType);
	if (priorityCandidate != null) {
		return priorityCandidate;
	}
	// Fallback
	/**
	 * 这里的descriptor中保存的是注入的bean对应的名称(在controller注入service,这里就是controller中的service属性名)
	 * 判断 从容器中拿出来的beanName是否和controller中的service属性名一致,如果一致,就注入一致的这个
	 *  这也就是在controller注入service的时候,如果service有多个实现类,那么,如果注入的service属性名和实现类的beanName一致,也可以注入成功的原因
	 *
	 *  class Controller{
	 * @Autowired
	 * Service service01
	 *  }
	 *   如果service有多个实现类,其实注入的是service01,就是这里判断的
	 *
	 *   这里我觉得,也是我们平常所说的,如果根据type找到多个,或者没有找到,就根据name来注入,这里就是根据name来注入的这一步
	 *   candidates:是根据类型从beanDefinitionMap中获取到的符合类型的beanDefinitionNames
	 *   descriptor.getDependencyName():是@Autowired注解属性注入的属性name
	 */
	for (Map.Entry<String, Object> entry : candidates.entrySet()) {
		String candidateName = entry.getKey();
		Object beanInstance = entry.getValue();
		if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||
				matchesBeanName(candidateName, descriptor.getDependencyName())) {
			return candidateName;
		}
	}
	return null;
}

通过这两段代码,我觉得可以说明一个问题:

  1. 对于@Autowired注解,spring在处理的时候:会先解析@Qualifer注解,然后解析@Primary注解,然后再解析@Priority注解
  2. 如果解析之后,匹配的bean还是有多个,那就根据name来查找,需要注意的是这里的查找都是基于从beanDefinitionMap中找到的符合注入条件的bean;
  3. 只有在确认要注入的是哪个实现类之后,才会从单实例池中获取实例化之后的bean

这里有一个点再补充一下,我前面一直在说的这个点:所有的查找都是基于从beanDefinitionMap中查找到符合注入条件的bean:下面这段代码可以证实这个观点:
在这里插入图片描述

这里的代码,我就不再追进去了,因为这里的底层,可以看到是遍历beanDefinitionNames这个集合,依次根据beanDefinitionName获取到beanDefinition,然后判断beanDefinition是否是非抽象类,是否是非懒加载的、是否是单实例的,是否是type类型的等等,如果满足,就把当前beanName返回

@Resource

在这里插入图片描述
这是一个简单的流程图,图里面基本上就把@Resource注解的解析说明白了,我们看为什么说@Resource是根据name来注入属性的,只需要看图中的最后一个方法

protected Object autowireResource(BeanFactory factory, LookupElement element, @Nullable String requestingBeanName)
		throws NoSuchBeanDefinitionException {

	Object resource;
	Set<String> autowiredBeanNames;
	String name = element.name;

	if (this.fallbackToDefaultTypeMatch && element.isDefaultName &&
			factory instanceof AutowireCapableBeanFactory && !factory.containsBean(name)) {
		autowiredBeanNames = new LinkedHashSet<>();
		/**
		* 这里也可以佐证@Resource是根据name来进行注入的,这里代码追进去,可以看到,是也是调用的doGetBean()
		* 所以:无论是走这里,还是下面的getBean,都是从单实例池中尝试获取bean的
		*/
		resource = ((AutowireCapableBeanFactory) factory).resolveDependency(
				element.getDependencyDescriptor(), requestingBeanName, autowiredBeanNames, null);
		if (resource == null) {
			throw new NoSuchBeanDefinitionException(element.getLookupType(), "No resolvable resource object");
		}
	}
	else {
		/**
		 * 之所以说@Resource是按照name来注入的,就是这里的代码可以佐证这个观点
		 * 这里,直接根据name从单实例池中获取bean,这里是从单实例池中获取,如果存在就返回,不存在就初始化
		 * 这里的getBean()调用的就是org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
		 */
		resource = factory.getBean(name, element.lookupType);
		autowiredBeanNames = Collections.singleton(name);
	}

	if (factory instanceof ConfigurableBeanFactory) {
		ConfigurableBeanFactory beanFactory = (ConfigurableBeanFactory) factory;
		for (String autowiredBeanName : autowiredBeanNames) {
			if (requestingBeanName != null && beanFactory.containsBean(autowiredBeanName)) {
				beanFactory.registerDependentBean(autowiredBeanName, requestingBeanName);
			}
		}
	}

	return resource;
}

所以:对于@Resource注解,就是根据在bean中设置的name,从单实例池中查找,如果找到就注入,没找到,就是null

总结

@Resource注解没什么可说的,就是根据name从单实例池中,获取能匹配上的beanDefinition

对于@Autowired注解

  1. 首先会根据type,从beanDefinitionMap中获取到所有符合该类型的beanDefinition对应的beanName
  2. 然后判断对应的@Qualifier注解,优先注入该注解指定的bean,如果在该注解指定了bean,但是没有找到,那就返回null
  3. 如果没有添加@Qualifer注解,但是找到了多个实现类,那就判断是否有添加@Primary注解,优先注入添加了该注解的bean;如果多个类添加了该注解,spring会报错,因为spring也不知道要注入哪个
  4. 如果没有添加@Primary注解,就处理@Priority注解,该注解是声明优先级的,值越小,优先级越高
  5. 如果这三个注解都没有添加,那就根据name,判断从beanDefinitionMap中查找的符合注入类型的所有beanName中,是否有和field对应的name一样的,有,就注入该bean,没有就根据@Autowired注解的required是true还是false,来决定是抛出异常还是返回null
  6. 如果找到、确定了注入的bean,就会从单实例池中获取beanName对应的完成实例化的bean对象,然后注入

最后一点,需要说明的是:@Autowired注解和@Resource注解都是通过field.set()完成属性填充的

Python 爬虫高级实战:HTTPS 证书忽略与代理抓包配置 本文深入解析了HTTPS加密与SSL证书校验机制在爬虫开发中的核心问题及解决方案。文章首先剖析了HTTPS协议架构和证书校验流程,指出爬虫开发中常见的证书异常场景及其负面影响。随后详细介绍了Python主流请求库(requests、httpx、aiohttp)的证书忽略配置方法,包括同步/异步模式下的实现方案。针对代理环境,文章系统比较了HTTP、HTTPS、SOCKS5等代理类型的特性差异,并提供了完整的代理配置示例。特别对中间人抓包场景,阐述了Mitmproxy的工作原理和配置要点。最后提出了工程级爬虫 阅读详情

相关推荐

STM32F103 实例应用(10)——I2C读写24C32

一、应用简介 本文介绍24C32的读写,基于野火的软件I2C程序。 board_i2c.h /**=========================================================================== @file board_i2c.h @brief 本文件是用于I2C驱动 @author 青梅煮久 @version r0.1 @date 2021/01/13 -------------------------.

qq_34118600的博客 3447

Spring源码系列 - 证明 @Autowired 不是自动装配

证明 @Autowired 不是自动装配 记得上一篇博客 Spring源码系列 - 依赖注入(Dependency Injection),我有说 @Autowired 不属于自动装配的范畴,只属于手动装配,有同学表示不可理解,毁三观,再此我会用代码来证明,Talk is cheap, show me the code 上代码前,我们先看一段 Spring 官方给除的 bean 定义: Auto...

那时花开的博客 765

【全开源】教育培训微信小程序源码(FastAdmin+ThinkPHP+Unipp)

教育培训微信小程序源码以其便捷性、互动性、安全性等优势,成为了教育培训行业的新宠。随着移动互联网技术的不断发展,教育培训微信小程序源码将继续引领未来学习趋势,为学员提供更加优质、高效的学习体验。同时,教育培训机构也应积极拥抱小程序技术,利用源码打造具有自身特色的学习平台,提升品牌影响力和市场竞争力。

2401_84414018的博客 2100

Spring5.x之IOC

介绍什么是IOC、IOC 容器,autowireMode的作用

自由人的博客 325

银河麒麟系统V10 Server SP1 安装Oracle 19c

•oracle-database-preinstall-19c 这个工具会自动配置系统参数,创建 oracle 用户和组。比较方便。•••••银河麒麟高级服务器操作系统V10 - 国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站。

fuguimashu的博客 4321

自监督学习原理与代码实战案例讲解

自监督学习原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 自监督学习的起源与发展 1.1.1 监督学习的局限性

AI天才研究院 623

Spring源码解析——@Resource注解底层原理

@Resource注解,默认基于ByName注入模型实现的注入,来看看具体实现,入口在CommonAnnotationBeanPostProcessor的postProcessProperties 先看看postProcessProperties方法 public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { //查询注入点 InjectionMetadata meta

qq_43843037的博客 2079

华为 MetaERP · 本体论驱动的 PTP 全流程智能建模方案

华为MetaERP通过“本体+事件+图谱+Agent”四位一体架构,将传统ERP从“记录系统”升级为“智能执行系统”。基于OWL本体实现业务语义精准表达,融合LLM与元数据多租能力,构建可推理、可治理的PTP全流程智能模型,解决AI理解业务逻辑难题,实现三单匹配自动化、关账效率提升30%、成本降低50%,推动企业数字化迈向可信智能新范式。

金牌架构师 180

@Autowired与@Resource原理知识点详解

@Autowired与@Resource原理知识点使用

weixin_43241706的博客 2146

亚马逊跨境电商选品数据分析:Python爬虫实战指南

本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。

2201_76125261的博客 299

深入Scrapy ItemLoader:打造优雅高效的Python爬虫数据清洗流水线

ItemLoader是 Scrapy 提供的声明式数据加载工具。它的核心理念是:将数据提取(从response中取原始值)和数据清洗/验证(处理空值、格式转换、默认值等)分离开。你可以把它想象成一个工厂流水线:原始零件(selector提取的文本)进入,经过一道道工序(输入处理器),组装成最终产品(Item字段)。首先在items.py中定义清晰的数据结构。使用搭配类型注释(虽然Scrapy自身不强制,但对人和IDE友好)。

2201_76125261的博客 68

Spring @Autowired 自动装配 ?

以前在网上看过一些关于spring 自动装配的文章,有人说@Autowired就是自动装配,其实这是不正确的,今天我将会以官网文档和源码来说明这个问题。 讲自动装配之前我想先看一下官方文档对自动装配的描述,可以看到,自动装配有四种模式: 从上图可以看到,默认Mode为no,代表没有自动装配,然后我们再看看AutowireCapableBeanFactory中定义的几个常量,其实就是跟上图中四种模...

oyc619491800的博客 584

手把手教你学simulink实例--基于Simulink的航空航天器飞行轨迹规划与仿真详细介绍

航空航天器飞行轨迹规划是实现高效、安全和精确飞行的关键技术。通过Simulink进行航空航天器飞行轨迹规划与仿真,可以验证控制算法的有效性、优化飞行路径,并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个航空航天器飞行轨迹规划系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的航空航天器飞行轨迹规划与仿真系统。该系统能够根据实时环境变化动态调整飞行轨迹,从而提高飞行效率、降低燃料消耗并提升安全性。

MHD0815的博客 388

@Autowired注解 -【Spring底层原理】

【1】注解用法根据@Autowired注解的源码,可以看到该注解可以作用在构造器、参数、方法、属性,都是从容器中获取参数组件的值标注在方法上:@Bean+方法参数,参数从容器中获取,默认不写@Autowired效果是一样的,都能自动装配标注在构造器上:如果组件上只有一个有参构造,这个有参构造的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取标注在参数位置标注在属性位置。

2501_90390161的博客 1182

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《Spring注解注入深度解析:@Autowired vs @Resource——底层原理、使用差异与最佳实践》

Autowired以类型为核心,依赖Spring生态;@Resource以名称为核心,遵循Java标准。源码启示:两者通过不同的实现注入逻辑,选择时需权衡框架绑定与兼容性需求。最佳实践:Spring项目优先用@Autowired@Qualifier处理多实例;需跨框架兼容时用@Resource。—END—

DKPT的博客 1155

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【注解】从源码角度分析Spring注解方式的自动装配

从源码角度分析Spring注解方式的自动装配 自动装配: Spring 利用依赖注入(DI),完成对 IOC 容器中各个组件的依赖关系赋值 1. @Autowired&@Qualifier&@Primary 1、@Autowired:自动注入 默认优先按照类型去容器中找相对应的组件:applicationContext.getBean(XXX.class) 如果找到多个相同类型的...

JJJikerUPUP的博客 431

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SuperMimic训练流程完整拆解:数据收集、世界模型拟合与BPTT策略更新全链路

SuperMimic 训练流程是复现这篇"一个可微分世界模型搞定人形全身控制"论文的核心。本项目 supermimic_vibed 用单卡约 1.5 GPU 小时,就让 Unitree G1 人形机器人学会了跟踪 40 段 LAFAN1 动作(评测归一化回报 0.829,40/40 全部通过)。本文将全链路拆解为三段:**仿真数据收集 → 世界模型(World Model)拟合 → BPTT 策略

gitblog_01138的博客 414

Spring之依赖注入源码解析(下)

在这个1.7里面没有这个反射的api拿到方法的参数的,我们可以很容易拿到这个参数的类型,但是我们想拿到这个a方法里面的abc就比较难。回到最开始看的哪个方法,如果拿到的时String,首先进行占位符的填充,加入写的时@Value(“${ding}”),在spring中有一个Environment,这个包括了properties的内容,首先就要通过注解引进来。这个发现器里面包含两种方法,一个是基于反射的方法一个是就是基于更底层的字节码层面的方法,还是可以基于更底层的方法拿到的。看这个接口的实现类。

俺就是菜的很的博客 339

@Resource与@Autowired用法区别

    spring中,@Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource 和 @Autowired可以替换使用;有时,则不可以。     下面,根据自己的学习,整理下这两个注解使用中的共同点和不同点,及用法上的不同。      共同点      @Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两...

蜗牛学习笔记 6万+

一文搞懂Spring @Autowired注解的使用及其原理

依赖注入(DI)是Spring核心特性之一,而@Autowired也是我们日常高频使用的Spring依赖注入方式之一,因此有必要对它的使用以及原理做一个全面的掌握。本文从@Autowired使用、原理入手记录,并扩展延伸Spring中其他具备注入功能的注解。

MarkusZhang的博客 1万+

Spring注解系列 - @Autowired注解

Autowired注解可以自动将所需的依赖对象注入到类的属性、构造方法或方法中,从而减少手动注入依赖的代码,并提高代码的可维护性和可测试性。它是Spring容器配置的一个重要注解,与@Required、@Primary、@Qualifier等注解同属容器配置范畴。@Autowired是按照类型注入依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照Bean的名称来装配,可以结合@Qualifier注解一起使用。

vonlinee的博客 3686

Spring注解装配:@Autowired和@Resource使用及原理详解

Spring 支持使用@Autowired@Resource注解进行依赖注入@Autowired@Autowired为Spring 框架提供的注解,需要导入包。源码如下/**/**① 按照type在上下文中查找匹配的bean,查找type为Svc的bean② 如果有多个bean,则按照name进行匹配如果有@Qualifier注解,则按照@Qualifier指定的name进行匹配,查找name为svcA的bean如果没有,则按照变量名进行匹配,查找name为svcA的bean③ 匹配不到,则报错。

weixin_41821642的博客 2594

从源码角度认识和理解Spring中@Resource注解

从源码角度认识和理解Spring中@Autowired注解https://blog.youkuaiyun.com/qq_43799161/article/details/123904532?spm=1001.2014.3001.5501 上篇帖子介绍了@Autowired的使用,然后从源码中角度介绍了@Autowired的一个自动注入的实现,但是在Spring中还有一个@Resource注解可以来实现依赖注入的实现。所以这篇帖子给读者从源码角度认识和理解@Resource注解。 @Resource注解和@Au.

李哈zzz的博客 2243

Spring依赖注入:@Autowired与@Resource核心机制、实战场景与避坑指南

依赖注入是现代Java企业级应用开发的核心设计模式,它通过将对象依赖关系的创建与管理交由容器负责,实现了控制反转,从而提升代码的松耦合性、可测试性和可维护性。其原理在于容器在运行时动态地将依赖对象注入到目标对象中,取代了传统的硬编码创建方式。这一技术的核心价值在于简化了组件间的协作,使得架构更清晰,更易于管理。在Spring框架这一主流技术生态中,依赖注入被广泛应用,而注解驱动的方式因其简洁性成为开发首选。其中,@Autowired和@Resource是两个最常用的依赖注入注解,它们虽然目的一致,但背后的机

weixin_30591551的博客 1473

SpringBoot扩展篇:Spring注入 @Autowired & @Resource

Autowired注入是由AutowiredAnnotationBeanPostProcessor完成的。@Resource注入是由CommonAnnotationBeanPostProcessor完成的。由于两种方式代码重复率太高,原理基本一致,下面我们主要以AutowiredAnnotationBeanPostProcessor源码分析为主。AutowiredAnnotationBeanPostProcessor负责属性、方法的注入。

java_xiaoba1的博客 1371

spring依赖注入注解@Autowired和@Resource原理解析

注解@Autowired和@Resource都可以实现Bean的自动注入。 其中@Autowired是通过Bean后处理器 BeanPostProcessor实现类AutowiredAnnotationBeanPostProcessor来完成。 而@Resource是通过另外一个CommonAnnotationBeanPostProcessor来实现的。 那么Spring是怎么做到区分的呢? 先看AbstractAutowireCapableBeanFactory,实例化bean会调用这个类的doCreat

huangdi1309的博客 1383
上一篇: spring自动注入模型
下一篇: juc-并发工具类源码解析
小小少年_
博客等级 码龄10年 63粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值