Spring的Controller是Singleton的,或者是线程不安全的
和Struts一样,Spring的Controller是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:我们不用每次创建Controller,减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
这也是Webwork2吹嘘的地方,它的每个Action都是线程安全的。因为每过来一个request,它就创建一个Action对象。由于现代JDK垃圾收集功能的效率已经不成问题,所以这种创建完一个对象就扔掉的模式也得到了好多人的认可。Rod Johnson甚至以此为例证明J2EE提供的object pool功能是没多大价值的。
但是当人们在吹嘘线程安全怎么怎么重要的时候,我想请问有多少人在多少情况下需要考虑线程安全?Rod Johnson在分析EJB的时候也提出过其它问题,并不是没有了EJB的线程安全魔法,世界就会灭亡的,大多数情况下,我们根本不需要考虑线程安全的问题,也不考虑object pool。因为我们大多数情况下不需要保持instance状态。
至少我写了那么多的struts Action,写了那么多的Spring Controller,几乎没有碰到需要在instance变量保持状态的问题。当然也许是我写的代码不够多,Struts的设计者Craig R. McClanahan曾经说当时他设计struts时有两个条件不成熟:当时没有测试驱动开发的概念;当时JVM的垃圾收集性能太次。假如现在重新设计的话,他也会采用每个request生成一个新对象的设计方法,这样可以解决掉线程安全的问题了。
感言:
- 过度设计是魔鬼
- 设计是因地制宜的完全面向业务的设计,而不是什么都搭建一个鸟巢或者金字塔
- 现代社会,技术在进步,机器在进步,人的头脑也应该紧随其后,一些以前的问题,现在已经不是问题
- 简单,尽可能的简单(但不是简陋),这是一切一切的基础
分享到:
相关推荐
Synchronized锁在Spring事务管理下,导致线程不安全。
本文将深入探讨"类似Spring Controller注解Demo"这一主题,结合提供的标签"源码"和"工具",我们将分析Spring MVC中的Controller注解以及如何通过源码理解和应用它们。 Spring MVC是Spring框架的一部分,它提供了...
而Spring MVC通过Controller实例的单例模式或原型模式管理,自动处理线程安全,减轻了开发者负担。 4. **功能丰富度**:Spring Controller提供了丰富的功能,如数据验证、模型绑定、异常处理等,这些在原生Servlet...
通过分析这个项目,开发者不仅可以学习到Spring的多线程使用,还可以了解到如何在实际项目中配置和管理线程,以及如何利用异步执行提升应用程序性能。这些知识对于理解和掌握Spring框架,以及在实际开发中有效利用多...
5. **无状态设计**:设计Controller为无状态,即它不持有任何请求间的持久状态,这样就无需担心线程安全问题。通常,状态应该由请求本身携带,而不是由Controller持有。 在给定的代码示例中,`UserService`中的`...
但是,这种方法不适用于非Spring管理的线程,因为Spring不会自动为这些线程注入`ApplicationContext`。 5. **ApplicationEventPublisher**:Spring的事件发布机制可以用于线程间的通信。一个线程可以发布事件,另一...
本示例将深入探讨如何使用注解来实现事务控制以及如何在Spring Boot中运用多线程。 首先,让我们关注"注解事务"。在Spring框架中,我们主要依赖`@Transactional`注解来声明事务边界。当一个方法被这个注解标记时,...
在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...
总之,虽然Spring Boot提供了Controller间调用的手段,但这并不是推荐的做法。正确的设计应当侧重于服务和组件的解耦,确保每个部分都专注于其核心功能,从而降低耦合度,提高整体架构的稳定性和可扩展性。在实际...
Spring Boot 多线程 Demo Spring Boot 中使用多线程的方式有很多种,最简单的方式就是使用 @Async 注解来实现。下面我们将详细介绍如何使用 @Async 注解来实现多线程编程。 多线程前言 在 Java 中,多线程编程是...
本文将深入探讨Spring如何实现多线程队列以及其相关的核心概念和技术。 1. **线程池**: 在Spring中,我们通常使用`ThreadPoolTaskExecutor`来创建一个线程池,它是一个实现了`java.util.concurrent.Executor`接口...
在Web应用中,大部分服务类通常设置为单例模式,因为它们是线程安全的。然而,如果这些服务类中包含对数据库的操作,如Ibatis的SqlSession,那么必须注意线程隔离,防止多个线程共享同一SqlSession实例,导致数据...
总结来说,Spring 中的单例模式虽然方便了对象管理,但如果不注意线程安全问题,可能会导致意料之外的结果。在设计类时,应该根据业务需求谨慎选择实例化策略,并且对于可变状态的单例类,应采取适当的同步措施或改...
在Java Web开发中,Servlet和Spring MVC(主要通过Controller)是两种常见的请求处理机制。本文将深入探讨原生Servlet与Spring Controller在性能方面的差异,并基于一个名为"AbTest"的Servlet项目源码进行分析。 ...
在实际项目中,我们还需要关注线程安全问题,比如同步机制(synchronized关键字、Lock接口)、线程间通信(wait、notify、Condition)以及并发工具类(ConcurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore...
"springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...
AOP是Spring框架的核心组件之一,它允许程序员定义“切面”,这些切面可以包含业务逻辑之外的横切关注点,如日志、事务管理、安全性等。AOP通过两种主要的方式实现:代理模式(Proxy)和织入(Weaving)。在Spring中...