一个老生常谈的话题,最近出去面试,十之八九还会问这个,今天在博客园里有人说Spring的问题,忍不住点进去看了看,感觉没说出个所以然,所以写篇小文谈谈我的看法。
Spring的由来在其作者Rod Johnson的两本名著(《Expert One-on-One J2EE Development without EJB》和《Expert One-on-One J2EE Design and Development》)中讲得清清楚楚,这里所说的大部分是在拾人牙慧,没办法,多年前的东西现在还是需要重复。
从历史上看,Spring是在对当时横行Java世界的企业级应用的标准解决方案EJB的反叛中产生的。如果你对EJB是什么不清楚的话,没关系,反正在我看来这玩意儿就是个怪物,绝大部分企业应用场景下根本不需要它。这么说吧,从国外到国内,用过EJB的人几乎都会有一大堆血泪般的控诉(这里指的是EJB1和EJB2,我承认EJB3改进了很多),这是一个规范复杂丑陋难以理解、侵入式、难测试、生产率低的被厂商炒作出来的东西,看看EJB1、EJB2的规范文档后会发现其已完全背离简化企业应用开发的初衷(对于EJB的声讨,翻翻Javaeye在03年左右的帖子可以看到很多,这里不再赘述)。
EJB缺点很多,但绝非一无是处,要不那么多项目强忍着用它完全是找虐。它还是提供了很多有价值的东西,如声明性事务、O/R Mapping、各种池的管理、集群、远程调用等,这些是在企业应用开发中经常会用到的,理论上说EJB提供的这些可以提高生产率,让开发者分离关注点,将更多精力放在业务梳理和实现上,而不必太过操心这类所有JavaEE项目中通常都需要考虑的东西。
所有这些通用的东西就叫企业级服务,当时能够提供这些企业级服务的基础设施就是EJB容器。在市场上只有EJB时是这样的局面:你要么全部接受EJB的这一套复杂繁琐的规范,要么只能从头一步步自己实现所有企业级服务。
面对这种两难困境,Spring出现了,可以说它解放了生产力,给开发人员提供了一个更光明的未来。Spring是一个轻量级的无侵入的容器。所谓”容器“说白了就是代码运行的框架。那么何为轻量级,何为重量级?其实很难给出准确定义,有人开玩笑说“将技术规范文档放称上称一下,超过一斤的就是重量级,否则就是轻量级“,我的理解实际上就两点——无侵入、方便测试,满足这两点的就算轻量级。
在我看来Spring框架的核心原理就两条——IOC和AOP,基于POJO实现的依赖注入和基于代理的方式实现AOP。通过IOC实现功能模块之间的低耦合(以依赖注入的方式交由容器来管理模块之间的依赖),通过AOP实现功能模块之内的高内聚(以AOP的方式向功能内部注入其所需要的通常的企业级服务),从而达到功能模块的高内聚和低耦合,提高模块的独立性,奠定高质量软件架构的基础。以此为内核Spring作为万能黏合剂,将上述EJB提供的对应用开发有价值的企业级服务(如声明式事务、O/R Mapping、各种池管理等)的各类开源解决方案粘合到Spring中,从而替代EJB这种重型方案并且还提供易扩展、易测试等额外好处。
当然Spring发展到今天,本身已经集成了一大堆各类业务问题的解决方案,使得它成为一个几乎可以扫射一般中小型企业应用中遇到的绝大部分问题的强大武器。这一点还得感谢开源社区,正是因为社区对Spring理念的认同以及认同之后所贡献的各类业务问题的优秀解决方案,这种良性互动造成今天JavaEE领域框架市场上的王者之尊。
回到本文标题,为何用它?
看起来一个应用如果什么框架都不用倒像是最简单的,所有技术问题自己实现嘛(也就是重复造轮子)。但经过实践证明容器是非常重要的,连这都不要的话是过犹不及了(如果你做过一些仅仅使用java原生态技术的项目的话应该会对此深有体会)。有一个容器存在,它可以提供企业级服务(避免二次开发)、一致的服务访问方式、可插拔性、一站式购物体验(找到容器就可以找到容器提供的所有服务)等等。
明确了需要一个容器之后,还剩下一个选择的问题,究竟选择一个轻量级的还是EJB的容器?
EJB容器缺点上面说过了,但EJB有专门的厂商支持(你或者你的客户有足够的Money的话)。而开源的轻量级容器很多,为什么要选择Spring?我的答案除了对于Spring框架理念的认同之外,更重要的一点是它的社区活跃,碰到的大部分问题能直接在网上获得答案。
相关推荐
浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...
在Spring框架中,Quartz是一个常用的作业调度库,它允许开发者定义定时任务并按照预定的时间间隔执行。Quartz与Spring的集成使得我们可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented ...
浅谈Spring常用注解 浅谈Spring常用注解是Spring框架中的一些基本概念,了解这些概念对于 MASTERING SPRING Framework非常重要。本文将对Spring中常用的注解进行分类和介绍,并对每个注解的使用进行解释。 一、...
同时,Spring 的其他功能,如 JdbcTemplate、JPA 等,也可以与 Hibernate 并存,根据项目需求灵活选择数据访问策略。 总之,Spring 和 Hibernate 的整合是 Java Web 开发中的常见实践,它利用 Spring 的强大管理...
Spring Boot的核心优势在于其自动化配置,它极大地减少了XML配置文件的使用,转而倾向于Java配置和基于注解的编程。 1. **Spring Boot是什么,解决哪些问题** - **编码变简单**:Spring Boot通过提供默认配置和...
浅谈Spring Cloud Ribbon的原理 Spring Cloud Ribbon是一个基于Netflix的开源项目,主要提供客户端的软件负载均衡算法,将中间层服务连接在一起。Ribbon客户端组件提供了一系列完善的配置项,如连接超时、重试等。...
首先,Spring Data支持多种NoSQL数据库,例如MongoDB(文档数据库)、Neo4j(图形数据库)、Redis(键/值存储)和Hbase(列族数据库),同时也支持关系数据存储技术,如JDBC和JPA。对于JPA支持,Spring Data JPA提供...
Spring Boot 是一种基于 Java 的框架,旨在简化Spring框架的初始设置和常规配置。Spring Boot的出现是为了应对Spring项目日益复杂的构建和配置问题。在传统的Spring项目中,开发者需要手动添加构建路径、Maven依赖...
Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...
在Spring框架中,Bean的初始化是一个关键的概念,它涉及到Bean的生命周期管理以及Spring容器如何创建、配置和管理这些Bean。本文将深入探讨Spring容器中Bean的初始化过程。 首先,Spring容器根据XML配置文件(如`...
这是因为一年的实际开发经验能为理解Spring的基础架构奠定基础。在适当的资料辅助下,学习Spring不会过于困难。 【选择Spring和其他框架的依据】林信良强调,选择框架时要考虑稳定性、人员培训和文档支持。例如,...
当我们谈到`iBatis` 和 `Spring` 的整合时,意味着我们可以利用两者的优点,构建一个高效、灵活且易于维护的系统。 整合`iBatis` 和 `Spring` 主要涉及以下几个关键知识点: 1. **数据源配置**:在整合过程中,...
当我们谈到“Spring工程的初始化模块与基础配置”时,我们通常指的是设置Spring IoC(Inversion of Control)容器,该容器负责管理对象的生命周期和依赖关系。在XML配置文件中,我们可以通过`...
当我们谈到“activityMQ调用示例,spring集成示例”,这意味着我们将探讨如何将ActivityMQ与Spring框架整合,以实现高效、可扩展的系统架构。 首先,我们需要理解ActivityMQ的核心概念。ActivityMQ是一个基于Apache...
浅谈Spring中用到的设计模式及应用场景 Spring 框架是 Java 企业级应用程序的核心组件之一,它提供了强大的功能和灵活的架构来简化企业级应用程序的开发。Spring 框架使用了多种设计模式来实现其功能,本文将对 ...
"Spring与Spring MVC的区别与关系" Spring是一个开源框架,功能主要是依赖注入和控制反转。依赖注入有三种形式:构造注入、setter注入和接口注入。控制反转则主要是起到操控作用,把对象的创建、初始化、销毁交给...
一、为什么要进行这些更改 随着最新版本 Spring Boot 的发布,Spring 一直在努力提升对 Kubernetes 的原生支持。在 Spring Boot 2.3 中,官方增加了 Kubernetes Volume 的配置支持,但是未能实现。Volume 配置挂载...
当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和协调并发执行的任务。这涉及到Java的并发API以及Spring对这些API的包装和扩展。 首先,让我们了解Java中的多线程基础。在Java中,...
浅谈Springboot之于Spring的优势 ...同时,也欢迎各位参阅本站其他相关专题,如Spring的编程式事务和声明式事务详解、Spring spel表达式使用方法示例、浅谈Spring Boot微服务项目的推荐部署方式等。