什么是spring?
spring框架是一个轻量级的开源的JavaEE框架。
所谓轻量级则是:占用空间小,代码侵入性低,代码耦合度低,降低代码复杂度,可以轻易适配多种框架。
随着spring的不断发展,它所占用的空间也不断增大从而使得空间小的优势逐渐降低,但是spring依然遵守着尽可能降低占用空间的方式采用了按需加载的方式来管理jar包。并且spring的轻量级真正体现在代码的侵入性低和代码耦合第低的特点,相比于早期的ELB框架有着明显的优势。
由于在spring未出现之前,大量java开发者都会使用EJB框架来进行开发,这个框架是基于JavaEE进行封装的,对代码的侵入性很强并且操作起来也很复杂,下面给出详细对比。
特性 | EJB (传统 EJB 2.x 为代表) | Spring Framework | Spring 的优势/区别 |
---|---|---|---|
编程模型 | 侵入式、复杂 | 非侵入式、简单 | |
必须实现特定接口 (SessionBean , EntityBean , MessageDrivenBean ),业务代码与 EJB API 紧密耦合。 | 基于 POJO。业务类是普通 Java 类,无需实现特定框架接口或继承基类(注解配置为主)。 | 更简单、更灵活、代码更干净、更容易理解和维护。 | |
重量级 vs 轻量级 | 重量级 | 轻量级 | |
严重依赖功能齐全的应用服务器 (Full J2EE App Server),启动慢,资源消耗大。 | 核心容器小巧高效。可以运行在 Servlet 容器 (Tomcat, Jetty) 甚至 Java SE 环境中。Spring Boot 进一步简化了独立部署。 | 启动更快、资源占用更少、部署选择更灵活(尤其适合云和微服务)。 | |
依赖管理 | 复杂、容器管理 | 灵活、依赖注入 (DI) | |
依赖查找 (JNDI) 或通过 EJB 容器管理的注入机制 (后来加入)。配置相对复杂。 | 核心特性是 IoC/DI。对象依赖关系通过容器外部配置 (XML, Java Config, 注解) 注入,而非硬编码创建。 | 解耦更彻底、配置更清晰、测试更容易 (方便 Mock 依赖)。 | |
服务提供方式 | 容器提供 | 框架集成或声明式 | |
事务、安全、持久化、分布式等复杂服务由 EJB 容器提供和管理。开发者通过部署描述符 (ejb-jar.xml ) 或注解配置。 | 声明式服务:通过 AOP 和框架集成提供。 * 事务管理: @Transactional 注解或 XML 配置。* 安全: Spring Security (独立模块)。 * 持久化: 集成 JPA/Hibernate/MyBatis 等,提供 JpaTemplate /HibernateTemplate (简化版) 或直接使用标准 JPA。* 远程调用: 支持多种方式 (RMI, Hessian, HTTP Invoker),但不强制分布式。 | 更灵活、更透明、非强制。可以选择需要的服务,按需引入模块。避免容器“黑魔法”。 | |
测试 | 非常困难 | 非常容易 | |
严重依赖 EJB 容器环境,需要启动整个应用服务器或在模拟容器中进行,速度慢,复杂度高。 | 核心是 POJO + DI,业务逻辑可以在容器外轻松进行单元测试。Spring 提供强大的 spring-test 模块支持集成测试(加载部分或完整上下文)。 | 大幅提升开发效率和代码质量。TDD/BDD 友好。 | |
学习曲线 | 陡峭 | 相对平缓 | |
需要深入理解复杂的 EJB 规范、部署描述符、容器行为和各种服务。 | 核心概念 (IoC, DI, AOP) 清晰,易于上手。丰富的文档和社区支持。 | 更容易被开发者接受和掌握。 | |
可移植性 | 理论高,实际受限 | 高 | |
遵循 J2EE 标准,理论上可在不同应用服务器间移植。但实际中常遇到厂商特定行为或扩展的兼容性问题。 | 不绑定特定容器或服务器。核心代码是 POJO,配置是 Spring 的,可以在支持 Servlet 规范或 Java SE 的任何环境运行。 | 真正的“一次编写,到处运行”(在支持Java的环境)。 | |
模块化 | 较弱 (早期) | 强 | |
EJB 规范本身是一个整体,应用服务器通常全量提供。 | 高度模块化设计。开发者只需引入项目实际需要的模块 (如 spring-core , spring-context , spring-jdbc , spring-webmvc )。Spring Boot 的 Starter 进一步简化依赖管理。 | 减少不必要的依赖和资源开销,应用更轻量。 | |
事务管理 | CMT (容器管理事务) 为主 | 声明式事务为主 | |
通过容器提供声明式事务 (@TransactionAttribute 或 XML)。功能强大,但控制相对黑盒。 | 强大的、灵活的声明式事务管理 (@Transactional )。也支持编程式事务。底层可适配不同事务管理器 (JDBC, JTA, Hibernate 等)。 | 配置更直观,行为更透明,易于理解和定制。同样强大,且不绑定 JTA (在单数据源场景可用更轻量的资源本地事务)。 | |
持久化 | Entity Beans (CMP/BMP - 复杂且低效) | 集成 ORM 框架 | |
EJB 2.x Entity Beans (尤其是 CMP) 设计复杂,性能差,难以使用。EJB 3.0 引入了 JPA (借鉴了 Hibernate 等 ORM 思想)。 | 不发明轮子,拥抱最佳实践。完美集成 JPA (Hibernate, EclipseLink 等) 和 MyBatis 等流行持久化框架。提供 JdbcTemplate 简化 JDBC。 | 开发者可以使用成熟、高效、社区活跃的 ORM 框架,避免了 Entity Bean 的缺陷。 | |
分布式能力 | 核心设计目标 (RMI-IIOP) | 不强制,按需选择 | |
天生为分布式设计 (RMI-IIOP 通信),但分布式本身带来复杂性和性能开销。 | 不强制分布式。鼓励将应用拆分为合适的粒度。需要分布式时,可选用多种技术 (Spring Cloud, REST, gRPC, 消息队列等)。 | 更符合“简单设计”原则。大多数应用不需要重量级的分布式通信。微服务时代有更现代的选择。 |
经过上述对比我们发现EJB就像是古代打仗时候的重骑兵一样,相较于EJB则spring更加像是一个轻骑兵,用起来更加方便。
Spring家族:
上图则是spring框架的总体功能,可以看到spring的核心是在Core当中,也就是树的根。这个Core种含有IOC容器和一些Framework工具类。因此我们可以看出整个spring架构种的核心其实就是IOC容器,如果没有IOC容器的支持整个spring的其他功能都无法正常运行。
spring家族目前有以下几大类
-
Spring Framework 是地基。
-
Spring Boot 是快速构建独立应用的加速器。
-
Spring Data 统一数据访问。
-
Spring Security 保障安全。
-
Spring Cloud 构建和管理分布式微服务系统。
-
其他组件 (Integration, Batch, Session, GraphQL, HATEOAS, Shell, Kafka/AMQP, Vault, Statemachine) 解决特定领域的复杂问题。
spring的特点:
方便解耦,简化开发
AOP编程支持
方便程序测试
方便和其他框架整合
方便进行事务操作
降低API开发的难度