【Java 第十一篇章】Spring 框架介绍

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Spring 是广泛用于企业级 Java 开发的开源框架,提供轻量级解决方案,助力构建灵活、可维护的应用。核心组件包括 IOC 容器、AOP、MVC、JDBC/ORM、事务处理及远程调用。依赖注入(DI)是其核心特性之一,允许容器自动管理对象间的依赖关系,提升代码的可测试性和解耦。面向切面编程(AOP)则支持将横切关注点(如日志、事务)与业务逻辑分离,促进代码复用和关注点分离。Spring 的 IoC 容器负责对象的创建和管理,简化对象的生命周期管理。Spring 框架具备低侵入性设计,易于整合主流技术栈。

一、概述

Spring 是一个广泛应用于企业级 Java 开发的开源框架,它提供了一种全面的、轻量级的解决方案来构建灵活、可维护和高效的应用程序。

二、Spring的核心的组件

核心模块名称 描述
Spring IOC 包含了最为基本的Ioc容器BeanFactory的接口和实现,也就是说,在这个Spring的核心包中,不仅定义了IOC容器的最基本的接口(BeanFactory),也提供了一系列这个接口的实现,如XmlBeanFactory就是一个最基本的BeanFactory(IOC容器)。
Spring Aop 这也是Spring的核心模块,围绕这个AOP的增强功能,Spring 集成了AspectJ作为AOP的一个特定实现,同时还在JVM动态代理、CGLIB的基础之上,实现了一个AOP框架。作为Spring集成其他模块的工具,比如事务 就是通过AOP集成到项目中的。
Spring MVC Spring MVC 是以DispatcherServerlet为核心,实现了MVC模式,包括怎样和web容器环境的集成,web 请求的拦截、分发、处理和ModelAndView 数据的返回,以及如何集成各种UI视图展示和数据表现。
Spring JDBC/Spring ORM Spring JDBC主要封装了对数据库的操作。 Spring ORM主要是将从数据库中查出来的数据,映射到对象中。
Spring事务处理 Spring 事务处理是一个通过Spring AOP实现自身功能增强的典型模块。
Spring 远程调用 Spring 为应用带来的一个好处就是能够将应用解耦。应用解耦,一方面可以降低设计的复杂性,另一方面,可以在解耦以后将应用模块分布式部署,从而提高系统整体的性能。
Spring应用 从严格意义来说,这个模块不属于spring模块,这个部分是扩展的spring。

三、核心概念和特点

1、依赖注入 (Dependency Injection,DI)

  • 概念

这是 Spring 的核心特性之一。它允许对象之间的依赖关系在运行时由容器自动注入,而不是在代码中显式地创建依赖对象。例如,一个Service类可能依赖于一个DAO(数据访问对象)类,在传统方式下,Service类可能需要在其内部实例化DAO对象。但在 Spring 中,通过依赖注入,容器会自动将DAO对象实例传递给Service类,Service类只需要接收这个已经实例化好的DAO对象即可。

  • 作用

提高代码的可测试性:因为对象的依赖关系是通过外部配置而不是硬编码在代码中,所以在单元测试中可以方便地替换模拟对象来测试Service类的功能,而不需要关心DAO对象的具体实现。

降低代码的耦合度:各个组件之间的依赖关系更加清晰和松散,使得代码更容易维护和扩展。当需要更换DAO的实现或者添加新的功能时,只需要修改配置文件,而不需要修改Service类的代码。

2、面向切面(Aspect Oriented Programming,AOP)

  • 概念

AOP 是一种编程范式,它允许开发者将横切关注点(如日志记录、事务管理、安全检查等)与业务逻辑分离。在 Spring 中,通过 AOP 可以将这些横切关注点定义为切面,然后在不修改业务代码的情况下,将切面应用到目标对象(被增强的对象)上。

  • 作用:

代码复用:例如,对于日志记录功能,不需要在每个业务方法中重复编写日志记录代码,而是通过定义一个日志切面,将日志记录逻辑集中在一处,然后应用到多个需要记录日志的方法上。

清晰的关注点分离:业务逻辑代码可以更加专注于核心业务功能,而将非业务相关的横切关注点(如事务处理、安全等)从业务代码中分离出来,提高代码的可读性和可维护性。

