關(guān)于spring2與struts1整合 的DelegatingActionProxy 委托方式及一些問(wèn)題思考
spring與struts結(jié)合,很多人都說(shuō)必須要在struts-config.xml配置文件里加上org.springframework.web.struts.ContextLoaderPlugIn插件,其實(shí)這個(gè)說(shuō)法不一定,spring是先查找的struts-config.xml里的配置,如果沒(méi)有,再去查找web.xml里邊的配置的。所以我們只需要配置web.xml就可以了。看看代碼,從DelegatingActionProxy 類中查看有如下代碼:
protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
WebApplicationContext wac = getWebApplicationContext(getServlet(), mapping.getModuleConfig());
String beanName = determineActionBeanName(mapping);
return (Action) wac.getBean(beanName, Action.class);
}
上邊的代碼是需要一個(gè)spring的應(yīng)用環(huán)境對(duì)象,繼續(xù)察看getApplicationContext的代碼,如下:
protected WebApplicationContext getWebApplicationContext(
ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException {

return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig);
}
好,跟蹤到DelegatingActionUtils.findRequiredWebApplicationContext方法,如下:
public static WebApplicationContext findRequiredWebApplicationContext(
ActionServlet actionServlet, ModuleConfig moduleConfig) throws IllegalStateException {

WebApplicationContext wac = getWebApplicationContext(actionServlet, moduleConfig);
// If no Struts-specific context found, fall back to root context.
if (wac == null) {
wac = WebApplicationContextUtils.getRequiredWebApplicationContext(actionServlet.getServletContext());
}
return wac;
}
上邊的代碼(if(wac==null))說(shuō)明當(dāng)struts配置中沒(méi)有配置spring插件就回到web.xml配置中去找,你可以繼續(xù)跟蹤代碼就可以找到他是怎么創(chuàng)建applicationContext對(duì)象的。
問(wèn)題2 :我們知道struts1里面的action是非線程安全的,(關(guān)于這一點(diǎn),你可以查看struts的源代碼,可發(fā)現(xiàn)struts的在RequestProcessor里利用了享元模式來(lái)管理每一個(gè)action的,而RequestProcessor對(duì)象是存儲(chǔ)在servletContext里面的),我們用spring的DelegatingActionProxy 類作代理,所以是由 spring去創(chuàng)建具體的action類,這樣創(chuàng)建的action應(yīng)該也是非線程安全的
因此,如果我們向用ioc的方式往action里注入一些屬性的話,想必會(huì)帶來(lái)并發(fā)訪問(wèn)沖突問(wèn)題,故,我們是不是需要在spring里配置action的bean的時(shí)候應(yīng)該配置成非單例模式 (即singleton="false")呢;
問(wèn)題3:在spring中bean的默認(rèn)配制都是singleton="true"的,盡管我們把a(bǔ)ction配置成非一個(gè)實(shí)例,但是在我們的業(yè)務(wù)邏輯bean里我們還是沒(méi)有逃脫多線程并發(fā)訪問(wèn)時(shí)帶來(lái)的安全隱患,因此,在我們編寫(xiě)的業(yè)務(wù)邏輯層bean的時(shí)候,是不是也需要注意使用兩種方式來(lái)解決這個(gè)問(wèn)題呢,我們要不就不要在該bean內(nèi)寫(xiě)類屬性(字段),要不就是在spring配置里將其配置成singleton="false"。
總結(jié)上述,其實(shí)我們?cè)趯?shí)現(xiàn)ssh1框架的時(shí)候,只要注意在action 里和業(yè)務(wù)邏輯bean里等地方都盡量取消類字段,就可以避免多線程并發(fā)訪問(wèn)的問(wèn)題




















上邊的代碼(if(wac==null))說(shuō)明當(dāng)struts配置中沒(méi)有配置spring插件就回到web.xml配置中去找,你可以繼續(xù)跟蹤代碼就可以找到他是怎么創(chuàng)建applicationContext對(duì)象的。
問(wèn)題2 :我們知道struts1里面的action是非線程安全的,(關(guān)于這一點(diǎn),你可以查看struts的源代碼,可發(fā)現(xiàn)struts的在RequestProcessor里利用了享元模式來(lái)管理每一個(gè)action的,而RequestProcessor對(duì)象是存儲(chǔ)在servletContext里面的),我們用spring的DelegatingActionProxy 類作代理,所以是由 spring去創(chuàng)建具體的action類,這樣創(chuàng)建的action應(yīng)該也是非線程安全的
因此,如果我們向用ioc的方式往action里注入一些屬性的話,想必會(huì)帶來(lái)并發(fā)訪問(wèn)沖突問(wèn)題,故,我們是不是需要在spring里配置action的bean的時(shí)候應(yīng)該配置成非單例模式 (即singleton="false")呢;
問(wèn)題3:在spring中bean的默認(rèn)配制都是singleton="true"的,盡管我們把a(bǔ)ction配置成非一個(gè)實(shí)例,但是在我們的業(yè)務(wù)邏輯bean里我們還是沒(méi)有逃脫多線程并發(fā)訪問(wèn)時(shí)帶來(lái)的安全隱患,因此,在我們編寫(xiě)的業(yè)務(wù)邏輯層bean的時(shí)候,是不是也需要注意使用兩種方式來(lái)解決這個(gè)問(wèn)題呢,我們要不就不要在該bean內(nèi)寫(xiě)類屬性(字段),要不就是在spring配置里將其配置成singleton="false"。
總結(jié)上述,其實(shí)我們?cè)趯?shí)現(xiàn)ssh1框架的時(shí)候,只要注意在action 里和業(yè)務(wù)邏輯bean里等地方都盡量取消類字段,就可以避免多線程并發(fā)訪問(wèn)的問(wèn)題
posted on 2008-01-25 17:42 sam.chuan.yang 閱讀(3224) 評(píng)論(0) 編輯 收藏