论坛首页 Java企业应用论坛

关于struts2结合spring 创建action的思考

浏览 18494 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (1) :: 隐藏帖 (11)
作者 正文
   发表时间:2010-08-05  
没有记录状态信息的局部变量
0 请登录后投票
   发表时间:2010-08-05  
喷子们 用过struts2 spring吗?
0 请登录后投票
   发表时间:2010-08-05  
是否多使用了一些Struts2的插件,比如那个Struts2 零配置插件convention-plugin就会让Struts自己创建线程安全的Action实例,而不用Spring创建,并且可以接收Spring注入的Service
0 请登录后投票
   发表时间:2010-08-05  
s1和s2哪个是单例你分清了么?Webwork是命令模式实现,S2就是Webwork,什么是命令模式,LZ应该看看。
0 请登录后投票
   发表时间:2010-08-05   最后修改:2010-08-05
你把struts2-spring-plugin里的SpringStrutsObjectFactory.java(名字可能记错了)里关于创建action的代码读一读就明白是怎么回事了

记错了, 是在xwork里的SrpingObjectFactory
 /**
     * Looks up beans using Spring's application context before falling back to the method defined in the {@link
     * ObjectFactory}.
     *
     * @param beanName     The name of the bean to look up in the application context
     * @param extraContext
     * @return A bean from Spring or the result of calling the overridden
     *         method.
     * @throws Exception
     */
    @Override
    public Object buildBean(String beanName, Map<String, Object> extraContext, boolean injectInternal) throws Exception {
        Object o = null;
        try {
            //先在WebApplicationContext中查找bean, 这里的beanName没有debug过, 理论上应该是action中配置的     
            //class
            o = appContext.getBean(beanName);
        } catch (NoSuchBeanDefinitionException e) {
            //action不是在spring中创建的话, 则由webwork自身实现的一套IOC进行bean的组装
            Class beanClazz = getClassInstance(beanName);
            o = buildBean(beanClazz, extraContext);
        }
        if (injectInternal) {
            injectInternalBeans(o);
        }
        return o;
    }

上面的代码我没有仔细debug过, webwork的那一套ioc实现我也没有看过, 看样子是可以识别@Resource的注解的
我的理解, 关于为什么使用@Controller不标注@Scope, 也使struts2每次请求都重新创建action的关键在于
你action中class的配置, 如果是配置成为spring中bean的id, 使得ObjectFactory可以从spring中成功获取action,
而这时没有配置scope, 就有可能出现并发问题, 最近没空, 有时间的测试一下
0 请登录后投票
   发表时间:2010-08-05  
好象compent,control,autowired这几种配置都可以
其实同问有用过struts2-spring吗?
0 请登录后投票
   发表时间:2010-08-06   最后修改:2010-08-06
sarin 写道
s1和s2哪个是单例你分清了么?Webwork是命令模式实现,S2就是Webwork,什么是命令模式,LZ应该看看。

貌似没分清的是你吧,难道你敢说s2是单例。s2是webwork在这里的人都知道不要你说。还有s2用的模式多了,你一句Webwork是命令模式实现很雷人。
0 请登录后投票
   发表时间:2010-08-06  
action的管理貌似是交给插件管理的,插件初始化Action时会参考Spring中的Bean容器,默认是按名字,所以写不写prototype不会影响Action
0 请登录后投票
   发表时间:2010-08-09  
有了struts2-spring-plugin 即使struts.xml里Action的class写的不是bean id,一样受spring托管。
如果你使用struts2而不使用param拦截器好像太浪费了,而使用param显然意味着Action不能是单例的。

楼主明明是来分享自己对代码的分析的又不是来问问题的,怎么有人一上来就好为人师
0 请登录后投票
   发表时间:2010-08-10   最后修改:2010-08-10
kaowww153 写道

 

所以struts2(注解) 在和spring集成时action默认是new的,不用注解spring扫描action的话也是用的new。

而非注解时如果把action加入bean的话默认是单例的。

所以如果大家struts2是用注解的话就不需要在action上加@scope("prototype")了;

struts2+spring 注解集成有 "零配置" 和"注解加xml混合配置"两种,根据业务的不同需求有不同的选择.
如果楼主是使用零注解那么我完全认同楼主的观点,但如果是部分使用,例如:如果只在Action类上使用了@componet注解,而action跳转等还是写在xml配置文件里,那这时候就需要特别指定Action的Scope了,如不指定则spring默认action是singleton的,后果会很囧囧囧

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics