在程序中用new ClassPathXmlApplicationContext()的注意事项

问题背景:在我们的web程序中,用spring来管理各个实例(bean), 有时在程序中为了使用已被实例化的bean, 通常会用到这样的代码:

[java] view plain copy

  1. ApplicationContext appContext =
  2. new ClassPathXmlApplicationContext("classpath:META-INF/spring/applicationContext-common.xml");
  3. ApplicationContext appContext=appContextUtil.getContext();
  4. ProjectServiceFacade projectServiceFacade=(ProjectServiceFacade)appContext.getBean("biz.projectServiceFacade");

上述的代码会带来一个问题:因为它会重新装载applicationContext-common.xml并实例化上下文bean, 如果有些线程配置类也是在这个配置文件中,那么会造成做相同工作的的线程会被启两次。一次是web容器初始化时启动,另一次是上述代码显示的实例化了一次。这在业务上是要避免的。

解决方法:不用类似new ClassPathXmlApplicationContext()的方式,从已有的spring上下文取得已实例化的bean。

具体步骤:1)增加一个ApplicationContextUtil类,用来取得上下文ApplicationContext

[java] view plain copy

  1. public class ApplicationContextUtil implements ApplicationContextAware {
  2. private  ApplicationContext context;//声明一个静态变量保存
  3. @Override
  4. public void setApplicationContext(ApplicationContext applicationContext)
  5. throws BeansException {
  6. this.context=applicationContext;
  7. }
  8. public  ApplicationContext getContext(){
  9. return context;
  10. }
  11. }

2) 对ApplicationContextUtil类增加 Spring配置,让Spring完成此工具类的装载并且完成applicationcontext上下文的注入;applicationContext-common.xml配置如下:

[java] view plain copy

[java] view plain copy

  1. //初始化appliationUtil类,并完成ApplicationContext的注入

[java] view plain copy

  1. <bean id="applicationContextUtil" class="com.service.utils.ApplicationContextUtil"></bean>

[java] view plain copy

  1. //对业务类注入ApplicationContextUtil实例

[java] view plain copy

  1. <bean id="workSignCheckJob" class="com.service.tools.quartz.WorkSignCheckJob" >
  2. <property name="appContextUtil" ref="applicationContextUtil" />
  3. </bean>

3)业务类调用代码如下:

[java] view plain copy

    1. ApplicationContext appContext=appContextUtil.getContext();
    2. ProjectServiceFacade projectServiceFacade=(ProjectServiceFacade)appContext.getBean("biz.projectServiceFacade");
    3. WorkSignService workSignService=(WorkSignService)appContext.getBean("biz.workSignService");
时间: 2024-10-01 02:28:01

在程序中用new ClassPathXmlApplicationContext()的注意事项的相关文章

在ASP.NET程序中用程序动态向&lt;head&gt;便签里添加&lt;meta&gt;标签

在使用ASP.NET框架开发: 若要在Html网页中加入<meta>设置,但想通过程序动态加入: 1.如果是ASP.NET4.0以前版本: 使用HtmlMeta类加入<meta>设置: //首先我们应该创立HtmlMeta类实体(命名空间:System.Web.UI.HtmlControls) HtmlMeta meta1=new HtmlMeta(); meta1.Name="keyword"; meta1.Content="ASP.NET,jQue

一个程序员的总结——开发注意事项

一年到头了,作为本命年的我,今年发生了太多的事情,但是不幸的是,都是好事儿,有点太过得意洋洋了,不过,不管一年顺抑或不顺,都是需要总结的,毕竟,总结,才能让人成长,首先,想注意的事情就是开发注意事项. 特别想说一件事情,公司每个功能上线之前都要测试,在测试环境测试,并且也会在正式环境测试(非公开版),把上线的问题降到最低,发生过这么几件事情,有好几次,我开发的时候没有看到问题,测试测试的时候也没有问题,但是在正式环境测试的时候,我们的头儿一眼就看到问题,很神奇的一件事情,感觉他好像就长了一双挑b

