`
kaowww153
  • 浏览: 74545 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

阅读更多

最近突然想到一个问题

以前在用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")了;

分享到:
评论
24 楼 weir2009 2010-08-05  
kaowww153 写道
看你加了struts2-convention-plugin.jar没有,加了的话就说明你用了struts2注解就可以不用加@scope了,甚至连@controller也不用加

哦  真好,今天受教了。
23 楼 kevin_wanwei 2010-08-05  
白痴,你的线程问题是指什么啊?,action中没有实例变量难道不可以吗。
22 楼 kaowww153 2010-08-05  
看你加了struts2-convention-plugin.jar没有,加了的话就说明你用了struts2注解就可以不用加@scope了,甚至连@controller也不用加
21 楼 my_corner 2010-08-05  
kaowww153 写道
my_corner 写道
kaowww153 写道
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

你这问的我想哭了,我是说struts2给spring托管时默认就是单例吗,不是强行做成单例。

默认托管??struts2-spring-pluginXXX.jar,struts插件,不用在spring中写任何有关action的配置。自己找来看看代码。

你这话写的业余了点吧。<bean id="showGoodsAction"
class="com.test.struts2.action.ShowGoodsAction"
scope="prototype">
<property name="goodsService" ref="goodsService"></property>
</property>
</bean>
你不配不代表别人不配吧。

无语……几百个action,您也一个一个的配。接着讨论您的注解吧,不参与了。
20 楼 ivyshark 2010-08-05  
my_corner 说的没错
19 楼 weir2009 2010-08-05  
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"; 
   } 
  }
你这action跟我的action:
@Controller
public class TestAction extends BaseActionSupport {
......
}
一样么?
18 楼 kaowww153 2010-08-05  
weir2009 写道
kaowww153 写道
weir2009 写道
# @Controller @Scope("prototype") 
# public class TestAction extends BaseActionSupport { 
# ...... 
# }
这样行么?

这位终于说到点子上了。
struts2如果是用的注解的话就可以不用@Scope("prototype")了  也是每次new的action

@Controller
public class TestAction extends BaseActionSupport { 
...... 
}
这样也可以呀。

前题是你的struts2用的注解方式
17 楼 weir2009 2010-08-05  
kaowww153 写道
weir2009 写道
# @Controller @Scope("prototype") 
# public class TestAction extends BaseActionSupport { 
# ...... 
# }
这样行么?

这位终于说到点子上了。
struts2如果是用的注解的话就可以不用@Scope("prototype")了  也是每次new的action

@Controller
public class TestAction extends BaseActionSupport { 
...... 
}
这样也可以呀。
16 楼 kaowww153 2010-08-05  
weir2009 写道
# @Controller @Scope("prototype") 
# public class TestAction extends BaseActionSupport { 
# ...... 
# }
这样行么?

这位终于说到点子上了。
struts2如果是用的注解的话就可以不用@Scope("prototype")了  也是每次new的action
15 楼 kaowww153 2010-08-05  
my_corner 写道
kaowww153 写道
lydawen 写道
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。

没必要啊,只要看他是不是单例就知道是否存在线程安全。

单例就线程不安全,这要看你怎么用你的业务逻辑是什么?

你这扯远了,我指的是仅仅判断action是否单例,你扯业务干啥啊。
14 楼 kaowww153 2010-08-05  
my_corner 写道
kaowww153 写道
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

你这问的我想哭了,我是说struts2给spring托管时默认就是单例吗,不是强行做成单例。

默认托管??struts2-spring-pluginXXX.jar,struts插件,不用在spring中写任何有关action的配置。自己找来看看代码。

你这话写的业余了点吧。<bean id="showGoodsAction"
class="com.test.struts2.action.ShowGoodsAction"
scope="prototype">
<property name="goodsService" ref="goodsService"></property>
</bean>
你不配不代表别人不配吧。
13 楼 weir2009 2010-08-05  
# @Controller @Scope("prototype") 
# public class TestAction extends BaseActionSupport { 
# ...... 
# }
这样行么?
12 楼 ming123 2010-08-05  
my_corner 写道
kaowww153 写道
lydawen 写道
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。

没必要啊,只要看他是不是单例就知道是否存在线程安全。

单例就线程不安全,这要看你怎么用你的业务逻辑是什么?

11 楼 my_corner 2010-08-05  
kaowww153 写道
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

你这问的我想哭了,我是说struts2给spring托管时默认就是单例吗,不是强行做成单例。

默认托管??struts2-spring-pluginXXX.jar,struts插件,不用在spring中写任何有关action的配置。自己找来看看代码。
10 楼 my_corner 2010-08-05  
kaowww153 写道
lydawen 写道
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。

没必要啊,只要看他是不是单例就知道是否存在线程安全。

单例就线程不安全,这要看你怎么用你的业务逻辑是什么?
9 楼 my_corner 2010-08-05  
mvc是让你控制流程的,action是让你用来转发的,不是让你处理业务逻辑的,你在里面定义业务变量进行处理来测试是不是线程安全有意义吗?
8 楼 kaowww153 2010-08-05  
lydawen 写道
你要测action线程安全,定义一个实例变量,页面上给它个值,action里睡10秒,接着再用另外的值访问这个 action,输出值。

没必要啊,只要看他是不是单例就知道是否存在线程安全。
7 楼 kaowww153 2010-08-05  
my_corner 写道
能说说你说的线程问题是什么吗?

线程问题,你actionmessage的信息会叠加
,还有没用过struts2注解的可以不用看这篇帖子,不然会看不懂
6 楼 kaowww153 2010-08-05  
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

你这问的我想哭了,我是说struts2给spring托管时默认就是单例吗,不是强行做成单例。
5 楼 chenshuang1227 2010-08-05  
my_corner 写道
struts2本身设计就是action非单例的,拦截器是单例的,你强行把action做成单例的没有问题??

应该有

相关推荐

    struts2-spring-plugin-2.3.4.jar

    通过Struts 2-Spring 插件,我们可以将Struts 2 的Action 对象交给Spring 来管理,Spring 负责初始化、配置和销毁这些对象。这样,Action 类不再需要自己去创建依赖的对象,而是通过构造函数或setter 方法接收Spring...

    struts2与spring2的整合

    4. **Spring插件**:在Struts2中使用Spring插件(struts2-spring-plugin),这个插件能够帮助Struts2与Spring进行交互,自动将Action类实例化并注入依赖。 5. **Action类**:Action类需要实现Spring的`org.spring...

    struts2-spring-plugin-2.2.1.jar

    4. **AOP集成**:结合Spring的AOP能力,可以为Struts2的Action提供切面增强,如性能监控、日志记录等。 5. **简化配置**:通过插件,开发者不再需要在struts.xml或web.xml中显式配置Action的类名和实例,只需在...

    struts2+spring练习

    4. **Struts2与Spring集成**:为了结合这两个框架的优点,我们需要配置Struts2的Spring插件。这将使Struts2能够从Spring容器中获取Action实例,实现Action的依赖注入。配置通常包括修改`struts.xml`中的`&lt;package&gt;`...

    struts2+spring+mybatis+easyui的实现

    同时,Spring与Struts2可以通过Spring-Struts2插件无缝集成,使得Action可以直接由Spring管理,增强了系统的可测试性。 **MyBatis** 是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提供了更灵活的SQL操作...

    struts2+spring+mybatis框架

    4. **整合Spring和Struts2**:使用Spring的Struts2插件,使Spring管理的Bean可以直接在Struts2 Action中注入使用。 5. **整合Spring和MyBatis**:通过Spring的SqlSessionFactoryBean,将MyBatis的SqlSessionTemplate...

    搭建SSH框架需要引入的Struts2包(log4j,spring-web,struts2-spring-plugin)

    对于Struts2和Spring的配置,我们需要在`struts.xml`和`spring-context.xml`文件中进行相应的设置,例如定义Action类、配置Spring Bean以及指定Struts2与Spring的整合方式。同时,确保web.xml文件中配置了...

    struts2+spring4+hibernate

    同时,Spring4的Spring MVC模块可以与Struts2结合使用,提供另一种MVC实现方式,以应对更复杂的应用场景。 Hibernate则是一个强大的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。在电子商务系统...

    Struts2+Spring演示实例源代码

    - **Spring插件**:Struts2提供了一个Spring插件,使得Spring管理的Bean可以直接作为Struts2的Action。 - **Action配置**:在struts.xml中声明Spring管理的Action,不再需要在Action类上添加任何Struts注解。 - *...

    struts2+spring实例程序

    当我们把Struts2和Spring结合起来使用时,可以创建出高效且可维护的企业级应用。通常,Struts2负责前端请求的处理,Spring则负责业务逻辑的管理和服务的提供。Spring可以通过其IoC容器初始化Struts2的Action类,并...

    整合struts2和spring

    3. **配置Struts2**:在Struts2的配置文件(struts.xml)中,需要声明Spring插件,告诉Struts2使用Spring来管理Action实例。这样,每次请求时,Struts2会从Spring容器中获取Action实例,而不是使用默认的实例化方式...

    Struts2+Spring3+MyBatis结合项目

    这个“Struts2+Spring3+MyBatis结合项目”是一个实战示例,旨在帮助开发者深入理解和实践这三大框架的集成与应用。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的开源Web应用框架。它主要负责...

    Struts2与Spring2框架整合实例

    2. **Spring的Action类管理**:在整合后,Struts2的Action类不再直接创建服务类的实例,而是由Spring容器提供。这样可以利用Spring的事务管理、AOP等功能,使Action类更专注于业务逻辑。 3. **Struts2的插件机制**...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    Struts2整合Spring、JPA

    在整合Spring时,我们通常会利用Spring的Action代理来替代Struts2默认的Action实例化方式,这样可以将Action的创建和依赖注入交给Spring容器来管理。具体实现包括在Struts配置文件中声明Spring插件,并在Spring的...

    struts2+spring+hibernate 整合的jar包

    4. **整合Struts2和Spring**:使用Struts2的Spring插件,将Spring管理的Bean注入到Struts2的Action中,通常通过`&lt;struts-plugin&gt;`标签进行配置。 5. **配置Struts2**:创建Struts2的配置文件(struts.xml),定义...

    SSH\\others\\struts2-spring-plugin-2.2.1.jar

    除了Action类,Struts2 Spring Plugin还允许我们在拦截器、结果类型和其他Struts2组件中使用Spring注入。这大大增强了Struts2的应用能力,简化了复杂应用的构建过程。 压缩包中的其他文件如"msbase.jar"、...

    struts2结合spring的jar包.rar

    - **结果类型配置**:Struts2可以配置专门的SpringResult类型,以便在Action执行完成后,通过Spring来创建和返回视图。 在实际开发中,结合Struts2和Spring可以实现更松散的耦合,提高代码的可测试性和可扩展性。...

Global site tag (gtag.js) - Google Analytics