spring6-基础

Spring框架是一个轻量级、开源的Java EE全栈框架,以IoC/DI和AOP为核心,消除样板代码,实现松耦合,简化事务管理和横切关注点处理。其模块化生态系统整合多种技术,支持云原生、响应式编程等现代开发需求,大幅提升开发效率、可维护性和扩展性。

Posted by Hilda on June 12, 2025

spring官网:https://spring.io/

1.spring框架的优势

  • 1.消除样板代码,提升业务层关注度。比如Mybatis来说,通常需要写和核心业务逻辑无关的样板代码,比如加载配置文件,构建SqlSessionFactory,开启SqlSession,获取Mapper代理对象等等,重复编写就会增加出错的可能性,使业务层代码的关注点分散,是一系列繁琐的资源管理操作。Spring 通过其IoC 容器和对 Mybatis 的集成,彻底解决了这一问题。Spring 负责 Mybatis 相关对象的生命周期管理和依赖注入。开发者只需在 Spring 配置文件(或通过注解)中声明 Mybatis 的数据源、SqlSessionFactory 和 Mapper 接口,Spring 就会自动完成它们的初始化和注入。业务层代码可以直接通过依赖注入获取到 Mapper 接口的实例,无需关心底层的 Mybatis 资源管理细节,从而可以更纯粹地关注业务逻辑的实现,大幅度提升了开发效率和代码的内聚性。

  • 2.实现松耦合,提升系统可维护性和可扩展性。在没有 IoC/DI 容器的项目中,层与层之间(例如 Controller 层调用 Service 层,Service 层调用 Mapper 层)的对象实例化通常通过硬编码的 new 操作来完成。这种直接的依赖创建方式导致了紧耦合:当底层实现类(如 Service 接口的具体实现)发生变化时,所有直接 new 该实现类的上层代码都需要被修改。这使得系统难以维护,因为局部变更可能引发连锁反应,同时也不利于单元测试(难以替换依赖)和后续的功能扩展。—>牵一发动全身
    • Spring 的核心是其IoC/DI机制,对象实例的创建和管理不再由开发者手动控制,而是由 Spring 容器来完成,Spring 容器在运行时自动将一个对象所依赖的其他对象注入到它里面。这意味着开发者无需在代码中显式地使用 new 关键字来创建依赖对象,而是通过接口编程,并由 Spring 容器在运行时提供具体的实现。这种机制实现了松耦合,层与层之间通过接口进行交互,具体实现类的变化不会影响到调用方,极大地提升了系统的可维护性、可测试性和可扩展性。
  • 3.提供声明式事务管理,简化事务编程模型。传统的 JDBC 或单纯 Mybatis 的事务管理通常是编程式事务,即开发者需要手动在代码中编写事务的开启、提交、回滚以及异常处理逻辑(通常涉及大量的 try-catch-finally 块)。这种方式不仅代码冗余,而且容易出错,且将事务管理细节与业务逻辑紧密耦合,降低了代码的内聚性和可读性。
    • Spring 提供了强大的声明式事务管理 (Declarative Transaction Management) 能力。通过配置(XML 或注解,如 @Transactional),开发者可以将事务管理的职责从业务代码中剥离出来。Spring 事务管理器会在方法执行前后自动处理事务的开启、提交或回滚。这种方式使得业务代码更专注于业务逻辑,无需关注事务的底层细节,大大简化了事务编程模型,提高了开发效率和代码的健壮性。
  • 4.增强横切关注点处理,提升系统扩展性与模块化。在传统开发模式中,一些系统级的非核心业务逻辑(如日志记录、性能监控、安全检查、事务管理等),我们称之为横切关注点 (Cross-cutting Concerns)。这些逻辑往往分散在系统的各个模块中,导致代码冗余、难以维护和修改。例如,如果要在所有方法执行前后添加日志,就需要在每个方法中手动添加日志代码,这会污染业务逻辑。
    • Spring 的面向切面编程 (AOP) 模块能够优雅地处理这些横切关注点。AOP 允许开发者将这些分散的横切逻辑模块化为独立的“切面”,并通过“织入”的方式,在不修改原有业务代码的情况下,将其应用到特定的“连接点”(如方法执行前、后、异常抛出后等)。这使得业务逻辑代码保持纯净,横切关注点得到集中管理和复用,从而显著提升了系统的模块化、可维护性和扩展性。
  • 5.作为“框架的框架”,提供统一的生态系统。传统项目中,开发者可能需要单独引入和配置各种第三方框架,并自行处理它们之间的兼容性和集成问题,这可能导致技术栈碎片化,增加学习和维护成本。
    • Spring 不仅仅是一个单一框架,更是一个全功能栈 (Full-stack) 框架,被誉为“框架的框架”。它提供了大量的模块(如 Spring Core、Spring MVC、Spring Data、Spring Security 等),并且具备强大的第三方框架整合能力。无论是 Mybatis、Hibernate、Kafka、Redis 还是其他众多流行技术,Spring 都能提供统一且简化的集成方式。这使得开发者可以在一个统一的、成熟的生态系统中进行开发,降低了学习曲线,减少了集成难度,并能更高效地利用各种优秀的开源技术来构建复杂的企业级应用。

