struts2 action 有spring创建还是struts2创建分析

以下配置均未在Struts配置文件中加入<constant name="struts.objectFactory" value="spring" />

情况说明如下:登录页面提交到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来创建有什么区别

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

这种情况在集成spring的情况下其实是:
SpringObjectFactory代码
Java代码   收藏代码
  1. public Object buildBean(String beanName, Map<String, Object> extraContext, boolean injectInternal) throws Exception {  
  2.         Object o;  
  3.           
  4.         if (appContext.containsBean(beanName)) {  
  5.             o = appContext.getBean(beanName);  
  6.         } else {  
  7.             Class beanClazz = getClassInstance(beanName);  
  8.             o = buildBean(beanClazz, extraContext);  
  9.         }  
  10.         if (injectInternal) {  
  11.             injectInternalBeans(o);  
  12.         }  
  13.         return o;  
  14.     }  


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

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

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

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

都是IoC容器,只是功能上/实现上的差别。其他思想都一样,当我们集成spring时,
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
   
    <!--  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容器实现是:
    <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值