本地Spring容器关闭的时机
来源:互联网 发布:重生之网络霸主txt 编辑:程序博客网 时间:2024/06/05 23:02
一、背景引入
近期开发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"})
0 0
- 本地Spring容器关闭的时机
- spring容器创建对象的时机
- spring容器创建对象的时机
- Spring学习心得(3)-- Spring容器创建对象的时机
- Spring容器上下文的关闭
- Spring容器优雅的关闭
- Spring的IOC、Spring对象初始化bean时机、Spring容器生命周期
- Spring的IOC、Spring对象初始化bean时机、Spring容器生命周期
- 各个容器的使用时机
- Spring BeanFactoryPostProcessor容器后处理器执行时机
- 关于connection关闭的时机
- 关于connection关闭的时机
- STL各种容器迭代器失效的时机
- STL各种容器的使用时机详解
- STL各种容器的使用时机详解
- STL各种容器的使用时机详解
- STL - 各个容器的使用时机
- STL各种容器迭代器失效的时机
- 圆形的textview
- bzoj 4448: [Scoi2015]情报传递 dfs序列&树状数组
- OpenWRT使用Wifidog实现强制认证的WIFI热点
- bzoj3529【SDOI2014】数表
- LeetCode-15.3Sum
- 本地Spring容器关闭的时机
- NFS文件共享配置
- UIDynamic
- 友盟第三方QQ登录和获取用户登录信息并设置用户头像
- 基础语法学习
- svn回复删除
- Sublime Text 3103 Crack 破解 注册码(亲测有效)
- Swift-处理耗时操作
- JVM调优总结(1):一些概念【回头读读】