2.引入Spring框架

Spring 框架的前身确实是 Interface21,由 Rod Johnson 于2002年基于他对 J2EE(现在的 Java EE)开发的深刻理解和痛点所研发。Rod Johnson 在他的著作《Expert One-on-One J2EE Design and Development》(2002年出版)中提出了大量创新思想和最佳实践,并附带了一个名为 Interface21 的框架原型代码,用于演示和实现书中的理念。这个原型代码就是 Spring 框架的最初版本。

Spring 是众多开源 Java 项目中的一员,它是一个基于分层的 Java EE 应用的一站式轻量级开源框架。其核心思想和技术基石确实是 IoC(控制反转)/DI(依赖注入)AOP(面向切面编程),这两大技术使得项目在开发过程中能够实现轻松解耦,极大提高了项目的开发效率。

Spring 最初火的原因是——“轮子理论”的实践与反击

“轮子理论”在软件开发领域通常指:“不要重复发明轮子。” 这句话的本意是鼓励开发者复用已有的、成熟的解决方案,而不是每次都从头开始编写类似的功能。

然而,在 Spring 诞生的早期,Java EE 领域(特别是 EJB 2.x 时代)面临着严重的过度复杂性问题。EJB(Enterprise JavaBeans)在设计上试图提供全面的企业级服务,但其复杂的编程模型、笨重的部署方式、强侵入性的 API 以及对应用服务器的强依赖,使得开发效率低下,测试困难,维护成本高昂。许多开发者在这种“重量级”的环境下感到非常沮丧。

在这种背景下,Rod Johnson 和 Spring 的出现,可以被视为对当时 Java EE 领域“重复发明轮子”但却把轮子造得过于复杂、过于沉重的一种反击和颠覆

Rod Johnson 还是一位拥有音乐博士学位的学者!

音乐,尤其是古典音乐,强调结构、和谐、简洁而有力的表达。一个好的乐章往往能用最精炼的音符表达最丰富的情感。

同样地,Spring 框架的设计哲学也强烈体现了对简洁性、非侵入性、优雅性的追求。它致力于消除 Java EE 开发中的复杂性和样板代码,让开发者能够更专注于业务逻辑,用更“少”的代码做更“多”的事情。这种对“优雅”和“简洁”的共同追求,可能源于其音乐背景所培养的审美和结构化思维。

音乐创作中,常常会涉及到乐句、主题、和弦的复用和组合,形成整体的章法。

在软件开发中,Spring 的 IoC/DI 和 AOP 机制正是强调了组件的复用和灵活组合。IoC 容器管理组件的生命周期和依赖关系,使得组件可以像乐高积木一样被自由地组装和替换,而 AOP 则允许开发者在不修改核心逻辑的情况下,像在乐曲中加入不同乐器声部一样,织入横切关注点。

这种跨学科的思维方式,无疑为 Spring 框架的开创性设计理念注入了独特的洞察力,使其在当时复杂臃肿的 Java EE 世界中脱颖而出,以其“轻量级”和“非侵入性”的特点赢得了广大开发者的青睐。

3.spring历史发展

以下是 Spring 框架主要的发展阶段和里程碑:

1. 起源与早期(2002-2004):反击 J2EE 复杂性

  • 2002年: Rod Johnson 在其著作《Expert One-on-One J2EE Design and Development》中发布了 Spring 框架的原型代码(当时名为 Interface21)。这本书核心思想就是批判当时 J2EE(特别是 EJB 2.x)的过度复杂性,并提出一种更轻量级、非侵入式的替代方案。IoC/DI 和 AOP 的核心概念在此阶段被提出。
  • 2003年6月: Spring 框架以 Apache 2.0 许可证开源发布 0.9 版本。
  • 2004年3月24日: Spring Framework 1.0 正式发布,标志着 Spring 项目的正式启动和其在业界的初步认可。

