`
angelbill3
  • 浏览: 256916 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

SpringBeanAutowiringSupport介绍

 
阅读更多
spring-web在version2.5.1的时候,在package org.springframework.web.context.support下加入了一个工具类叫SpringBeanAutowiringSupport,主要用来对Spring Web Application Context之外的类提供@Autowired注入功能。

官方Doc讲的更清楚点:
http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html
引用
Convenient base class for self-autowiring classes that gets constructed within a Spring-based web application. Resolves @Autowired annotations in the endpoint class against beans in the current Spring root web application context (as determined by the current thread's context ClassLoader, which needs to be the web application's ClassLoader). Can alternatively be used as a delegate instead of as a base class.


具体来讲,Servlet中本来不能使用@Autowired注入bean,解决办法是在Servlet的init(ServletConfig)方法中调用SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this),就可以直接使用@Autowired来注入Web Application Context下的一些Service等Bean了。(见下例)

又或者使用Quartz Job的时候,可以在Job类中使用SpringBeanAutowiringSupport,就可以直接直使Spring的bean了。(当然如果Job比较多的话,这种方法还是很不方便,推荐使用SchedulerFactoryBean来集成。另一种更方便的办法是直接将Job集成到Spring Context中,当做一个bean)。

值得注意的是,这个类的作用域是Web Application Context,如果应用中实现的是一个比如ConfigurableApplicationContext,那就不能用该方法来对Servlet或是Job或是其它目标类提供@Autowired。

1. 例子:在Servlet中使用:
public class InitServlet extends HttpServlet {
       
	@Autowired
	private ServiceA serviceA;
    
    public void init(ServletConfig config) throws ServletException {
		super.init(config);
		SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
		assertNotNull("Service should be injected.", serviceA);
    }
    
		// Omitted doGet(req, res), doPost(req, res);
}


2. 例子:在Quartz Job中使用:
public class DumpJob implements Job {
	
	@Autowired
	private ServiceA serviceA;

	public void execute(JobExecutionContext context) throws JobExecutionException {
		SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        assertNotNull("Service should be injected.", serviceA);
	}
}


3. SpringBeanAutowiringSupport源码分析:
/**
	 * Process {@code @Autowired} injection for the given target object,
	 * based on the current web application context.
	 * <p>Intended for use as a delegate.
	 * @param target the target object to process
	 * @see org.springframework.web.context.ContextLoader#getCurrentWebApplicationContext()
	 */
	public static void processInjectionBasedOnCurrentContext(Object target) {
		Assert.notNull(target, "Target object must not be null");
		WebApplicationContext cc = ContextLoader.getCurrentWebApplicationContext();
		if (cc != null) {
			AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
			bpp.setBeanFactory(cc.getAutowireCapableBeanFactory());
			bpp.processInjection(target);
		}
		else {
			if (logger.isDebugEnabled()) {
				logger.debug("Current WebApplicationContext is not available for processing of " +
						ClassUtils.getShortName(target.getClass()) + ": " +
						"Make sure this class gets constructed in a Spring web application. Proceeding without injection.");
			}
		}
	}

从方法第2行可以看出通过ContextLoader拿到当前的WebApplicationContext对象,再通过AutowiredAnnotationBeanPostProcessor类来解决当前传入的目标class的@Autowired注入能力。
(AutowiredAnnotationBeanPostProcessor在Spring2.5随着Annotation功能的扩展而增加的,我们平时用context namepace的标签<context:component-scan>时,Spring会默认生成注册AutowiredAnnotationBeanPostProcessor类来帮助解析@Autowired @Value @Inject等标签。)

4. 使用另一个工具类WebApplicationContextUtils来获取Service Bean:
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(config.getServletContext());
ServiceA ServiceA = context.getBean(ServiceA.class);

当然这个方法更强大,因为直接拿到WebApplicationContext对象了!

5. 补充WebApplicationContext相关:
对于Web项目,通常使用org.springframework.web.context.ContextLoaderListener,设置属性contextConfigLocation来生成WebApplicationContext。

WebApplicationContext类图(用StarUML画的):
分享到:
评论

相关推荐

    学习Spring教程时,无法继承SpringBeanAutowiringSupport类

    在Spring框架中,`SpringBeanAutowiringSupport` 类是一个重要的辅助类,它提供了一些功能,使得其他类能够方便地实现自动装配。...通过以上介绍,你应该能够解决这类问题并进一步提升你的Spring开发技能。

    Web项目中获取SpringBean与在非Spring组件中获取SpringBean.pdf

    在这个例子中,`SpringWiredBean`类继承了`SpringBeanAutowiringSupport`,它允许在Web环境中自动装配Bean。`@Autowired`注解会自动注入BeanFactory,由于它是静态的,所以在任何地方都可以直接通过`SpringWiredBean...

    精细金属掩模板(FMM)行业研究报告 显示技术核心部件FMM材料产业分析与市场应用

    精细金属掩模板(FMM)作为OLED蒸镀工艺中的核心消耗部件,负责沉积RGB有机物质形成像素。材料由Frame、Cover等五部分组成,需满足特定热膨胀性能。制作工艺包括蚀刻、电铸等,影响FMM性能。适用于显示技术研究人员、产业分析师,旨在提供FMM材料技术发展、市场规模及产业链结构的深入解析。

    【创新未发表】斑马算法ZOA-Kmean-Transformer-LSTM负荷预测Matlab源码 9515期.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:Main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2024b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开除Main.m的其他m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 智能优化算法优化Kmean-Transformer-LSTM负荷预测系列程序定制或科研合作方向: 4.4.1 遗传算法GA/蚁群算法ACO优化Kmean-Transformer-LSTM负荷预测 4.4.2 粒子群算法PSO/蛙跳算法SFLA优化Kmean-Transformer-LSTM负荷预测 4.4.3 灰狼算法GWO/狼群算法WPA优化Kmean-Transformer-LSTM负荷预测 4.4.4 鲸鱼算法WOA/麻雀算法SSA优化Kmean-Transformer-LSTM负荷预测 4.4.5 萤火虫算法FA/差分算法DE优化Kmean-Transformer-LSTM负荷预测 4.4.6 其他优化算法优化Kmean-Transformer-LSTM负荷预测

    j link 修复问题套件

    j link 修复问题套件

    C#实现modbusRTU(实现了01 3 05 06 16等5个功能码)

    资源包括 modbuspoll 虚拟串口软件vspd modsim32和modscan32 以及C#版的modbus程序 打开modsim32连接串口2 打开程序连接串口3 即可和Mdosim32进行读写通信。 本代码为C# winform程序,实现了01 03 05 06 16总共五个功能码的功能。 备注: 01功能码:读线圈开关。 03功能码: 读寄存器值。 05功能码:写线圈开关。 06功能码:写单个寄存器值。 16功能码:写多个寄存器值。

    【创新未发表】基于matlab粒子群算法PSO-PID控制器优化【含Matlab源码 9659期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,尽我所能,为你服务; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开除main.m的其他m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 智能优化算法优化PID系列程序定制或科研合作方向: 4.4.1 遗传算法GA/蚁群算法ACO优化PID 4.4.2 粒子群算法PSO/蛙跳算法SFLA优化PID 4.4.3 灰狼算法GWO/狼群算法WPA优化PID 4.4.4 鲸鱼算法WOA/麻雀算法SSA优化PID 4.4.5 萤火虫算法FA/差分算法DE优化PID 4.4.6 其他优化算法优化PID

    Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)

    Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)爬取票房和评分榜单以及短评共20w+,数据清洗特征工程,评分预测,和短评二极性分类,个人经导师指导并认可通过的高分毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)Python毕业设计-豆瓣电影短评数据挖掘与情感分析项目源码(高分项目)项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。

    yolo算法-血细胞数据集-946张图像带标签--红细胞-血小板.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    YOLOV5交通标志识别的代码+标注好的6105张数据集(高分完整项目代码)配置完环境就能运行

    YOLOV5交通标志识别的代码+标注好的6105张数据集(高分完整项目代码),个人经导师指导并认可通过的高分毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 YOLOV5交通标志识别的代码+标注好的6105张数据集(高分完整项目代码)配置完环境就能运行YOLOV5交通标志识别的代码+标注好的6105张数据集(高分完整项目代码)配置完环境就能运行YOLOV5交通标志识别的代码+标注好的6105张数据集(高分完整项目代码)配置完环境就能运行YOLOV5交通标志识别的代码+标注好的6105张数据集(高分完整项目代码)个人经导师指导并认可通过的高分毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。

    Vue.js 源代码分析 2.4.zip

    Vue.js 源代码分析 2.4vue.js 源码分析 版本2.24从零开始重写模拟的vue2,环境用的webpack安装* npm install调试环境* npm run dev* http://localhost:8080请等待更新

    元素-vue2.zip

    元素-vue2仿饿了么H5-纯前端Vue版+手前端教学这是一个仿饿了么H5的纯前端练手,使用本地格式数据。最新更新修改小球抛物效果,使用css3贝塞尔曲线实现,效果更流畅。######预览点在这里https ://hbxywdk.github.io/eleme-vue2-static/#/ 网页是有假的账户密码的部分页面需要登录 ↓ ,最好在Chrome手机模式下浏览。 用户名admin 密码admin本地预览步骤# clone 文件git clone https://github.com/hbxywdk/eleme-vue2.git# 进入 eleme-vue2 文件夹cd eleme-vue2# install dependenciesnpm install# 运行 npm run dev 会在浏览器打开 localhost:8080npm run dev如果你已经对 vue 很了解,那么看看预览就好了不用继续阅读,如果你知道听说过 vue,想学习一下,请继续看下去。使用到的相关库或工具vue2 + vuex2 + vue-router2

    瑞丽超级自动排料系统2011免狗最新版

    瑞丽服装超级排料系统可以直接加载 gmt、pat 格式的 CAD 文件,可以兼容国际标准的 HP/GL(PLT)文件和 DXF 文件,可以将已经排好料的PLT 文件直接分解成衣片重新排料。多种排料方式,如:段差排料、分页排料、捆绑排料、倒顺毛排料、旋转排料自动计算面料幅宽、针织滚筒面料、折叠面料、单片旋转、局部叠压等功能可以满足各种排料的需求。可以连接常用笔式绘图仪、喷墨绘图仪、切绘一体机、平板切割机和电脑裁床。也可以生成各种软件所需要的文件。为了广大服装制版师和专业排料人士更好的操作运用瑞丽服装超级排料系统,

    基于ffmpeg 7完成的视频播放完整代码

    FFmpeg 是一个开源的音视频处理库,提供了丰富的功能来解码、编码、转码、复用、解复用、流媒体处理等。FFmpeg 的库可以方便地集成到各种应用程序中,进行音视频播放、编辑等操作。FFmpeg 7 是 FFmpeg 的一个版本,提供了更多的特性和修复。 提供的是完整的可以编译的代码,放心下载使用

    1.2 地铁线路信息.txt

    unity插件、代码、项目等资源获取奖励

    【创新未发表】侏儒猫鼬算法IDMO-Kmean-Transformer-LSTM负荷预测Matlab源码 9566期.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:Main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2024b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开除Main.m的其他m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 智能优化算法优化Kmean-Transformer-LSTM负荷预测系列程序定制或科研合作方向: 4.4.1 遗传算法GA/蚁群算法ACO优化Kmean-Transformer-LSTM负荷预测 4.4.2 粒子群算法PSO/蛙跳算法SFLA优化Kmean-Transformer-LSTM负荷预测 4.4.3 灰狼算法GWO/狼群算法WPA优化Kmean-Transformer-LSTM负荷预测 4.4.4 鲸鱼算法WOA/麻雀算法SSA优化Kmean-Transformer-LSTM负荷预测 4.4.5 萤火虫算法FA/差分算法DE优化Kmean-Transformer-LSTM负荷预测 4.4.6 其他优化算法优化Kmean-Transformer-LSTM负荷预测

    斑点鬣狗算法SHO优化TCN-BiLSTM-Multihead-Attention光伏预测Matlab 9574期.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:Main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2024b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开除Main.m的其他m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 智能优化算法优化TCN-BiLSTM-Multihead-Attention光伏预测系列程序定制或科研合作方向: 4.4.1 遗传算法GA/蚁群算法ACO优化TCN-BiLSTM-Multihead-Attention光伏预测 4.4.2 粒子群算法PSO/蛙跳算法SFLA优化TCN-BiLSTM-Multihead-Attention光伏预测 4.4.3 灰狼算法GWO/狼群算法WPA优化TCN-BiLSTM-Multihead-Attention光伏预测 4.4.4 鲸鱼算法WOA/麻雀算法SSA优化TCN-BiLSTM-Multihead-Attention光伏预测 4.4.5 萤火虫算法FA/差分算法DE优化TCN-BiLSTM-Multihead-Attention光伏预测 4.4.6 其他优化算法优化TCN-BiLSTM-Multihead-Attention光伏预测

    Vue 3 的桌面端组件库

    Vue 3 的桌面端组件库

    C#ASP.NET超市采购管理系统源码数据库 SQL2008源码类型 WinForm

    ASP.NET超市采购管理系统源码 一个采用三层开发的完整的超市采购管理系统,包括订单管理、 商品管理、库存管理、供应商管理、库存管理等

    ️ Vue.js 的 RxJS 集成 .zip

    ️ Vue.js 的 RxJS 集成。vue-rxEnglish |简体中文RxJS v6+与 Vue.js 集成。与 5.0 版本相比的重大变化vue-rx v6 现在默认仅适用于 RxJS v6+。如果您想继续使用 RxJS v5 样式的代码,请安装rxjs-compat。安装NPM + ES2015rxjs是作为对等依赖项所必需的。npm install vue vue-rx rxjs --saveimport Vue from 'vue'import VueRx from 'vue-rx'Vue.use(VueRx)通过 webpack 打包时,dist/vue-rx.esm.js默认使用。它导入最少量的 Rx 操作符并确保打包体积较小。全局脚本要在浏览器环境中使用,请使用 UMD 构建dist/vue-rx.js。在浏览器环境中,UMD 构建假定window.rxjs已经存在,因此请确保在 Vue.js 和 RxJS 之后包含。如果存在,vue-rx.js它也会自动安装。window.Vue例子<script src=

Global site tag (gtag.js) - Google Analytics