论坛首页 Java企业应用论坛

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

浏览 18522 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (1) :: 隐藏帖 (11)
作者 正文
   发表时间:2010-08-04   最后修改:2010-08-06

最近突然想到一个问题

以前在用struts2(注解)+spring

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

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

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

于是做了个测试

public class TestAction extends BaseAction {
	@Autowired
	private UserService userService;
	@Action("test")
	public String test() throws Exception {
		System.out.println("action HashCode:"+this.hashCode());
		userService.getUserName();		
		return "success";
	}
}
@Service
public class UserService {
 public void getUserName(){
  System.out.println("service HashCode:"+hashCode()); }
}

 连续运行3次发现输出:

action HashCode:9928297
service HashCode:32262619
action HashCode:13620718
service HashCode:32262619
action HashCode:19792917
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")了;

   发表时间:2010-08-05  
不知所云。
0 请登录后投票
   发表时间:2010-08-05  
能说说你说的线程问题是什么吗?
0 请登录后投票
   发表时间:2010-08-05  
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??
0 请登录后投票
   发表时间:2010-08-05  
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。
0 请登录后投票
   发表时间:2010-08-05  
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

应该有
0 请登录后投票
   发表时间:2010-08-05   最后修改:2010-08-05
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

你这问的我想哭了,我是说struts2给spring托管时默认就是单例吗,不是强行做成单例。
0 请登录后投票
   发表时间:2010-08-05   最后修改:2010-08-05
my_corner 写道
能说说你说的线程问题是什么吗?

线程问题,你actionmessage的信息会叠加
,还有没用过struts2注解的可以不用看这篇帖子,不然会看不懂
0 请登录后投票
   发表时间:2010-08-05  
lydawen 写道
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。

没必要啊,只要看他是不是单例就知道是否存在线程安全。
0 请登录后投票
   发表时间:2010-08-05  
mvc是让你控制流程的,action是让你用来转发的,不是让你处理业务逻辑的,你在里面定义业务变量进行处理来测试是不是线程安全有意义吗?
0 请登录后投票
论坛首页 Java企业应用版

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