java SE程序关于高并发的注意事项

最近做一个java SE程序.使用线程池进行高并发任务的处理.其中任务处理过程中会有查询数据库操作,导致任务处理非常迟缓.于是在网上查找资料.最终解决现在把有关的注意事项进行总结.一.关于线程池的注意事项.对于多个任务,线程池最好不要公用.应该把线程池分开关于线程池的代码 </pre><pre code_snippet_id="547077" snippet_file_name="blog_20141209_1_7940215" name=&quo

Ajax提高篇(6)服务器端脚本和程序中用 JSON 进行响应和回复

JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 JavaScript 对象和字符串值之间得以快速转换.由于 Ajax 应用程序非常适合将纯文本发送给服务器端程序并对应地接收纯文本,相比不能生成文本的 API,能生成文本的 API 自然更可取:而且,JSON 让您能够处理本地 JavaScript 对象,而无需为如何表示这些对象多费心思.XML 也可以提供文本方面的类似益处,但用于将 JavaScript 对象转换成 XML 的几个现有 API 没有 JSON API 成熟:有时

微信&#183;小程序开发工具安装指南及注意事项

这两天闲来无事,也安装了 “微信折叠”的开发工具来玩一下.以下是一些小道消息及使用体验,过两天我会写一篇文章以开发者的角度来详细评价微信小程序: 微信小程序不能开发游戏类.直播类功能,小程序每个人关注的上限是20个(还不确定,不过我相信这是真的,这次公布的API里并没有视频组件.微信太大,苹果要有所顾忌,但是微信也要做出相应的让步) 微信目前有没有同苹果商谈好,还是个未知数,毕竟会对AppStore有一定的冲击. 抛弃了大量的javascript组件后,这个生态体系变得相当的封闭,微信解释肯定是

VC++如何在程序中用代码注册和卸载ocx控件(代码)

方法一:在dos或Windows命令行下运行:regsvr32 ocxname.ocx 注册 示例:regsvr32 netshare.ocx     //注册netshare.ocx控件regsvr32 /u netshare.ocx    //解除netshare.ocx控件的注册 如果netshare.ocx文件不在system目录时,还必须在文件名前加上完整的路径.除了regsvr32应用程序之外,Microsoft在它的 web 站点上还提供了一个称为regclean.exe 的程序,

小程序开发中应注意的事项

独立负责的小程序项目即将收工!现在提前总结一下开发过程中遇到的问题以及如何解决问题,预防下次遇到相关问题时还是无法解决! 一.作为一个想要以成为高级程序员为目标的小白,在动手敲代码前认真分析客户的需求应为重中之重!并且及时和客户沟通,避免自己吧东西做出来后并不符合客户的需求!这无疑加大了自己的工作量,而客户还不满意!同时,重点来了!小本本随时准备记录开发过程中遇到的问题以及客户临时提出的需求! 二.当客户提出录制视频演示时,应准备项目,以及字正腔圆的介绍!用大方自信的方式向客户展示当前的项目,避

微信小程序开发规范文档-注意事项

一个页面的数据如果需要被其它页面修改,则把这个页面的数据放入storage里. 目录结构符号 └ ┌ ┘ ┐ ┤ ├ ┴ ┬ ┼ │ ─ JS模块引入请使用import关键字,而非require,WXML引入模板用标签,WXSS使用@import语法,三者统一 所有方法和变量名称都使用小写camel模式,一般是动词+名词形式,尽量不要超过5个单词,如:getList,setBackImage 所有用到的常量的地方都使用全大写,下划线分隔的形式,如:EGG_CHE 使用this转换的地方,统一使用

Java程序中用for循环语句 写出九九乘法表

今天学习了Java的for循环,用这个写了个九九乘法表,分享给大家.好东东要懂得分享额. 源码如下: for (int i=1;i<=9;i++) {          for (int j=1;j<=i;j++){              System.out.print(i+"*"+j+"="+(i*j)+"\t");          }          System.out.println("");