Struts2 整合spring 线程安全问题
最近在看关于线程安全的书,对自己做过的项目进行了一番新的审视,尤其是ssh项目
首先线程安全问题是如何产生的,关于这一点,我看过许多网上的资料,甚至是书上都是如此表述:比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。
关于此类假设,我不知道是不是人云亦云,我不能说你错了,但一定是不严谨的,在这个例子中,只有当Person类在线程1和线程2 共用一个实例的时候,才会出现上述情况。如果类Person有两个实例person1 和person2 ,线程1修改的是person1中的name,线程2修改的是person2中的name,那么根本不会出现这种事。
就因为这句不贴切的表述,让我迷糊了很久,我一直不明白,类的不同实例分配的是不同的内存区域,线程说的再如何神乎也不可能影响到不同的实例之间的数据安全,为什么你们一定要拿类说线程安全,而不是拿实例说?
由此我也想到了struts2,以前也做过struts1和Servlet的项目,他们的多个请求(可以看作多个线程)之间共用的是一个action 或 Servlet,因此如果类中有定义变量,则有可能引发线程安全问题。这里对struts1和Servlet不做详细讨论,下面说说Struts2 整合spring:
Struts2 整合spring的方式比较常用的两种(也许还有其他的方法):参考 struts2+spring的两种整合方式
Struts2他是多实例的,对于每个请求都会生成1个实例,spring默认是单实例的,所以对于无Spring插件(Struts2-spring-plugin-XXX.jar)的整合方式,需要在spring的action Bean中加业务逻辑控制器类配置为scope=”prototype”。对于有Spring插件(Struts2-spring-plugin-XXX.jar)的整合方式:反编译StrutsSpringObjectFactory以及相关的代码才发现,如果在struts action的配置文件中<action name=".." class=".."/>中class写的如果是完整的包名和类名的话就是struts创建action对象,也就是多实例的;如果是spring配置文件中的 bean的名字的话就是spring创建,那么单实例还是多实例就由spring的action Bean中的业务逻辑控制器类是否配置为scope=”prototype”,有就是多实例的,没有就是单实例的,顺序是先从spring中找,找不到再从struts配置文件中找。
综上所述,即如果action 是单实例 即线程不安全,action是多实例就是线程安全。那么真的是这样吗?其实也不尽然,如果在action是多实例的工程环境中存在 定时任务(一般会重启一个新的线程)等重启线程的业务操作的话,那么这个线程安全仍然需要打上一个问号。这个时候需要看这多个线程之间是否有共享变量,这些共享变量就应当同步处理。
转载请注明出处:
http://chenqiuzhen.iteye.com/blog/1917518
相关推荐
6. **整合Spring和Hibernate**:通过Spring的SessionFactory获取Session,进行数据库操作。同时,使用Spring的声明式事务管理,控制事务的边界。 7. **编写业务逻辑**:在Action、Service和DAO层分别实现用户的请求...
Struts2与Spring的整合主要体现在依赖注入(DI)和动作类的管理上,通过Spring的IoC容器管理Struts2的动作类,实现了业务逻辑组件的解耦。 **Hibernate** 是一个对象关系映射(ORM)框架,它简化了数据库操作,将...
在IT行业中,S2SH框架整合是Web应用开发中一种常见的技术栈,它结合了Spring、Hibernate和Struts2三个强大的开源框架。本资源提供的"最新的S2SH整合:Spring4,Hibernate4,Struts2(源码)",旨在帮助开发者理解和实践...
6. **使用SessionFactory**:在Service或DAO层,通过SessionFactory获取Session实例,SessionFactory是线程安全的,一般在应用启动时创建一次。 7. **事务管理**:整合Struts2和Hibernate时,需要考虑事务边界,...
### SSH整合 struts+hibernate+spring #### 一、SSH整合概述 在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥...
Struts2、Spring3和Hibernate3是Java Web开发中的三大框架,它们的整合可以构建出高效、灵活且可维护的企业级应用。这三个框架分别在MVC(Model-View-Controller)架构的不同层面发挥作用:Struts2负责控制层,...
Struts2+Spring+Hibernate(SSH2)是一个经典的Java Web开发框架组合,广泛应用于企业级应用的构建。这个信息管理系统网站个人编写案例是基于这三个框架的整合应用,旨在提供一个学习和参考的平台,帮助开发者理解和...
在"Struts2-Spring-Hibernate整合的例子:添加"这个项目中,开发者将这三个框架融合在一起,实现了数据的添加功能。下面我们将深入探讨这个整合过程中的关键知识点: 1. **Struts2整合**: - **Action类**:Struts...
### Spring 整合 Struts2 详解 #### 整合目标 在本教程中,我们的主要目标是通过Spring框架的IOC容器来管理Struts2的Action对象。这将有助于更好地控制依赖关系,使得应用程序结构更加清晰,易于维护。 #### 整合...
对于每个Action,其作用域(scope)通常被设定为`prototype`,这意味着每次请求都会创建一个新的Action实例,这有助于避免线程安全问题,同时可以更好地利用Spring的依赖注入特性。例如: ```xml ...
接着,Spring会管理Hibernate SessionFactory,为每个请求提供新的Session实例,以避免线程安全问题。同时,C3P0的配置包括设置初始连接数、最大连接数等参数,以优化数据库性能。 在实际项目中,开发人员通常会...
接下来,我们将详细探讨Spring和Struts整合开发中的关键知识点。 1. **Spring框架**:Spring的核心特性包括DI(依赖注入)和AOP(面向切面编程)。DI使得对象之间的关系在配置文件中定义,而不是硬编码在代码里,这...
Spring 和 Struts1 整合是企业级 Java Web 开发中的常见实践,它结合了 Spring 框架的依赖注入和事务管理能力与 Struts1 的 MVC 设计模式,为应用提供更强大的控制层和业务逻辑处理。在这个整合中,Spring 作为底层...
2. **配置Struts2**:在struts.xml中配置Action,设置结果类型,通常使用Spring插件实现Action的实例化,避免单例模式下的线程安全问题。 3. **配置iBatis**:配置SqlMapConfig.xml,定义数据源、事务管理器,编写...
在实际开发中,开发者还需要导入SSH整合所需的jar包,包括Struts2、Spring、Hibernate的核心库以及它们的依赖。例如,Struts2的struts2-core、Spring的spring-context、spring-beans、spring-tx,以及Hibernate的...
整合Spring、Struts2和MyBatis的过程需要对每一个框架有深入的理解,包括它们的核心概念、配置方式以及交互机制。这不仅提高了代码的可维护性,也使得业务逻辑和控制流程更加清晰。在实际开发中,还可以结合其他技术...
在这个"Struts2+Hibernate+Spring 整合 登陆"的例子中,开发者展示了如何将这三个框架有效地结合在一起,构建一个完整的用户登录系统。以下是对这个案例中涉及的知识点的详细解释: 1. **Struts2**: - **Action类...
2. **Action实例管理**:Spring可以作为Struts2 Action的工厂,负责Action实例的生命周期管理,如单例或多例模式,这样可以避免在高并发场景下可能出现的线程安全问题。 3. **拦截器集成**:Spring AOP可以与Struts...
综上所述,“Struts2+Spring+Hibernate分页显示”解决方案通过合理地整合三大框架的优势,能够高效地处理大量数据的展示,提供良好的用户体验,同时保证了系统的稳定性和扩展性。在实际项目中,开发者应根据具体需求...