本地Spring容器关闭的时机

Spring 容器关闭 Spring容器关闭事件处理:@EventListener与@Order的应用实践 摘要: 本文探讨了Spring应用关闭时通过@EventListener(ContextClosedEvent)处理清理逻辑的最佳实践。关键点包括: 触发时机:ContextClosedEvent在容器开始关闭但未销毁Bean时发布,优先于@PreDestroy执行,适合停止网络服务(如Netty)。 实现方式:支持@EventListener注解或实现ApplicationListener接口,需确保监听类被Spring管 阅读详情

一、背景引入
近期开发Spring应用的时候,基本的用户功能逻辑都通过SpringMVC框架铺垫好,通过暴露给前端的API进行功能的实现。但是在设计运营后台部分的时候,由于时间有限,采用了使用Shell脚本调用Java的方式,然后产生了一个让我头痛一阵子的问题:通过Shell调用Java功能,由于需要使用到mybatis操作数据库,mybatis与dao层强绑定,故被Shell脚本调用的Java也需要有一个Spring容器,且因为进程与tomcat进程不同,于是我写了一个下面的类:

public class SpringUtil {
    public static Object getBean(String name) {
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        Object obj = ac.getBean(name);
        ac.close();
        return obj;
    }
}
通过这个类来初始化一个Spring容器,并从中获取一个Bean实例。但是,在调用mybatis的时候却一直提示DataSource is closed!


二、解释

因为mybatis与dao层绑定,切mybatis的配置也是走了Spring,由Spring的applicationContext.xml进行调用,翻看上面的SpringUtil的代码就可以发现,在获取完我们需要的Bean实例之后,ac就关闭了,所以导致了后续的mybatis操作无法进一步完成!

修正方法:在实例化Bean对象之前先初始化容器,在操作完所有操作之后再关闭容器。

  值得思考的是:1)如果Spring中配置了定时任务,在Shell调用Java时,如果恰好遇到定时任务执行的时机,会导致一个定时任务被执行两遍!这可能是非常严重的问题。

2)可以考虑分离mybatis和Spring的配置,这个暂时不追究了~


本文结束


补充一个,JUnit框架如果要在本地使用Spring容器,可以使用:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
    "classpath:applicationContext.xml"
})


Python进行.tif格式数据波段组合;多波段tif数据波段分离 Python进行.tif格式数据波段组合;多波段tif数据波段分离.tif格式数据波段组合多波段.tif数据波段分离 阔别已久,我又来了;啊啊啊…… 读了研究生,忙到天昏地暗(哈哈哈,这都是借口,主要是花了一定时间适应研究生生活) 这方面的内容我也主要是应用在遥感领域,我们知道在遥感应用中,大多数的图像数据格式为.tif格式的。进行波段组合使用ArcGIS里面的Composite Bands工具是可以实现的,波段分离也可以使用一些工具或巧妙的方法分开。但当你使用Python程序的话,就可以简化这个软件点击和 阅读详情

相关推荐

CYUSB3065配置CMOS

按照OG02B10的时序电路,在通过SCCB配置CMOS之前,需要三个电源上电,Xshutdown高电平和配置时钟电路。找到手册的第6章SCCB(跟IIC很像),可以看到SCCB的地址与SID引脚有关,这个需要到硬件原理图上确认下。这是Cypress的一个支持MIPI和UVC的模块,有例程支持OV5640,现在要替换替换成OG02B10。寄存器参数需要找到厂家的FAE,由他们提供,OG02B10的资料已经上传。(2)参考得宏的电路,时钟由主控提供,目前程序未实现。这里有两个重要参数需要搞定,摄像头的。

qq_40773212的博客 2947

Spring

SpringIOC(控制反转)概念 把对象的创建、初始化、销毁等工作交给spring容器来做helloWorld案例环境步骤1、 写一个HelloWorld类2、 写一个配置文件 3、 客户端 4、 说明:Spring容器的作用就是为HelloWorld这个类创建对象Spring容器的结构 创建对象构造函数(用的最多) 在配置文件中进入如下的配置:在客户端 HelloWorld类本身: 在控制台打...

change的博客 687

RS485接口EMC设计:三级防护与滤波隔离方案

