kapok

垃圾桶,嘿嘿,我藏的这么深你们还能找到啊,真牛!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  455 随笔 :: 0 文章 :: 76 评论 :: 0 Trackbacks

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

xwork-option项目中,新增了一种更简单的实现WebWork和Spring集成的方案。它只要一个拦截器ActionAutowiringInterceptor就可以搞定!并且是自动为Action组装它所需的Spring容器中的Bean,也就是不用在每个Action中逐个配置所需的Bean。
配置步骤:
1、在Web.xml文件中配置Spring Application Context: java代码: 
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

2、在xwork.xml文件中定义ActionAutowiringInterceptor,并配置到相应的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>

可以自己设置Bean组装的策略,上面的定义是根据类型组装。如果不设置,默认情况是根据Bean的名称组装。
详细参考: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 结合的几种方法的小结

参考:
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方法,突然发现validator没发生作用,折腾半天,
换成external-ref的方法,可以了.但是觉得external-ref的方法太麻烦了.
就是去http://xwork-optional.dev.java.net/下载了一下最新的源码,换回SpringObjectFactory的方式,发现问题解决了(重载getClassInstance解决了这个问题).

于是仔细研究了一下几种组合的方法,根据前面参考中的文章,整理了一下.

看了xwork-optional的源码,发现其实三种方法的源码都包含在这里了,当然也包括external-ref这种方法的源码,只是换了包名和文件名,但是源码基本没变.你可以仔细看看.

1.External-Ref

这种方法看起来比较烦琐,可能现在都改用第3种方法了.

第一步:在web.xml里面增加一个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
我一直用这种方法,因为以前觉得是xwork本身提供的方法,升级有保障.

配置方法:
第一步.在spring的 applicationContext.xml (根据实际情况决定) 里面定义你的action,例如

java代码: 

                <bean name="some-action" class="fully.qualified.class.name" singleton="false">
                    <property name="someProperty"><ref bean="someOtherBean"/></property>
                </bean> 
               
 可以看到,可以使用Spring的特性来给你的action设置属性等,当然也可以使用Spring的拦截器等 (可以使用不一定等于推荐使用)

注意一定是singleton="false",因为xwork的action是这样要求的.

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

java代码: 

                <action name="myAction" class="some-action">
                    <result name="success">view.jsp</result>
                </action> 
 第三步.要使上面的关联生效,还要用我们的SpringObjectFactory来替换Xwork的默认ObjectFactory.
最新的SpringObjectFactory里面,有两种方法,其中我觉得A方法更直观一些.

A:修改web.xml

java代码: 

                            <!-- 这个是spring的listener,可以改为你的自定义的spring的Listenter -->
                        <listener>
                                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                        </listener>
                       
               
                        <!-- 这个必须在 Spring ContextLoaderListener 的后面 -->
                        <listener>
                          <listener-class>com.opensymphony.xwork.spring.SpringObjectFactoryListener</listener-class>
                        </listener>
 B.在spring的applicationContext.xml (根据实际情况决定)里面定义一个bean,例如

java代码: 

                    <bean id="spring-object-factory" class="com.opensymphony.xwork.spring.SpringObjectFactory"
                            init-method="initObjectFactory"/>
 这样Spring会自动调用initObjectFactory方法来替换Xwork的默认ObjectFactory

3.ActionAutowiringInterceptor
这个方法是最近出现的,可能是最简洁的方法,但是不知道性能上有没有问题,我觉得jdk1.4以后应该没有任何问题吧,至于实际效果你的自己测试一下.

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

                            <!-- 这个是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,例如这个autowireDefault就相当于以前的默认的拦截器了.
其中的拦截器策略可以配置,上面配置的是根据类型,如果不配置,默认是根据名字.

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

这种方法执行原理就是查找你的action的所有字段,如果和Spring的定义bean有相同的,就自动设置.

假设你的Spring的applicationContext.xml里面有这样一个定义:

java代码: 

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

 如果你在xwork.xml 里面定义的某个action有一个字段叫userManager,那么在运行时刻就会自动被设置为Spring的配置文件里定义的Bean.

以上如有不对指出,还请指出 

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

posted on 2005-03-12 16:52 笨笨 阅读(2387) 评论(0)  编辑  收藏 所属分类: HibernateAndSpringALL

只有注册用户登录后才能发表评论。


网站导航: