1. 程式人生 > >在程序中用new ClassPathXmlApplicationContext()的註意事項

在程序中用new ClassPathXmlApplicationContext()的註意事項

highlight pat tro ext pri .get color board service

問題背景:在我們的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");

在程序中用new ClassPathXmlApplicationContext()的註意事項