项目中使用new ClassPathXmlApplicationContext()获得spring上下文对象的问题
发布日期:2021-07-20 20:53:45 浏览次数:35 分类:技术文章

本文共 1499 字,大约阅读时间需要 4 分钟。

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

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

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

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

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

public class ApplicationContextUtil implements ApplicationContextAware { 
private  ApplicationContext context;//声明一个静态变量保存
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.context=applicationContext;

public  ApplicationContext getContext(){
  return context;
}}


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

//初始化appliationUtil类,并完成ApplicationContext的注入
   
    //对业务类注入ApplicationContextUtil实例
    
       
       
    
   

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

ApplicationContext appContext=appContextUtil.getContext();  ProjectServiceFacade projectServiceFacade=(ProjectServiceFacade)appContext.getBean("biz.projectServiceFacade");
 WorkSignService workSignService=(WorkSignService)appContext.getBean("biz.workSignService");

 

转载地址:https://blog.csdn.net/liao0801_123/article/details/86496770 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:并发环境下的 查询-修改-持久化 解决方案
下一篇:mysql for update 使用说明

发表评论

最新留言

感谢大佬
[***.8.128.20]2023年03月11日 04时02分08秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章