【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技术。对主流框架的良好的整合和集成。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
19天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
15天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
15天前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
23天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
42 1
Spring 框架:Java 开发者的春天
|
15天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
14天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
65 1
|
21天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
17天前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
11 1