项目运行一段时间,会报错:
java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
环境:
spring项目中用到了quartz定时器,其中定时任务job中用到了类似如下的代码:
String realService = "";
int isRedis = Integer.parseInt(PropertieUtil.getConfig("config.isRedis"));
if (isRedis==1) {
//切换为redis版本
realService = "xxxServiceImpl1";
}else {
realService = "xxxServiceImpl2"
}
//本地查询文档表服务
XxxService xxxService = (XxxService) SpringContext.getApplicationContext().getBean(realService);
本意是想根据配置文件中的一个字段来决定加载哪个具体实现类,实现版本切换。
解决:
百度了一下,
找到如下文章:
错误原因:BeanFactory没有实例化或者已经关闭。原因很简单:ApplicationContext ctx = new ClassPathXmlApplicationContext();Spring实例化BeanFactory的时候是默认到classPath下面查找名为applicationContext.xml的文件。
这正是这个错误的原因,修改为:ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
如果这样的话就不会出现这样的错误了。
applicationContext.xml,,,,可以是自己命名的xml。。。
来自网络:http://blog.sina.com.cn/s/blog_80e498b10100w10b.html
Spring报错java.lang.IllegalStateException: BeanFactory not initialized or already closed -call 'refres 第一个错误: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
你是不是写了获取xml的方式来创建服务,类似于下面的这种:
ApplicationContext ctx = new ClassPathXmlApplicationContext();
UserService service = (UserService)ctx.getBean("bean.xml");
spring项目启动报错BeanFactory not initialized or already closed spring项目启动的时候包如下错误:
http://blog.163.com/zsq303288862@126/blog/static/93745961201111514325196/楼主看下这个,希望能帮到
0 2014-08-15 11:23:15
项目启动报错:java.lang.IllegalStateException: BeanFactory not initialized or already c 我的项目是ssm+maven+tomcat,前几天好好的,今天过来启动项目就一直出现错误: org.springframework.be
=======================
自己思路:
想到可能是job里面是多线程,多线程中用SpringContext.getApplicationContext().getBean 临时加载多个类可能会有问题,所以,改为不在代码里判断使用哪个实现类,而是直接在项目启动时就将要使用的实现类直接配置的 spring的配置文件的 xml中的 bean 中。
运行一段时间发现,还是问题依旧,既然不是类初始化的问题,那么就是类获取的问题,代码中其实是在定时任务的多线程类(job实现类)中有如下的获取spring类的方式:
程序运行一段时间,39行就会报错。
想到多半还是由于quartz的多线程和spring加载类操作可能会有bug,又有思路:不在多线程中获取spring容器中的类,而是在外面把多线程方法中需要的service都获取到,然后通过传递参数的形式传递到多线程方法中,再使用,也就是代码改为:
也就是在创建job实现类时就把service作为参数传递到多线程方法中,然后在方法中从参数中获取,而不是在方法中从spring容器中获取,经过一段时间的验证,果然问题解决了。
参考:
参数放入时的部分代码: