iteye_2120 2012-12-15 22:06
浏览 206
已采纳

Struts2和Spring整合中的Action是由谁创建的,有什么区别

以下配置均未在Struts配置文件中加入

情况说明如下:登录页面提交到Action中,Action在execute方法中调用ms对象中的valid方法进行验证,返回SUCCESS.

在Action的构造方法中输出一行文字

第一种情况:在Struts中配置Action,配置name,class配置成Spring中Action类的Bean ID,不指定调用方法。spring中配置Action Bean,class配置实际类名,并显示指定ms Bean的引用。这时Action由Sping来创建。构造方法输出两行

第二种情况:在Struts中配置Action,配置name,class配置成实际类名。spring中只配置ms Bean的引用,进行自动装配。这时Action由Spring进行创建。构造方法输出一行

第三种情况,在Struts中配置Action,配置name,class配置成实际类名,指定方法名不为默认的execute,为任意其他,例如test,这个方法调用ms对象中的valid方法进行验证。spring中配置Action Bean,class配置实际类名,并显示指定ms Bean的引用。这时也是可以成功的。构造方法输出一行

第三种情况中,如果Struts中不指定方法,或者指定execute方法,均报错。虽然报错,但是控制台输出一行Action构造方法中的文字。

想问一下第三种情况的Action由谁来创建,Struts创建和Spring来创建有什么区别

  • 写回答

1条回答 默认 最新

  • jinnianshilongnian 2012-12-15 23:31
    关注

    [quote]第三种情况,在Struts中配置Action,配置name,class配置成实际类名,指定方法名不为默认的execute,为任意其他,例如test,这个方法调用ms对象中的valid方法进行验证。spring中配置Action Bean,class配置实际类名,并显示指定ms Bean的引用。这时也是可以成功的。构造方法输出一行 [/quote]
    这种情况在集成spring的情况下其实是:
    SpringObjectFactory代码
    [code="java"]public Object buildBean(String beanName, Map extraContext, boolean injectInternal) throws Exception {
    Object o;

        if (appContext.containsBean(beanName)) {
            o = appContext.getBean(beanName);
        } else {
            Class beanClazz = getClassInstance(beanName);
            o = buildBean(beanClazz, extraContext);
        }
        if (injectInternal) {
            injectInternalBeans(o);
        }
        return o;
    }[/code]
    

    1、首先根据中的class作为bean的名字查找spring容器;
    2、如果找不到得到class的Class类型,创建一个bean;
    3、完成资源注入

    [quote]第三种情况中,如果Struts中不指定方法,或者指定execute方法,均报错。虽然报错,但是控制台输出一行Action构造方法中的文字。
    [/quote]按理说不应该报错? 什么错误?

    Struts创建和Spring来创建有什么区别

    struts2也是个IoC容器,可以把ObjectFactory认为是struts2 IoC具体代表者,跟Spring容器的代表BeanFactory是类似的。

    都是IoC容器,只是功能上/实现上的差别。其他思想都一样,当我们集成spring时,

    <!--  Make the Spring object factory the automatic default -->
    <constant name="struts.objectFactory" value="spring" />
    

    会自动注册如上一个bean(struts2中的bean),org.apache.struts2.spring.StrutsSpringObjectFactory就是一个struts2的ObjectFactory实现,并委托给spring(可以认为是 策略/适配器模式实现)

    而struts2默认的IoC容器实现是:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改