2. 崛起与成熟(2005-2010):功能扩展与生态萌芽

  • 2006年: Spring 1.2.6 框架获得了 Jolt Productivity Award 和 JAX Innovation Award,进一步确立了其在业界的地位。
  • 2006年10月: Spring Framework 2.0 发布,引入了更多基于注解的配置支持(简化了 XML 配置)、更强大的 AOP 功能,以及对 Spring Security(当时名为 Acegi Security)等子项目的支持。
  • 2007年11月: Spring Framework 2.5 发布,进一步增强了注解支持,简化了配置,并提供了对 AspectJ 更紧密的集成。
  • 2009年12月: Spring Framework 3.0 发布,这是一个重要的里程碑。它引入了 Java-based Configuration(JavaConfig),允许完全通过 Java 代码进行配置,极大地减少了对 XML 的依赖。同时,它也开始支持 RESTful Web Services,并对 Java EE 6 规范提供了初步支持。

3. 适应新趋势(2011-2016):云计算、微服务前瞻

  • 2011年12月: Spring Framework 3.1 发布,引入了 Profile 支持(根据不同环境激活不同配置)和更灵活的缓存抽象。
  • 2013年11月: Spring Framework 3.2 发布,增加了对 Servlet 3.0、WebSocket 的支持,并为更复杂的应用场景做了优化。
  • 2013年12月: Spring Framework 4.0 发布,这是一个重要的版本,开始全面支持 Java SE 8(包括 Lambda 表达式)、Groovy 2,并拥抱部分 Java EE 7 规范。也是在这个时期,Spring Boot 的雏形开始出现,旨在简化 Spring 应用的开发和部署。
  • 2014年4月: Spring Boot 1.0 正式发布。 Spring Boot 极大地简化了 Spring 应用的搭建、配置和部署,通过“约定优于配置”和嵌入式服务器等特性,加速了微服务架构的发展和云原生应用的落地,成为 Spring 生态中最受欢迎的部分之一。
  • 2016年6月: Spring Framework 4.3 发布,作为 Spring 4 系列的最终版本,继续在性能和功能上进行优化。

4. 拥抱现代 Java 与云原生(2017-至今):响应式编程与 Jakarta EE

  • 2017年9月: Spring Framework 5.0 发布,这是一个重大版本,提供了对 Reactive Programming(响应式编程) 的全面支持(引入 Spring WebFlux),并要求 Java 8 作为最低版本。同时,它也为 Spring 5 系列奠定了支持 Java 9+ 模块化的基础。
  • 2020年10月: Spring Framework 5.3 发布,作为 5.x 系列的最后一个特性分支,继续对现代 Java 版本和云原生应用进行优化。
  • 2022年11月: Spring Framework 6.0 发布。 这是 Spring 框架的一个里程碑版本,要求 Java 17+ 作为最低版本,并全面转向 Jakarta EE 9+(即从 javax 命名空间迁移到 jakarta 命名空间),以适应 Java EE 规范的演进。它为未来基于云原生和现代 Java 特性的应用提供了更强大的基础。
  • 2023年11月: Spring Framework 6.1 发布,继续在 6.x 系列的基础上进行改进。
  • 2024年11月: Spring Framework 6.2 发布(根据当前时间)。

Spring AI 是一个旨在简化将人工智能功能集成到 Spring 应用程序中的项目。它的核心目标是:

  1. 提供易于使用的 API: 封装了各种 AI 模型(特别是大型语言模型 LLM)和 AI 服务的复杂性,为开发者提供统一且简洁的 API 接口,让他们能够轻松地在 Spring 应用中调用 AI 能力。

  2. 促进可插拔和可扩展性: Spring AI 强调与不同 AI 模型和 AI 供应商的可插拔性。这意味着你可以轻松地切换不同的 AI 模型(例如 OpenAI 的 GPT 系列、Google 的 Gemini、Hugging Face 上的开源模型等)和不同的 AI 云服务提供商,而无需修改大量的业务代码。

  3. 遵循 Spring 编程模型: 它延续了 Spring 一贯的编程思想,如 IoC/DI、模板模式、声明式编程等,让熟悉 Spring 的开发者能够以非常熟悉的方式使用 AI 功能。

  4. 支持主流用例:

    它设计用于支持各种常见的 AI 应用场景,例如:

    • 内容生成 (Content Generation): 如文本摘要、文章创作、代码生成等。
    • 聊天机器人 (Chatbots): 构建智能对话系统。
    • RAG (Retrieval Augmented Generation): 结合外部知识库增强 LLM 的回答能力。
    • 文本嵌入 (Text Embeddings): 用于语义搜索、推荐系统等。
    • 图像生成 (Image Generation): 与文生图模型集成。

