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

最近突然想到一个问题

以前在用struts2(注解)+spring

struts的action拖给spring管了(spring的bean在Ioc容器范围内默认都是singlen的),但是没有加@scope("prototype")却从来没有出现过线程安全问题。

而一年前还在学校时做ssh2(没用注解)练习时,不在bean后加prototype都会出现线程安全问题,当时所有的action后都加了scope=prototype。

难道注解和不用注解,struts2创建action的方式不一样?

于是做了个测试

Java代码    收藏代码
  1. public class TestAction extends BaseAction  
  2.     @Autowired  
  3.     private UserService userService;  
  4.     @Action("test" 
  5.     public String test() throws Exception  
  6.         System.out.println("action HashCode:"+this.hashCode());  
  7.         userService.getUserName();        
  8.         return "success" 
  9.      
  10.  
Java代码    收藏代码
  1. @Service  
  2. public class UserService  
  3.  public void getUserName(){  
  4.   System.out.println("service HashCode:"+hashCode());  
  5.  

 连续运行3次发现输出:

Java代码    收藏代码
  1. action HashCode:9928297  
  2. service HashCode:32262619  
  3. action HashCode:13620718  
  4. service HashCode:32262619  
  5. action HashCode:19792917  
  6. service HashCode:32262619  

 输出结果说明 每次的action是不一样的

而每次的service是同一个也就是单例的

(难道action并没有交个spring托管)

又把以前在学校做的老项目(纯xml)拿来 把以前的scope="prototype"去掉

发现action确实是单例的   再加上scope="prototype"后action不是单例了

 

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

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

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



 

当指定struts.objectFactory为spring时,struts2框架就会把bean转发给spring来创建,装配,注入。但是bean创建完成之后,还是由struts容器来管理其生命周期。配置方式:

(1)struts.xml中:

xml 代码
  1. <</span>constant name="struts.objectFactory" value="spring" />  

 

(2)struts.properties中:

java 代码
  1. struts.objectFactory=spring  

 

通常情况下,这样子就够了,然后在struts的action-mapping配置文件中,如下:

xml 代码
  1. <</span>action name="user" class="com.myapp.admin.web.action.user.UserAction"></</span>action>  

即可,如果在Action中有依赖于其它的BEAN,也会被自动注入进来。这时候,Action实例是以prototype方式创建的,SPRING会为每个请求创建一个ACTION的实例。

 

在某些时候,你可能希望不仅仅让SPRING创建和装配Action对象,还希望让SPRING完全管理这些对象,如希望使用AOP或者希望使用acegi时。这时候,只需要在spring的配置文件中定义这些action 即可。如在applicationContext.xml文件中:

xml 代码
  1. <</span>bean id="user" class="com.myapp.web.action.user.UserAction"/>  

然后在action-mapping中,指定class="user"即可。

 Struts和Spring整合方案有两种: 


   方案一: 
   使用委托方式,将struts中的Action配置到spring中,然后通过委托方式来调用Action 

   方案二: 
   将spring上下文启动配置到struts中,通过struts运行来加载spring的配置以及让spring工作起来。 
   不管采用那种方案,都需要在struts的配置文件中,将spring配置进来,,目的就是当请求到达struts后,可以与spring协同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值