kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks

          http://forum.javaeye.com/viewtopic.php?t=9939&highlight=spring+autowire

          xwork-option項(xiàng)目中,新增了一種更簡(jiǎn)單的實(shí)現(xiàn)WebWork和Spring集成的方案。它只要一個(gè)攔截器ActionAutowiringInterceptor就可以搞定!并且是自動(dòng)為Action組裝它所需的Spring容器中的Bean,也就是不用在每個(gè)Action中逐個(gè)配置所需的Bean。
          配置步驟:
          1、在Web.xml文件中配置Spring Application Context: java代碼: 
          <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>

          2、在xwork.xml文件中定義ActionAutowiringInterceptor,并配置到相應(yīng)的Action中:
          java代碼: 

          <interceptor name="autowire" class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor">
              <param name="autowireStrategy">
          @org.springframework.beans.factory.config.AutowireCapableBeanFactory@AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE
              </param>
            </interceptor>

          可以自己設(shè)置Bean組裝的策略,上面的定義是根據(jù)類型組裝。如果不設(shè)置,默認(rèn)情況是根據(jù)Bean的名稱組裝。
          詳細(xì)參考:http://wiki.opensymphony.com/display/WW/WebWork+2+Spring+Integration
          ActionAutowiringInterceptor主要代碼如下:
          java代碼: 
          protected void before(ActionInvocation invocation) throws Exception {
              if (!initialized) {
                ApplicationContext applicationContext = (ApplicationContext)ActionContext.getContext().getApplication().get(
                    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

                if (applicationContext == null) {
                  log.warn("ApplicationContext could not be found.  Action classes will not be autowired.");
                } else {
                  setApplicationContext(applicationContext);
                  factory = new SpringObjectFactory();
                  factory.setApplicationContext(getApplicationContext());
                  if (autowireStrategy != null) {
                    factory.setAutowireStrategy(autowireStrategy.intValue());
                  }
                }
                initialized = true;
              }
             
              if (factory == null)
                return;

              Action bean = invocation.getAction();
              factory.autoWireBean(bean);
             
              ActionContext.getContext().put(APPLICATION_CONTEXT, context);
            } 
           


          http://forum.javaeye.com/viewtopic.php?p=54959#54959

          webwork2 + spring 結(jié)合的幾種方法的小結(jié)

          參考:
          http://wiki.opensymphony.com/display/WW/WebWork+2+Spring+Integration
          http://forum.javaeye.com/viewtopic.php?t=8509
          http://forum.javaeye.com/viewtopic.php?t=9939

          下載:
          http://xwork-optional.dev.java.net/


          昨天使用webwork和spring,使用的是SpringObjectFactory方法,突然發(fā)現(xiàn)validator沒發(fā)生作用,折騰半天,
          換成external-ref的方法,可以了.但是覺得external-ref的方法太麻煩了.
          就是去http://xwork-optional.dev.java.net/下載了一下最新的源碼,換回SpringObjectFactory的方式,發(fā)現(xiàn)問題解決了(重載getClassInstance解決了這個(gè)問題).

          于是仔細(xì)研究了一下幾種組合的方法,根據(jù)前面參考中的文章,整理了一下.

          看了xwork-optional的源碼,發(fā)現(xiàn)其實(shí)三種方法的源碼都包含在這里了,當(dāng)然也包括external-ref這種方法的源碼,只是換了包名和文件名,但是源碼基本沒變.你可以仔細(xì)看看.

          1.External-Ref

          這種方法看起來比較煩瑣,可能現(xiàn)在都改用第3種方法了.

          第一步:在web.xml里面增加一個(gè)listener,如下

          java代碼: 

                          <listener>
                                  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                          </listener>
                         
                          <listener>
                                  <listener-class>com.opensymphony.xwork.spring.SpringExternalReferenceResolverSetupListener</listener-class>
                          </listener>
           


          第二步:在Spring里面配置類似Dao之類的bean,例如

          java代碼: 

                          <bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" />
           


          第三步:配置XWork.xml,例如

          java代碼: 

                          <package name="default" extends="webwork-default"
                                  externalReferenceResolver="com.opensymphony.xwork.spring.SpringExternalReferenceResolver">               
                                  <interceptors>
                                          <interceptor name="reference-resolver" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
                                          <interceptor-stack name="myDefaultWebStack">
                                                  <interceptor-ref name="defaultStack"/>
                                                  <interceptor-ref name="reference-resolver"/>
                                          </interceptor-stack>
                                  </interceptors>
                                 
                                  <default-interceptor-ref name="myDefaultWebStack"/>
                                 
                                  <action name="myAction" class="com.ryandaigle.web.actions.MyAction">
                                          <external-ref name="DAO">myDAO</external-ref>
                                          <result name="success" type="dispatcher">
                                                  <param name="location">/success.jsp</param>
                                          </result>
                                  </action>
                         
                          </package> 
                
          2.SpringObjectFactory
          我一直用這種方法,因?yàn)橐郧坝X得是xwork本身提供的方法,升級(jí)有保障.

          配置方法:
          第一步.在spring的 applicationContext.xml (根據(jù)實(shí)際情況決定) 里面定義你的action,例如

          java代碼: 

                          <bean name="some-action" class="fully.qualified.class.name" singleton="false">
                              <property name="someProperty"><ref bean="someOtherBean"/></property>
                          </bean> 
                         
           可以看到,可以使用Spring的特性來給你的action設(shè)置屬性等,當(dāng)然也可以使用Spring的攔截器等 (可以使用不一定等于推薦使用)

          注意一定是singleton="false",因?yàn)閤work的action是這樣要求的.

          第二步.在xwork.xml里定義你的action定義

          java代碼: 

                          <action name="myAction" class="some-action">
                              <result name="success">view.jsp</result>
                          </action> 
           第三步.要使上面的關(guān)聯(lián)生效,還要用我們的SpringObjectFactory來替換Xwork的默認(rèn)ObjectFactory.
          最新的SpringObjectFactory里面,有兩種方法,其中我覺得A方法更直觀一些.

          A:修改web.xml

          java代碼: 

                                      <!-- 這個(gè)是spring的listener,可以改為你的自定義的spring的Listenter -->
                                  <listener>
                                          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                                  </listener>
                                 
                         
                                  <!-- 這個(gè)必須在 Spring ContextLoaderListener 的后面 -->
                                  <listener>
                                    <listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class>
                                  </listener>
           B.在spring的applicationContext.xml (根據(jù)實(shí)際情況決定)里面定義一個(gè)bean,例如

          java代碼: 

                              <bean id="spring-object-factory" class="com.opensymphony.xwork.spring.SpringObjectFactory"
                                      init-method="initObjectFactory"/>
           這樣Spring會(huì)自動(dòng)調(diào)用initObjectFactory方法來替換Xwork的默認(rèn)ObjectFactory

          3.ActionAutowiringInterceptor
          這個(gè)方法是最近出現(xiàn)的,可能是最簡(jiǎn)潔的方法,但是不知道性能上有沒有問題,我覺得jdk1.4以后應(yīng)該沒有任何問題吧,至于實(shí)際效果你的自己測(cè)試一下.

          第一步:配置web.xml
          java代碼: 

                                      <!-- 這個(gè)是spring的listener,可以改為你的自定義的spring的Listenter -->
                                  <listener>
                                          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                                  </listener> 
                 
           第二步配置xwork.xml里面的攔截器

          java代碼: 

                          <interceptors>
                            <interceptor name="autowire" class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor">
                              <param name="autowireStrategy">@org.springframework.beans.factory.config.AutowireCapableBeanFactory@AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE</param>
                            </interceptor>
                            <interceptor-stack name="autowireDefault">
                              <interceptor-ref="autowire" />
                              <interceptor-ref="defaultStack" />
                            </interceptor-stack>
                          </interceptors>

           你的攔截器里都要包含autowire,例如這個(gè)autowireDefault就相當(dāng)于以前的默認(rèn)的攔截器了.
          其中的攔截器策略可以配置,上面配置的是根據(jù)類型,如果不配置,默認(rèn)是根據(jù)名字.

          一共有四種策略:
          AUTOWIRE_CONSTRUCTOR
          AUTOWIRE_BY_TYPE
          AUTOWIRE_BY_NAME
          AUTOWIRE_AUTODETECT

          這種方法執(zhí)行原理就是查找你的action的所有字段,如果和Spring的定義bean有相同的,就自動(dòng)設(shè)置.

          假設(shè)你的Spring的applicationContext.xml里面有這樣一個(gè)定義:

          java代碼: 

                      <bean id="userManager" class="com.test.UserManager" />

           如果你在xwork.xml 里面定義的某個(gè)action有一個(gè)字段叫userManager,那么在運(yùn)行時(shí)刻就會(huì)自動(dòng)被設(shè)置為Spring的配置文件里定義的Bean.

          以上如有不對(duì)指出,還請(qǐng)指出 

          上一次由scud于2005-1-07 周五, 下午5:40修改,總共修改了4次

          posted on 2005-03-12 16:52 笨笨 閱讀(2399) 評(píng)論(0)  編輯  收藏 所屬分類: HibernateAndSpringALL
          主站蜘蛛池模板: 沽源县| 彭泽县| 内黄县| 平果县| 彭阳县| 阿克陶县| 宁南县| 兰溪市| 任丘市| 莱州市| 黄梅县| 陇川县| 观塘区| 中西区| 扬州市| 德惠市| 文登市| 株洲市| 宁南县| 三门峡市| 广州市| 綦江县| 梅州市| 沾化县| 论坛| 温宿县| 新宾| 定南县| 称多县| 安远县| 神木县| 湘潭县| 吉木萨尔县| 安龙县| 山西省| 玉环县| 兰考县| 独山县| 都安| 介休市| 敦化市|