Spring AI 能够与 Spring Boot、Spring Data、Spring Batch 等 Spring 生态中的其他模块无缝协作,构建出功能强大、可伸缩的 AI 驱动应用。

到今天(2025.06.10)最新的GA(General Availability)版本是6.2.7。本篇笔记的学习也会围绕这个版本。

4.spring模块介绍

https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/html/overview.html

image-20250611001359306

  • Core Container:核心容器,这是Spring框架的基础,提供了IoC(Inversion of Control,控制反转)/DI(Dependency Injection,依赖注入)的核心功能。

    • Beans (Bean模块):
      • 重点: 这是Spring IoC容器的基础。它负责管理Spring Bean的生命周期,包括创建、配置和销毁。通过Bean模块,你可以定义应用程序中的各种组件(对象),并让Spring容器来管理它们之间的依赖关系。
    • Core (核心模块):
      • 重点: 提供了Spring框架的基本功能,包括IoC容器和依赖注入。它包含了对Spring Bean定义的解析和管理,以及基本的工具类。
    • Context (上下文模块):
      • 重点: 建立在Core和Beans模块之上,提供了更高级的服务,例如国际化(i18n)、事件传播、资源加载以及对JNDI(Java Naming and Directory Interface)的支持。它是访问Bean的入口点,提供了一种访问和管理应用程序上下文的方式。
    • SpEL (Spring Expression Language,Spring表达式语言):
      • 重点: 一种强大的表达式语言,用于在运行时查询和操作对象图。它可以在配置Bean时使用,实现更灵活和动态的配置。
  • 中间层 (通用功能模块):
    • AOP (Aspect-Oriented Programming,面向切面编程):
      • 重点: 允许你定义横切关注点(如日志、事务管理、安全)并将其应用到应用程序的各个部分,而无需修改核心业务逻辑。它通过切面(Aspects)、通知(Advice)、切入点(Pointcut)等概念实现。
    • Aspects (方面模块):
      • 重点: 提供与AspectJ的集成,AspectJ是一个成熟的AOP框架。Spring的AOP模块主要基于代理,而Aspects模块提供了更强大的编译时和加载时织入功能。
    • Instrumentation (监控/设备模块):
      • 重点: 提供了对JVM(Java Virtual Machine)的特殊支持,允许在应用程序运行时对类进行修改,常用于监控和诊断工具。
    • Messaging (消息模块):
      • 重点: 提供对消息的抽象和支持,例如集成JMS(Java Message Service)或通过STOMP协议支持WebSocket消息。
  • Data Access/Integration (数据访问/集成):

    • JDBC (Java Database Connectivity):
      • 重点: 简化了JDBC的使用,消除了繁琐的异常处理和资源关闭。它提供了JDBC模板类,使得数据库操作更加简洁高效。
    • ORM (Object-Relational Mapping,对象关系映射):
      • 重点: 提供了与流行ORM框架(如Hibernate、JPA、iBatis等)的集成。Spring通过其ORM模块可以无缝地管理这些框架的会话、事务等。
    • OXM (Object XML Mapping,对象XML映射):
      • 重点: 提供了XML与Java对象之间的映射支持,允许你轻松地序列化和反序列化XML数据。
    • JMS (Java Message Service):
      • 重点: 简化了Java消息服务的使用,提供了发送和接收消息的模板类。
    • Transactions (事务):
      • 重点: 提供了声明式事务管理,允许你在不编写复杂代码的情况下管理数据库事务。可以通过注解或XML配置来定义事务的边界和行为。
  • Web (Web模块)

    • WebSocket (WebSocket):
      • 重点: 提供了对WebSocket通信协议的支持,使得在Web应用程序中实现全双工、低延迟的通信成为可能。
    • Servlet (Servlet):
      • 重点: 包含了Spring MVC框架的核心功能。Spring MVC是一个基于Servlet的Web框架,提供了模型-视图-控制器(MVC)架构,用于构建灵活的Web应用程序。
    • Web (Web通用模块):
      • 重点: 提供了Web应用程序所需的通用支持,包括文件上传、请求处理、Web应用程序上下文的集成等。
    • Portlet (Portlet):
      • 重点: 提供了对Portlet环境的支持,用于在门户网站中构建基于Spring的Portlet应用程序。
  • 单元测试:即Spring-test模块。Spring-test模块主要为单元测试提供支持 。