quartz/content/Obsidian/后端/spring.md
wangzipai c917cb46cd
[PUBLISHER] Merge #33
* PUSH NOTE : spring.md

* PUSH NOTE : 依赖注入.md

* PUSH NOTE : DAO.md

* PUSH NOTE : JDBC.md

* PUSH NOTE : ORM.md

* PUSH NOTE : MVC.md

* PUSH NOTE : 动态代理.md

* PUSH NOTE : 反射机制.md
2024-12-03 21:48:11 +08:00

197 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2024-10-28 18:11
updated: 2024-12-03 21:45
tags:
- spring
- 后端
share: "true"
link: "false"
---
# 概述
## 介绍
Spring框架是企业使用最多的框架没有之一。Spring是一站式框架称之为一站式框架的原因是Spring可以整合其他框架。Spring主要用来开发Java应用Spring 可以被看作是一个大型工厂。
Spring工厂的作用就是==生产和管理 Spring 容器中的Bean==控制反转Spring IOC和面向切面编程Spring AOPSpring 致力于Java应用各层的解决方案。
要学习Spring的内容如下
- IoC控制反转
- DI[[../编程模型及方法/依赖注入|依赖注入]]
- Spring AOP面向切面编程技术为Spring事务管理打下基础。
- Spring Transaction managementSpring事务管理。
- Spring Web MVC不包含在本课程内后面单独学习简称Spring MVC框架用来简化JavaWEB开发当使用Spring MVC框架后就不用再编写Servlet了。也就不再需要itcast-tools工具中BaseServlet类了。
- Spring与其他框架整合因为我们只学习过MyBatis框架所以当前我们只学习Spring整合MyBatis框架。
## spring优点
Spring优点主要表现会如下4点
![image.png|450](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241031163127.png)
### 方便解耦
Spring的主要作用就是为代码解耦降低代码间的耦合度。
Spring 提供了IOC控制反转由容器管理对象对象的依赖关系现在由容器完成。
### AOP 编程的支持
通过 Spring 提供的 AOP功能方便进行面向切面的编程。
### 支持声明式事务处理
通过配置就可以完成对事务的管理,无需手动编程,让开发人员可以从繁杂的事务管理代码中解脱出来,从而提高开发效率和质量。
### 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,相反 Spring 可以降低各种框架的使用难度Spring 提供了对各种优秀框架比如Struts、Hibernate、MyBatis、SpringBoot等的直接支持。
# Spring体系结构
Spring框架至今已集成了20多个模块这些模块分布在以下模块中
- 核心容器Core Container
- 数据访问/集成Data Access/Integration
- Web层
- AOPAspect Oriented Programming模块
- 植入Instrumentation模块
- 消息传输Messaging
- 测试Test模块
Spring体系结构如下图
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241029104739.png)
## Spring Core核心容器
Spring的核心容器是其他模块建立的基础由Spring-core、Spring-beans、Spring-context、Spring-context-support和Spring-expressionString表达式语言等模块组成。
- Spring-core模块提供了框架的基本组成部分包括控制反转Inversion of ControlIOC和依赖注入Dependency InjectionDI功能。
- Spring-beans模块提供了BeanFactory是工厂模式的一个经典实现==Spring将管理对象称为Bean==。
- Spring-context模块建立在Core和Beans模块的基础之上提供一个框架式的对象访问方式是访问定义和配置的任何对象的媒介。ApplicationContext接口是Context模块的焦点。
- Spring-context-support模块支持整合第三方库到Spring应用程序上下文特别是用于高速缓存EhCache、JCache和任务调度CommonJ、Quartz的支持。Spring-expression模块提供了强大的表达式语言去支持运行时查询和操作对象图。这是对JSP2.1规范中规定的统一表达式语言Unified EL的扩展。该语言支持设置和获取属性值、属性分配、方法调用、访问数组、集合和索引器的内容、逻辑和算术运算、变量命名以及从Spring的IOC容器中以名称检索对象。它还支持列表投影、选择以及常用的列表聚合。
核心容器提供Spring框架的基本功能spring以bean的方式组织和管理Java应用的各个组件及其关系spring使用BeanFactory来产生和管理Bean是工厂模式的实现。
BeanFactory通过控制反转IOC模式将应用程序的配置和依赖性类与类之间的关系规范 与 实际的应用程序代码分开(尤指业务代码),从而降低了类与类之间的耦合度。
## AOP面向切面编程
Spring-aop模块提供了一个符合AOP要求的面向切面的编程实现允许定义方法拦截器和切入点将代码按照功能进行分离以便干净地解耦。
Spring-aspects模块提供了与AspectJ的集成功能AspectJ是一个功能强大且成熟的AOP框架。
AOP的实现原理为动态代理技术
## Spring Context模块
Spring上下文是一个配置文件向spring提供上下文信息spring上下文包括企业服务。
## Spring Web模块
Web层由Spring-web、Spring-webmvc、Spring-websocket和Portlet模块组成。
- Spring-web模块提供了基本的Web开发集成功能例如多文件上传功能、使用Servlet监听器初始化一个IOC容器以及Web应用上下文。
- Spring-webmvc模块也称为Web-Servlet模块包含用于web应用程序的Spring MVC和REST Web Services实现。Spring MVC框架提供了领域模型代码和Web表单之间的清晰分离并与Spring Framework的所有其他功能集成。
- Spring-websocket模块Spring4.0以后新增的模块它提供了WebSocket和SocketJS的实现。
- Portlet模块类似于Servlet模块的功能提供了Portlet环境下的MVC实现。
## Spring [[../编程模型及方法/DAO|DAO]]模块
提供了一个[[../编程语言/Java/JDBC|JDBC]]的抽象层和异常层次结构消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析 用于简化JDBC。
## Spring ORM模块
Spring插入了若干个[[../编程模型及方法/ORM|ORM]]框架提供了ORM对象的关系工具其中包括HibernateJDO和IBatisSQL Map等所有这些都遵从Spring的通用事务和DAO异常层次结构
## Spring MVC模块
Sping [[../编程模型及方法/MVC|MVC]]框架是一个全功能的构建Web应用程序的MVC实现。
SpringMVC框架提供清晰的角色划分控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器Spring支持多种视图技术。
Spring MVC 的工作流程:
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241031164254.png)
1 客户端发送请求,请求到达 DispatcherServlet 主控制器。
2 DispatcherServlet 控制器调用 HandlerMapping 处理。
3 HandlerMapping 负责维护请求和 Controller 组件对应关系。 HandlerMapping 根据请求调用对应的 Controller 组件处理。
4 执行 Controller 组件的业务处理,需要访问数据库,可以调用 DAO 等组件。
5Controller 业务方法处理完毕后,会返回一个 ModelAndView 对象。该组件封装了模型数据和视图标识。
6Servlet 主控制器调用 ViewResolver 组件,根据 ModelAndView 信息处理。定位视图资源,生成视图响应信息。
7控制器将响应信息给用户输出。
# 原理
## IoC
Spring IoC是Inversion of Control的缩写多数书籍翻译成“控制反转”它是Spring框架的核心。
Spring IOC用于==管理Java对象之间的依赖关系====将对象的创建、组装、管理交给框架来完成==而不是由开发者手动完成。Spring提出了对象工厂的概念由Spring工厂来管理对象的生命周期。所谓对象生命周期指的是==从对象的创建一直到对象的销毁都由Spring来管理==。我们无需再自己new对象而是从Spring工厂中获取需要的对象。甚至**对象的依赖也由工厂来注入,无需手动注入依赖**。
IOC不是一种技术只是一种思想一个重要的面向对象编程的法则它能指导我们如何设计出松耦合、更优良的程序。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致**类与类之间高耦合**难于测试有了IoC容器后把创建和查找依赖对象的控制权交给了容器如下图所示
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241030173304.png)
上图引入了IOC容器使得A、B、C、D这4个对象没有了耦合关系齿轮之间的传动全部依靠“第三方”了全部对象的控制权全部上缴给“第三方”IOC容器。
所以IOC借助于“第三方”实现具有依赖关系的对象之间的解耦使程序更优良。
Spring IOC的实现原理如下图所示
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241030175510.png)
IOC容器和对象的创建过程如下
- 定义Bean在配置文件或者类上使用注解定义Bean例如@Component、@Service等。
- 实例化Bean当应用程序需要使用Bean时Spring容器会检查是否已经实例化该Bean如果没有则根据配置信息实例化该Bean。
- 组装BeanSpring容器会检查该Bean是否有依赖关系如果有则将依赖的其他Bean注入到该Bean中。
- 提供BeanSpring容器将实例化的Bean提供给应用程序使用。
## Spring依赖注入原理
[[../编程模型及方法/依赖注入|依赖注入]]Dependency InjectionDI是Spring框架的一个核心特性它通过配置或者注解的方式将一个对象依赖的其他对象注入进来。
如下图所示:
![image.png|500](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241030175939.png)
通过上图可以看出依赖注入是实现控制反转Inversion of ControlIoC的一种具体实现方式。
在Spring中实现依赖注入通常有三种方式
1. 构造函数注入Constructor Injection通过==对象的构造函数==来注入依赖对象。
2. 属性注入Property Injection通过==对象的Setter方法==来注入依赖对象。
3. 接口注入Interface Injection通过对象实现的接口来注入依赖对象。
## Spring AOP原理
Spring AOP Aspect Orient Programming,直译过来就是 ==面向切面编程==AOP 是一种编程思想,是面向对象编程的一种补充。
面向切面编程,实现==在不修改源代码的情况下给程序动态统一添加额外功能的一种技术==,如下图所示:
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241030181027.png)
Spring AOP 实现 AOP 采用的是[[./动态代理|动态代理]]的方式,**通过代理对象实现对目标对象的方法进行拦截,从而达到切面的效果**。
在 Spring AOP 中,代理对象主要有两种类型:
JDK 动态代理:基于接口的代理实现,通过实现 JDK 的 InvocationHandler 接口来定义拦截器,并使用 Proxy 类生成代理对象。
CGLIB动态代理基于类的代理实现通过继承目标对象来实现代理不需要目标对象实现任何接口。
Spring AOP的应用场景例如日志记录、性能监控、事务管理、权限验证等。
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241031162631.png)
## spring事务原理
Spring事务管理有两种方式**编程式事务管理**、**声明式事务管理**。
![image.png](https://raw.githubusercontent.com/wangzipai/my_ob_pic/main/20241031162720.png)
在 Spring 中,**声明式事务是通过 AOP 技术实现的**,当 Spring 容器加载时,它会为每个带有 @Transactional 注解的方法创建一个动态代理对象。
如下所示:
```java
@Transaction
public void insert(String userName){
this.jdbcTemplate.update("insert into t_user (name) values (?)", userName);
}
```
Spring事务的本质其实就是Spring AOP和数据库事务Spring 将数据库的事务操作提取为==切面==通过AOP在方法执行前后增加数据库事务操作。