samtiger


          QQ:418148757
          Name:yangchuan
          數(shù)據(jù)加載中……
          關(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)題

          posted on 2008-01-25 17:42 sam.chuan.yang 閱讀(3224) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 安庆市| 孟连| 鄂尔多斯市| 耒阳市| 东光县| 荣昌县| 女性| 伊金霍洛旗| 柯坪县| 天等县| 禹州市| 浦东新区| 海宁市| 正定县| 武胜县| 永城市| 丰台区| 特克斯县| 舞阳县| 金山区| 邹平县| 房山区| 阜新市| 凭祥市| 高密市| 南丰县| 安塞县| 射洪县| 阿巴嘎旗| 大悟县| 右玉县| 枣阳市| 噶尔县| 义乌市| 罗江县| 东丰县| 交城县| 枞阳县| 大丰市| 会同县| 舒兰市|