samtiger


          QQ:418148757
          Name:yangchuan
          數據加載中……
          關于spring2與struts1整合 的DelegatingActionProxy 委托方式及一些問題思考
               spring與struts結合,很多人都說必須要在struts-config.xml配置文件里加上org.springframework.web.struts.ContextLoaderPlugIn插件,其實這個說法不一定,spring是先查找的struts-config.xml里的配置,如果沒有,再去查找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);
              }
          上邊的代碼是需要一個spring的應用環境對象,繼續察看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))說明當struts配置中沒有配置spring插件就回到web.xml配置中去找,你可以繼續跟蹤代碼就可以找到他是怎么創建applicationContext對象的。


          問題2 :我們知道struts1里面的action是非線程安全的,(關于這一點,你可以查看struts的源代碼,可發現struts的在RequestProcessor里利用了享元模式來管理每一個action的,而RequestProcessor對象是存儲在servletContext里面的),我們用spring的DelegatingActionProxy 類作代理,所以是由 spring去創建具體的action類,這樣創建的action應該也是非線程安全的
          因此,如果我們向用ioc的方式往action里注入一些屬性的話,想必會帶來并發訪問沖突問題,故,我們是不是需要在spring里配置action的bean的時候應該配置成非單例模式 (即singleton="false")呢;
          問題3:在spring中bean的默認配制都是singleton="true"的,盡管我們把action配置成非一個實例,但是在我們的業務邏輯bean里我們還是沒有逃脫多線程并發訪問時帶來的安全隱患,因此,在我們編寫的業務邏輯層bean的時候,是不是也需要注意使用兩種方式來解決這個問題呢,我們要不就不要在該bean內寫類屬性(字段),要不就是在spring配置里將其配置成singleton="false"。

          總結上述,其實我們在實現ssh1框架的時候,只要注意在action 里和業務邏輯bean里等地方都盡量取消類字段,就可以避免多線程并發訪問的問題

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


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 突泉县| 孝昌县| 黄石市| 迁西县| 大安市| 临西县| 龙游县| 新田县| 万安县| 康平县| 五原县| 星子县| 马龙县| 肃南| 福泉市| 泗阳县| 西青区| 顺平县| 乐山市| 阿城市| 宣威市| 呼玛县| 榆林市| 呼伦贝尔市| 清水县| 安徽省| 祁阳县| 喀喇| 商河县| 广州市| 贞丰县| 同德县| 连南| 贡山| 温宿县| 富顺县| 台前县| 巩义市| 绍兴市| 林西县| 鄯善县|