精华帖 (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")了; 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-08-05
不知所云。
|
|
返回顶楼 | |
发表时间:2010-08-05
能说说你说的线程问题是什么吗?
|
|
返回顶楼 | |
发表时间:2010-08-05
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??
|
|
返回顶楼 | |
发表时间:2010-08-05
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。
|
|
返回顶楼 | |
发表时间:2010-08-05
my_corner 写道 struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??
应该有 |
|
返回顶楼 | |
发表时间:2010-08-05
最后修改:2010-08-05
my_corner 写道 struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??
你这问的我想哭了,我是说struts2给spring托管时默认就是单例吗,不是强行做成单例。 |
|
返回顶楼 | |
发表时间:2010-08-05
最后修改:2010-08-05
my_corner 写道 能说说你说的线程问题是什么吗?
线程问题,你actionmessage的信息会叠加 ,还有没用过struts2注解的可以不用看这篇帖子,不然会看不懂 |
|
返回顶楼 | |
发表时间:2010-08-05
lydawen 写道 你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。
没必要啊,只要看他是不是单例就知道是否存在线程安全。 |
|
返回顶楼 | |
发表时间:2010-08-05
mvc是让你控制流程的,action是让你用来转发的,不是让你处理业务逻辑的,你在里面定义业务变量进行处理来测试是不是线程安全有意义吗?
|
|
返回顶楼 | |