RS485总线在工业现场面临共模噪声、差模脉冲和地电位差三大电磁兼容挑战。通过三级防护架构(气体放电管、PTC热敏电阻、半导体放电管)实现能量梯次泄放,结合共模扼流圈和滤波电容形成完整防护链。该方案经实测可将6kV浪涌下的通信稳定性提升90%,特别适用于工业自动化、电力监控等严苛环境。设计要点包括防护器件选型计算、PCB分区布局及地处理策略,其中GDT通流能力与TSS箝位电压的配合是关键。

weixin_33419305的博客 524

Spring容器关闭执行销毁方法有几种?

这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。那他是什么?先来看下Spring容器的加载过程可以看到Bean从无到有主要是经历了四个步骤就是在成熟态的时候,在初始化生命周期执行回调方法主要是以接口或者注解的形式对外提供,注入到IOC容器中,完成对应的功能。

weixin_44896262的博客 2463

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1007

用PY32F003F18的PWM互补输出驱动无刷电机,保姆级配置流程(含代码)

本文详细介绍了如何利用PY32F003F18微控制器的TIM1定时器配置PWM互补输出功能来驱动三相无刷电机,涵盖硬件设计、代码实现及六步换相算法。通过保姆级配置流程和实用代码示例,帮助开发者快速掌握无刷电机驱动技术,适用于工业自动化和消费电子等领域。

weixin_26905487的博客 379

Spring容器从启动到关闭的注解使用顺序及说明

Spring容器从启动到关闭的注解使用顺序及说明

爱的叹息的专栏 472

Cesium体渲染实战:从医学CT到气象数据的3D可视化全攻略

本文详细介绍了如何利用Cesium体渲染技术实现医学CT和气象数据的3D可视化。从数据预处理到交互式渲染,涵盖了DICOM和NetCDF格式的处理技巧,以及性能优化的实战策略,帮助开发者高效处理复杂的三维数据集。

weixin_28717431的博客 420

Spring【二】IoC容器

IoC容器是Spring最核心的概念和内容。他替代了传统的new方式初始化对象,通过读取在配置中的Bean定义,自动创建并管理容器的Bean实例及其生命周期;最重要的是可以在Bean的定义中进行依赖对象的配置,并根据依赖配置自动注入相关依赖,降低对象之间的耦合程度,以达到解耦的效果。Spring提供了多种依赖注入的方式,包括构造函数注入和设置值注入等。 一、组件、框架、容器 组件、框架和容器是所有开发语言都适用的概念。组件时为了提高代码的重用而对代码进行隔离和封装;框架在提供一系列组件的基础上,定义了更

风继续吹 1571

LIS3DHTR三轴加速度计Arduino驱动与嵌入式集成指南

加速度计是嵌入式系统中实现运动感知、姿态解算和振动分析的核心传感器。其工作原理基于MEMS微机械结构在惯性力作用下的电容变化,经片内ADC转换为数字信号;I²C接口因其硬件资源占用少、布线简洁,成为低功耗物联网节点的主流通信方式。技术价值体现在高分辨率(12位)、多量程(±2g~±16g)与低功耗(待机电流仅2µA)的平衡,支撑电池供电设备长期运行。典型应用场景包括可穿戴设备的姿态识别、工业预测性维护中的振动监测,以及智能硬件的敲击/跌落检测。本文围绕LIS3DHTR芯片及其Grove模块,详解Arduin

weixin_42584758的博客 595

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读

场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。

2301_81299416的博客 2540

Spring MVC 的容器何时启动,何时关闭

【代码】Spring MVC 的容器何时启动,何时关闭。

weixin_43346403的博客 162

ARINC429协议分析

如下表所示,ARINC429在发送一帧过程中,首先发送以START开始,以END结束,共发送32bits数据,其中0~7bits为Lable数据,9~8bits为SDI数据,10~28bits为数据,29~30bits为SSM,31bit为校验位End30292827262524校验位SSM2322212019181716DATA15141312111098SDI7654321Start。

5223

Spring拓展点之SmartLifecycle如何感知容器启动和关闭

Spring拓展点SmartLifecycle在容器启动阶段实例化所有单例对象后,获取所有实现SmartLifecycle的类,执行start方法;在容器关闭时,先获取所有实现SmartLifecycle的类,执行stop方法,最后清除所有单例对象。

你看到的逆袭,只不过是一场预备很久,草蛇灰线,伏笔千里的反攻 1964

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

好像知道的人不多?Spring容器关闭执行销毁方法有几种,看完MQ源码我才知道SmartLifecycle最快