3、控制反转(Inversion of Control,IoC)容器

  • 概念

Spring 框架是一个 IoC 容器,它负责创建、管理和组装应用程序中的对象。IoC 是一种设计模式,它将对象的创建和依赖关系的管理从应用程序代码转移到容器中。容器根据配置文件或注解等信息,自动创建对象并注入它们之间的依赖关系。

  • 作用

简化对象管理:开发者不需要手动实例化和管理对象的生命周期,容器会负责这些工作。例如,当一个对象需要另一个对象作为依赖时,容器会自动创建并提供这个依赖对象,开发者只需要关注对象的使用,而不是创建过程。

提高代码的可维护性:由于对象的创建和管理集中在容器中,当应用程序的结构发生变化时,只需要修改容器的配置,而不需要在大量的代码中进行修改。

  • IOC 实现策略

依赖查找(Dependency Lookup)

  • 原理
    • 容器会向组件提供回调接口和上下文条件。在这种模式下,组件自身需要通过容器提供的特定 API 来主动查找其所需要的资源和协作对象。
    • 虽然名为控制反转,但实际上真正体现控制反转的部分相对有限,主要只体现在容器会调用组件的回调方法这一点上。通过这种方式,当容器调用回调方法时,应用代码才能够获得相关的资源。
  • 举例
    • 以 EJB(Enterprise JavaBeans)为例,EJB 组件可能需要通过 EJB 容器提供的特定接口和方法来查找数据库连接等资源。比如,一个 EJB 组件要访问数据库,它可能需要使用 EJB 容器提供的查找方法来获取数据库连接对象,而不是自己直接去创建连接。类似地,在 Apache Avalon 框架中,组件也需要通过 Avalon 容器提供的方式来查找其依赖的其他组件或资源。
  • 特点
    • 这种方式要求组件对容器有一定的了解,因为它需要使用容器提供的 API 进行资源查找。并且在一定程度上,组件还是有一些主动查找资源的行为,控制反转没有那么彻底。

依赖注入(Dependency Injection)

  • 原理
    • 组件自身不需要进行定位查询来获取其依赖的对象。它只需要提供普通的 Java 方法(比如设值方法或构造函数),然后由容器来全权负责组件的装配工作。
    • 容器会根据组件之间的依赖关系,将符合要求的对象通过 JavaBean 属性(设值方法注入)或者构造函数(构造器注入)传递给需要的对象。这样组件就不需要关心如何获取其依赖的对象,完全由容器来处理。
  • 设值方法注入(Setter Injection)
    • 例如有一个UserService类,它依赖于一个UserDao对象来进行数据库操作。在设值方法注入中,UserService类会有一个setUserDao的设值方法。容器在创建UserService对象之后,会将一个已经实例化好的UserDao对象通过调用setUserDao方法传递给UserService对象,从而建立依赖关系。这样,UserService类就可以使用注入的UserDao对象来执行数据库相关的操作,而不需要自己去创建UserDao对象。
  • 构造器注入(Constructor Injection)
    • 还是以UserService为例,它的构造函数可以接收一个UserDao对象作为参数。当容器创建UserService对象时,会通过构造函数将一个UserDao对象实例传递进去。这样在UserService对象创建时就已经建立了与UserDao对象的依赖关系。比如UserService的构造函数可能定义为public UserService(UserDao userDao),容器会创建一个UserDao对象并将其作为参数传递给UserService的构造函数来创建UserService对象。
  • 特点
    • 依赖注入方式使得组件与容器之间的耦合度更低,组件更专注于自身的业务逻辑,而依赖关系的建立完全由容器负责,实现了更彻底的控制反转。它提高了代码的可测试性和可维护性,因为在测试时可以方便地通过模拟依赖对象来测试组件的功能,而不需要依赖实际的复杂依赖关系。

四、spring 优点

低侵入式设计,代码的污染极低。将对象的管理交给框架处理,减低组件的耦合性。良好的提供了AOP技术。对主流框架的良好的整合和集成。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
2月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
202 2
|
2月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1219 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
3月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
2月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
1155 58
|
24天前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
26天前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
103 8
|
1月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
59 7
|
2月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
217 2
|
3月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
215 23