# Spring

## Spring IoC

### 什么是 Spring IOC 容器？

通过由代理人创建和管理对象，消费者通过代理人来获取对象。具体来说，是将对象加入到IoC容器中，由IoC容器将对象进行统一管理，而不是在程序中一个个 new 对象。如果需要修改某一个类，就直接修改一次就可以了。用的时候直接去容器里面取。修改和使用互不影响，其目的是降低对象直接的直接耦合。

&#x20;

### 什么是依赖(Dependency Injection)注入？

依赖注入是指运行时将Spring IoC容器内的对象利用反射赋值给其他对象的操作。也就是一个对象依赖于另外一个对象。

### 依赖注入有几种方式？

三种：

* 构造方法注入
* setter 注入
* 接口注入

### Spring IoC 中的 bean  scope (作用域)有哪些?

* singleton : 单例（默认）,每个容器内有且jinyou 唯一的实例,  被全局共享
* prototype : 多例，每次使用都创建一个实例
* request : web 环境下，每一次独立请求存在唯一实例
* session : web 环境下，每一个session存在唯一实例
* application:  web环境下， ServletContext 存在唯一实例
* webscoket: 每一次 websocket 连接中存在唯一实例

### bean的生命周期

bean 的生命周期和 容器行为 可以用下图进行表示：

![](https://raw.githubusercontent.com/chesterzhang/intro_Java/zhc_dev/picture/spring_ioc/bean_life.drawio.png)

### Spring 提供了哪些配置方式

常用两种

* 基于 xml 配置，通过各种标签
* 基于注解配置，比如@GetMapping 和 @Postmapping&#x20;

### Spring 中Bean实例化有几种方式

* 使用类的构造方法，直接在bean标签下面的 constructor-arg 传入构造方法参数
* 使用静态工厂实例化，定义一个静态工厂类，里面有一个静态方法，直接 return 一个对象
* 使用工厂方法实例化，定义一个工厂类，需要实例化这个工厂，再通过工厂类的方法return一个对象

### 将一个类声明成Spring 的bean的注解有哪些？

@Component 组件注解，通用注解

@Controller 控制器类

@Service 说明当前类是Service 业务服务类

@Repository 说明当前类是 DAO 类， 对数据增删改查

## Spring AOP

### Spring AOP 有几种通知类型

5种：

1. before 前置通知, 在目标方法运行前, 先去执行 切面类 的 切面方法
2. after  后置通知,在目标方法运行后,再执行切面类的切面方法
3. after return 后置返回通知,在目标方法返回数据以后,再执行切面类的切面方法
4. after throwing 异常通知, 在目标方法抛出异常后, 再执行切面类的切面方法
5. around 环绕通知，最为强大，可自定义通知执行时机，可决定目标方法是否运行

### 说一下 JointPoint 类

Spring AOP使用过程中的核心类，可以看作是程序运行时的一个切点，通过这个切点可以获取目标方法的信息。JointPoint 拥有下面几个核心方法：

* getTarget()获取目标类
* getSignature() 获取目标方法
* getArg()获取目标方法

### 说一下 ProceedingJointPoint 类

ProceedingJointPoint 类 是 JointPoint 类的升级版，除原有功能以外，还可以控制目标方法是否被执行。

## Spring MVC

### 说一说Spring 工作原理

![](https://github.com/chesterzhang/intro_Java/blob/zhc_dev/picture/spring_mvc/spring_mvc_workflow.drawio.png?raw=true)

### Spring MVC 常用注解

* Controller, 将当前类标注成为一个控制器
* ResponseBody, 不跳转页面，直接输出响应
* RestController, 可以理解为Controller+ResponseBody, 更加适合前后端分离的架构
* RequestMapping, 可以注解在类和方法上，用于指定接收get, post, put, delete 方法址
* GeMapping, 接收 get请求
* PostMapping, 接收 post 请求
* RequestParam, 接收前端传来的参数
* PathVariable 从请求的URL中获取

### 说明一下Spring MVC 拦截器

拦截器 Interceptor 用于对 URL 进行过滤。其底层就是基于 Spring AOP 面向切面编程实现。让一个 类 实现 HandlerInterceptor 接口即可实现一个拦截器。 HandlerInterceptor 定义了三种方法:&#x20;

* preHandle, 前置拦截，只有return True 才会被送到下一步继续处理，否则直接会被拦截
* postHandle, 后置拦截, 目标资源已被Spring MVC 框架处理, return以后, 产生响应文本之前
* afterCompletion, 响应文本产生以后，比如生成json, html 以后

### Spring MVC 拦截器的使用步骤

在applicationContext 文件里面用 mvc：interceptors标签，在其下使用  mapping 标签对 URL进行拦截，bean 标签指定具体的拦截器

## Spring 通用问题

### 介绍一下 Spring 的声明式事务

声明式事务是指利用 AOP 自动提交，回滚数据库事务

声明式事务规则：进入方法之前打开事务，成功提交，运行时异常RuntimeException 则回滚。

通过在方法上添加  @Transactional 注解

### 说一说 Spring, SpringMVC, SpringBoot 的区别

Spring 是所有应用的基础，提供了 IOC 和 AOP 的特性

SpringMVC 是 Spring的子项目，用于提供Web 支持

SpringBoot 是 SpringMVC 的简化版, 提高了开发效率
