|
問(wèn)題背景:在我們的web程序中,用spring來(lái)管理各個(gè)實(shí)例(bean), 有時(shí)在程序中為了使用已被實(shí)例化的bean, 通常會(huì)用到這樣的代碼:
- ApplicationContext appContext =
- new ClassPathXmlApplicationContext("classpath:META-INF/spring/applicationContext-common.xml");
- ApplicationContext appContext=appContextUtil.getContext();
- ProjectServiceFacade projectServiceFacade=(ProjectServiceFacade)appContext.getBean("biz.projectServiceFacade");
上述的代碼會(huì)帶來(lái)一個(gè)問(wèn)題:因?yàn)樗鼤?huì)重新裝載applicationContext-common.xml并實(shí)例化上下文bean, 如果有些線(xiàn)程配置類(lèi)也是在這個(gè)配置文件中,那么會(huì)造成做相同工作的的線(xiàn)程會(huì)被啟兩次。一次是web容器初始化時(shí)啟動(dòng),另一次是上述代碼顯示的實(shí)例化了一次。這在業(yè)務(wù)上是要避免的。
解決方法:不用類(lèi)似new ClassPathXmlApplicationContext()的方式,從已有的spring上下文取得已實(shí)例化的bean。
具體步驟:1)增加一個(gè)ApplicationContextUtil類(lèi),用來(lái)取得上下文ApplicationContext
- public class ApplicationContextUtil implements ApplicationContextAware {
-
- private ApplicationContext context;//聲明一個(gè)靜態(tài)變量保存
- @Override
- public void setApplicationContext(ApplicationContext applicationContext)
- throws BeansException {
- this.context=applicationContext;
- }
-
- public ApplicationContext getContext(){
- return context;
- }
- }
2) 對(duì)ApplicationContextUtil類(lèi)增加 Spring配置,讓Spring完成此工具類(lèi)的裝載并且完成applicationcontext上下文的注入;applicationContext-common.xml配置如下:
- //初始化appliationUtil類(lèi),并完成ApplicationContext的注入
- <bean id="applicationContextUtil" class="com.service.utils.ApplicationContextUtil"></bean>
- //對(duì)業(yè)務(wù)類(lèi)注入ApplicationContextUtil實(shí)例
- <bean id="workSignCheckJob" class="com.service.tools.quartz.WorkSignCheckJob" >
- <property name="appContextUtil" ref="applicationContextUtil" />
- </bean>
-
3)業(yè)務(wù)類(lèi)調(diào)用代碼如下:
- ApplicationContext appContext=appContextUtil.getContext();
- ProjectServiceFacade projectServiceFacade=(ProjectServiceFacade)appContext.getBean("biz.projectServiceFacade");
- WorkSignService workSignService=(WorkSignService)appContext.getBean("biz.workSignService");
|