大家好,这段时间在写业务代码的时候用到了Spring容器关闭执行销毁方法来关闭正在执行中的业务。学习了多种触发销毁方法的方式,由于业务场景不同,我们可能需要尽快的做销毁动作,或者最晚才执行销毁动作。刚好最近在看RocketMQ的源码,发现了他的关闭方式和我们以往的不一样,他使用的SmartLifecycle不是那么多人知道,但是他却能够在Spring容器一收到通知的时候,就调用销毁方法。帮大家整理出来,给我们设计方案的时候提供更多的思路。这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。

m0_73311735的博客 415

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring Boot应用关闭分析

本文挖掘了Spring Boot的关闭方式,并列举了关闭方式,从原理、源码的角度阐述了Spring Boot的关闭代码及扩展点。同时,额外说明了一些系统特性 和原理,比如,程序退出码和信号机制。

huqing1930的博客 749

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring关闭执行销毁方法有几种,看完才知道SmartLifecycle最快

这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。那他是什么?先来看下Spring容器的加载过程可以看到Bean从无到有主要是经历了四个步骤就是在成熟态的时候,在初始化生命周期执行回调方法主要是以接口或者注解的形式对外提供,注入到IOC容器中,完成对应的功能。今天主要整理了一下,Spring的关闭扩展点,在日常的业务开发中,我们经常需要针对不同的场景设计合理的方案,今天主要说了几种常用的方案,还有SmartLifecycle这种比较冷门的实现方式。

weixin_49307478的博客 1028

Spring的IOC、Spring对象初始化bean时机、Spring容器生命周期

IOC指的是控制反转,把对象的创建、初始化、销毁等工作都交给Spring容器。由spring容器来控制对象的生命周期。 Spring对象初始化bean时机: 在默认情况下,只要在Spring容器中配置了一个bean,容器在启动时就会实例化该bean,单例模式。 如果在Spring配制文件时设置懒加载模式(lazy-init=”true”),在getBean时才会实例化对象。 如果s

5630

Spring容器关闭执行销毁方法有几种,看完MQ源码才知道SmartLifecycle最快

这段时间在写业务代码的时候用到了Spring容器关闭执行销毁方法来关闭正在执行中的业务。学习了多种触发销毁方法的方式,由于业务场景不同,我们可能需要尽快的做销毁动作,或者最晚才执行销毁动作。刚好最近在看RocketMQ的源码,发现了他的关闭方式和我们以往的不一样,他使用的SmartLifecycle不是那么多人知道,但是他却能够在Spring容器一收到通知的时候,就调用销毁方法。帮大家整理出来,给我们设计方案的时候提供更多的思路。这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。

mfmfmfo的博客 677

spring(IOC) 对象创建时机、对象作用域scope、对象的初始化方法和销毁方法的调用、spring容器总结

对象的创建时机 以上两种情况是默认值,当spring容器启动的时候创建对象在bean有这样一个属性 Default 相当于false 在spring容器启动的时候,创建对象 True 在context.getBean时创建对象 False 在spring容器启动的时候创建对象lazy-init意义 如果把lazy-init设置为tru

小鱼儿 4065

Spring容器的开启与关闭

destroy-method=“destroy” --Spring容器关闭的时候执行这个名字的方法。scope=“singleton”/> --默认的生成方式是单例模式 --且应该是饿汉模式。lazy-init=“true” 延迟加载,就是容器启动的时候不创建类的实例,懒汉模式。init-method=“init” — 初始化类实例的时候会加载这个名字的方法。再次运行的时候,发现Aoo中的无参构造输出语句出现了。所以:加载配置文件的时候会自动生成类的实例。创建一个类,在aoo包下 类名为Aoo。

2509_94001122的博客 396

spring容器

BeanFactory可以认为是bean集合的工厂类,包含了各种bean的定义,以便在接收到客户端请求时将对应的bean实例化,是spring最底层的接口,提供了最简单的容器的功能,包含了bean生命周期的控制,调用初始化方法和销毁方法,ApplicationContext应用上下文 基于BeanFactory之上构建,提供面向应用的服务,并继承了资源,消息,事件,环境,工厂五种能力常见的实现方式。spring中提供了各式各样的IOC容器的实现供用户选择和使用,使用什么样的容器取决于用户的需要。

Lxn2zh的博客 1099

Spring容器创建及启动过程

创建Spring容器: @Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); applicationContext.close(); } ...

zhoushimiao1990的博客 5619
上一篇: final关键字与Java编译器的小坑
下一篇: 基础测试理论与实践-连载(一):写的背景与动机
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值