`
kaowww153
  • 浏览: 74561 次
  • 性别: 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")了;

分享到:
评论
44 楼 fuguitong 2013-06-04  
[size=x-small][/size]
43 楼 A_Jane 2010-08-13  
默认就是prototype的。。你在上边修改也是没用的。。因为你struts里已配置过了class文件,已经加载了class问价,而你添加的注解new出来的action只不过是多余的一个。。修改是不起作用的,只有你把class配置的改为注解名字才行。
42 楼 A_Jane 2010-08-13  
这来理解吧。struts的action在生成时跟配置文件中的bean并不是在同一个容器中的。其实action中你不用添加注解照样OK。因为一切都是自动注入的,可以参考下文档,上面有解释的,autowire,默认是byName的。但是如果想由自己控制注入,也可以实现。那就是给Action添加一个@Component注解,同时struts配置文件中class的配置名字跟注解的名字一致,这样,注入的控制权就又回到了自己手里。
41 楼 kaowww153 2010-08-11  
<div class="quote_title">cyantide 写道</div>
<div class="quote_div">
<div class="quote_title">kaowww153 写道</div>
<div class="quote_div">
<p> </p>
<p><span style="color: #ff0000;">所以struts2(注解) 在和spring集成时action默认是new的,不用注解spring扫描action的话也是用的new。</span></p>
<p><span style="color: #ff0000;">而非注解时如果把action加入bean的话默认是单例的。</span></p>
<p><span style="color: #ff0000;">所以如果大家struts2是用注解的话就不需要在action上加@scope("prototype")了;</span></p>
</div>
<p>struts2+spring 注解集成有 "零配置" 和"注解加xml混合配置"两种,根据业务的不同需求有不同的选择.<br>如果楼主是使用零注解那么我完全认同楼主的观点,但如果是部分使用,例如:如果只在Action类上使用了@componet注解,而action跳转等还是写在xml配置文件里,那这时候就需要特别指定Action的Scope了,如不指定则spring默认action是singleton的,后果会很囧囧囧</p>
</div>
<p><br>都说了是用注解了,不需要在xml里配</p>
40 楼 cyantide 2010-08-10  
<div class="quote_title">kaowww153 写道</div>
<div class="quote_div">
<p> </p>
<p><span style="color: #ff0000;">所以struts2(注解) 在和spring集成时action默认是new的,不用注解spring扫描action的话也是用的new。</span></p>
<p><span style="color: #ff0000;">而非注解时如果把action加入bean的话默认是单例的。</span></p>
<p><span style="color: #ff0000;">所以如果大家struts2是用注解的话就不需要在action上加@scope("prototype")了;</span></p>
</div>
<p>struts2+spring 注解集成有 "零配置" 和"注解加xml混合配置"两种,根据业务的不同需求有不同的选择.<br>如果楼主是使用零注解那么我完全认同楼主的观点,但如果是部分使用,例如:如果只在Action类上使用了@componet注解,而action跳转等还是写在xml配置文件里,那这时候就需要特别指定Action的Scope了,如不指定则spring默认action是singleton的,后果会很囧囧囧</p>
39 楼 p2bl 2010-08-09  
有了struts2-spring-plugin 即使struts.xml里Action的class写的不是bean id,一样受spring托管。
如果你使用struts2而不使用param拦截器好像太浪费了,而使用param显然意味着Action不能是单例的。

楼主明明是来分享自己对代码的分析的又不是来问问题的,怎么有人一上来就好为人师
38 楼 ggbbyy6699 2010-08-06  
action的管理貌似是交给插件管理的,插件初始化Action时会参考Spring中的Bean容器,默认是按名字,所以写不写prototype不会影响Action
37 楼 kaowww153 2010-08-06  
sarin 写道
s1和s2哪个是单例你分清了么?Webwork是命令模式实现,S2就是Webwork,什么是命令模式,LZ应该看看。

貌似没分清的是你吧,难道你敢说s2是单例。s2是webwork在这里的人都知道不要你说。还有s2用的模式多了,你一句Webwork是命令模式实现很雷人。
36 楼 fsroger 2010-08-05  
好象compent,control,autowired这几种配置都可以
其实同问有用过struts2-spring吗?
35 楼 Zahir 2010-08-05  
你把struts2-spring-plugin里的SpringStrutsObjectFactory.java(名字可能记错了)里关于创建action的代码读一读就明白是怎么回事了

记错了, 是在xwork里的SrpingObjectFactory
 /**
     * Looks up beans using Spring's application context before falling back to the method defined in the {@link
     * ObjectFactory}.
     *
     * @param beanName     The name of the bean to look up in the application context
     * @param extraContext
     * @return A bean from Spring or the result of calling the overridden
     *         method.
     * @throws Exception
     */
    @Override
    public Object buildBean(String beanName, Map<String, Object> extraContext, boolean injectInternal) throws Exception {
        Object o = null;
        try {
            //先在WebApplicationContext中查找bean, 这里的beanName没有debug过, 理论上应该是action中配置的     
            //class
            o = appContext.getBean(beanName);
        } catch (NoSuchBeanDefinitionException e) {
            //action不是在spring中创建的话, 则由webwork自身实现的一套IOC进行bean的组装
            Class beanClazz = getClassInstance(beanName);
            o = buildBean(beanClazz, extraContext);
        }
        if (injectInternal) {
            injectInternalBeans(o);
        }
        return o;
    }

上面的代码我没有仔细debug过, webwork的那一套ioc实现我也没有看过, 看样子是可以识别@Resource的注解的
我的理解, 关于为什么使用@Controller不标注@Scope, 也使struts2每次请求都重新创建action的关键在于
你action中class的配置, 如果是配置成为spring中bean的id, 使得ObjectFactory可以从spring中成功获取action,
而这时没有配置scope, 就有可能出现并发问题, 最近没空, 有时间的测试一下
34 楼 sarin 2010-08-05  
s1和s2哪个是单例你分清了么?Webwork是命令模式实现,S2就是Webwork,什么是命令模式,LZ应该看看。
33 楼 kaowww153 2010-08-05  
。。。。。。。。
32 楼 jackerxff 2010-08-05  
是否多使用了一些Struts2的插件,比如那个Struts2 零配置插件convention-plugin就会让Struts自己创建线程安全的Action实例,而不用Spring创建,并且可以接收Spring注入的Service
31 楼 tianlang0101 2010-08-05  
喷子们 用过struts2 spring吗?
30 楼 ao.yuan.young 2010-08-05  
没有记录状态信息的局部变量
29 楼 kaowww153 2010-08-05  
guanliScott 写道
spring中bean的作用域设为prototype,每个请求对应一个实例.请求完成后,实例会被回收,所以,不会有性能问题。

我怎么感觉struts2 action应该是default singleton呢。不确定,一直用webwork.

事实上struts2 确实是每次都new的action,因为他有很多实例变量。单例容易出现线程问题。
struts1单例因为他传参的formbean本身就是局部变量,局部变量不容易出现线程安全问题。
28 楼 weir2009 2010-08-05  
guanliScott 写道
spring中bean的作用域设为prototype,每个请求对应一个实例.请求完成后,实例会被回收,所以,不会有性能问题。

我怎么感觉struts2 action应该是default singleton呢。不确定,一直用webwork.

不知道Struts2 和webwork的关系呀
27 楼 guanliScott 2010-08-05  
spring中bean的作用域设为prototype,每个请求对应一个实例.请求完成后,实例会被回收,所以,不会有性能问题。

我怎么感觉struts2 action应该是default singleton呢。不确定,一直用webwork.
26 楼 my_corner 2010-08-05  
kaowww153 写道
my_corner 写道
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,您也一个一个的配。接着讨论您的注解吧,不参与了。

无语,我当然知道可以不配了,我做项目时也没配过,但这是我以前刚入门时做的练习,也是spring最基本的东西,你还别看不起。

没看不起,对不起我错了。
25 楼 kaowww153 2010-08-05  
my_corner 写道
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,您也一个一个的配。接着讨论您的注解吧,不参与了。

无语,我当然知道可以不配了,我做项目时也没配过,但这是我以前刚入门时做的练习,也是spring最基本的东西,你还别看不起。

相关推荐

    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