Struts 1
单例,线程不安全,在请求的时候被第一次初始化
action中的service对象为何不会出现数据存储的错误,大体意思就是每一个用户发出一次请求后就有一个独立的线程与之绑定,且有一个对应的servlet实例,你在其之上做的操作只属于当前servlet实例,不会受其他servlet实例的影响,反之也不会影响其他线程的servlet实例。
Struts 2
默认多例,可以设置成单例,线程安全,但是一次不可能很多请求同时过来,那样的话tomcat直接崩溃了。
struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。
Spring MVC
默认单例,可以用@Scope(“prototype”)配置成多例,单例的话线程不安全,但是spring mvc不是用action的类属性获取参数,所以没关系。
spring的单例确实存在线程安全的问题。但是spring是如何避免的呢,答案是他用了threadlocal这个类。
Servlet
怎样理解Servlet的单实例多线程
servlet单例多线程
单实例,多线程,线程安全,但是操作数据库需要加锁
servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。
servlet在处理请求的时候 调用的是service方法,这个方法可以处理多个客户端的请求。
具体访问时:
JSP 在web容器中”翻译成servlet”由容器执行,web 容器本身就是提供的多线程,A,B,C 3个访问,建立3个独立的线程组,然后运行一个servlet。依次执行。
1、servlet首先不是现成线程的。
2、Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。
Servlet容器会自动使用线程池等技术来支持系统的运行
3、设定jsp:<%@ page isThreadSafe=”false”%>来实现单线程。
当你需要保证数据一致性的时候,必须自己处理线程安全问题时可以考虑单线程。
注解和性能没有关系,Servlet的生命周期是这样的,在调用这个Servlet时候才创建这个Servlet的类并运行init()方法,然后另外有人运行这个Servlet的时候并没有重启创建Servlet和运行里边的init()方法,所以Servlet容器时单利的,spring就是Servlet的封装的框架,包括所有的依赖注入都是在tomcat启动的时候全部被初始化的,其他的注解也一样,也就是说注解也就是以前的xml的配置的替代,以前没个请求都要运行一次xml吗?并不是的,xml是在tomcat启动时就读一次而已并利用里边的配置初始化很多的东西,然后就不在使用了,因为都成了单利的,这样就保证了效率,不是每次都把我们要注入的全部new一次,而是tomcat启动的时候全部new一次以后就不new了,保证了效率问题。
所以我不明白那个 光看注解就知道性能不好?
注解就是替代了xml配置而已,而且也是初始化一次,也就是说和编写Servlet一样的在init()中做了很多的事而已,并且以后不会在运行init()了,除非你重启tomcat。
struts1也一样,运行一个action的方法的时候创建一个action类,以后再运行就不会创建了,其实也是Servlet的封装的框架。
struts2特殊一些,没个请求要new一个action来保证线程安全。所以效率会低一些,但是不会低的特别离谱。
这样也说明了spring3的mvc和struts1的mvc还有Servlet都是方法的线程安全,所以在类方法声明的私有或者公有变量不是线程安全的,struts2的确实是线程安全的。
REFS:http://blog.csdn.net/houbin0912/article/details/52944990
相关推荐
本文将详细解释 Spring、Struts2、Hibernate 面试题中的知识点,涵盖了 MVC 模式、Struts1.2 和 Struts2.0 的区别、单例模式、Servlet 依赖、可测试性、项目中使用 SSH 的原因、Struts 和 Spring 的继承关系、实现...
- **线程模式**:Struts1的Action是单例的,需要保证线程安全;Struts2为每个请求创建新的Action实例,避免了线程安全问题。 - **Servlet依赖**:Struts1的Action直接依赖Servlet API,而Struts2则弱化了这种依赖...
Spring的DI可以替换Struts的ActionServlet中的单例模式,使得每个请求都可以有独立的Action实例,更利于多线程环境。同时,Spring的AOP可以用于Struts的异常处理和事务管理。 4. **整合步骤**: - **配置Spring**...
- Struts1.x的设计模式包括MVC模式和Front Controller模式,Controller(ActionServlet)接收所有请求,转发给相应的Action处理。 - Struts2.0引入了更多特性,如OGNL表达式语言,拦截器机制等,且提供了更灵活的...
1. 了解Struts的工作流程和优缺点,理解Action的线程安全性问题。 2. 理解MVC模式,知道Struts如何实现MVC,以及MVC的组成部分。 3. 熟悉Spring的AOP和IOC概念,理解它们在Spring中的应用。 4. 掌握Hibernate的查询...
- **线程模式**:Struts1采用单例模式,要求Action线程安全;Struts2则为每个请求创建Action实例,避免线程安全问题。 - **Servlet依赖**:Struts1的Action直接依赖于Servlet API,而Struts2 Action可以脱离容器...
2. 线程模式方面的对比:Struts1 Action 是单例模式,并且必须是线程安全的,而 Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题。 3. Servlet 依赖方面的对比:Struts1 Action 依赖于 Servlet ...
Spring提供了一些预定义的Controller实现,位于`org.springframework.web.servlet.mvc`包中。Controller需要确保线程安全,以便处理并发请求。 4. **ModelAndView**:Controller处理完请求后,会返回一个...
- **线程模式**:Struts1的Action是单例的,需要确保线程安全,而Struts2为每个请求创建新的Action实例,无需担心线程安全问题。 - **Servlet依赖**:Struts1的Action直接依赖于Servlet API,Struts2则减少了对...
Struts、Hibernate、Spring 是Java开发中非常重要的三个框架,它们分别是用于构建MVC(Model-View-Controller)架构的Web应用、持久层管理和依赖注入的工具。在面试中,了解这三个框架的基本概念、工作原理以及如何...
- SessionFactory:负责创建Session对象,是线程安全的,并且一般在应用启动时创建一次即可。 - Session:代表与数据库的会话,用于执行实际的CRUD操作。 - Transaction:代表一个原子性的数据库操作,管理事务的...
2. **解析映射信息,创建SessionFactory**:映射信息通常在.hbm.xml文件中定义,SessionFactory是线程安全的,用于创建Session实例。 3. **打开Session**:Session是Hibernate的主要工作接口,它负责与数据库交互,...
2. **线程安全问题**:Action的线程安全性要求可能导致资源管理的复杂性,增加了线程安全风险。 3. **测试困难**:与Web层紧密耦合,使得单元测试较为复杂,虽然有Struts TestCase工具,但依然不够理想。 4. **类型...
5. **线程安全问题**:默认情况下,Struts的Action是线程不安全的,这可能引发并发访问时的数据一致性问题。 6. **单一Action对应多个请求**:Struts框架默认设计为一个Action对应多个请求,这种设计在处理复杂的...
第三,Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,这样导致Struts2比较耗费内存。 第四,拦截器实现机制上,Struts2...
2. **框架配置**:配置Spring、Hibernate和Struts的相关文件。 3. **业务逻辑实现**:使用Spring管理业务逻辑组件,使用Hibernate进行数据持久化操作。 4. **前端展示**:使用Struts进行前端页面的设计和展示。 5. *...
### Spring MVC面试宝典知识点详解 #### 一、SpringMVC简介 ##### 1.1 什么是SpringMVC? SpringMVC是一个基于Java的轻量级Web应用框架,该框架遵循MVC(Model-View-Controller)设计模式,旨在简化Web层的开发。...
2. **整合Struts和Spring**:通过Spring-Struts插件,使Spring能够管理Struts的Action实例,避免单例Action带来的问题。 3. **整合Spring和Hibernate**:使用Spring的HibernateTemplate或JPA来透明地操作数据库,...