# SpringDemo202507
**Repository Path**: nieps/spring-demo202507
## Basic Information
- **Project Name**: SpringDemo202507
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-07-18
- **Last Updated**: 2025-07-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Spring笔记
## 目标
* 掌握Spring的核心 IOC和AOP
> IOC思想
>
> 实现:
>
> 1. 基于XML实现 (08年左右 ) 现在用的很少
> 2. 基于注解实现(推荐) 核心掌握注解的使用
* 掌握事务管理 声明式事务 (aop的应用场景 )
> 使用:@Transactionl 5个注解属性
* 扩展
> 事件
>
> 异步任务(多线程的应用)
>
> 定时任务----延伸XLL-JOB
## Spring介绍
Spring 是一个**开源**的**轻量级** Java 企业级应用开发框架,它以**简化企业级应用开发**为核心目标,通过提供一系列强大的功能和特性,帮助开发者构建灵活、可维护、可扩展的 Java 应用程序
> 轻量级:核心包很小
>
> 简化应用开发
>
> 整合其它框架:
>
> * ssh spring structs hibernate
> * ssi spring structs ibatis
> * ssm spring spring MVC mybatis
~~~java
//低偶合
public void info(List list){}//list是抽象的 只要实现该接口的 都可以传递
//调用的时候 ArrayList LinkedList Vector
//反过来 偶合度高 依赖具体实现
public void info(ArrayList list){} //问 能不能传 LinkedList Vector
~~~
## Spring体系结构
两种:
* 狭义说法 特指 Spring Framework,通常我们将它称为 Spring 框架。
* 广义的说法 指以 Spring Framework 为核心的 Spring 技术栈。
特征:
1. **控制反转(IoC)**:容器管理对象创建和依赖,开发者无需手动维护。
2. **面向切面编程(AOP)**:分离日志、事务等通用功能与业务逻辑,减少重复代码。
3. **轻量级**:侵入性低、资源消耗小,无需依赖重型服务器。
4. **一站式**:涵盖核心容器、数据访问、Web 开发等全流程功能。
5. **松耦合**:通过 IoC 和 AOP 降低组件依赖,便于扩展和测试。
6. **声明式事务**:用注解 / 配置管理事务,无需手动编写控制代码。
7. **高兼容性**:可与主流框架(如 MyBatis、Redis)无缝集成。
8. **强大生态**:Spring Boot、Spring Cloud 等组件支持快速开发和微服务架构。
体系结构:

## HelloWorld入门
### 引入依赖
~~~xml
org.springframework
spring-context
5.3.39
~~~
### 核心配置文件:beans.xml
~~~xml
~~~
### 测试
~~~java
/**
* 使用Spring
*/
public void testHello2(){
//1.实例化Spring工厂类
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
Hello hello= (Hello) context.getBean("hello");
hello.sayHello();
}
~~~
## IOC容器
### IOC 概念
**IOC 的定义**:IOC(Inversion of Control,控制反转)是一种设计思想,它将对象的创建、依赖关系的维护等控制权从应用程序代码转移到外部容器(如 Spring IOC 容器),实现了组件之间的解耦。
### IOC原理
核心 : 配置文件+工厂类 +反射
IoC 底层通过工厂模式、Java 的反射机制、XML 解析等技术,将代码的耦合度降低到最低限度,其主要步骤如下。
1. 加载配置文件:Spring 容器加载 XML 配置文件或扫描带有注解的类(包含对象之间的依赖关系 ),获取 Bean 的定义信息。
2. 创建 Bean 实例:IOC容器(工厂类),根据 Bean 的定义信息,通过反射机制创建 Bean 对象
3. 注入依赖:容器将 Bean 依赖的其他对象注入到当前 Bean 中。
4. 提供 Bean:容器将创建好的 Bean 提供给应用程序使用。
### IOC工厂类
两个核心类:
* BeanFactory 基础工厂类,创建和获取Bean
* ApplicationContext 常用 的

## Spring Bean
### bean的定义

* 基于XML实现
* 基于注解
### bean的作用域(面试题 )
| 作用域 | 描述 |
| ----------- | ------------------------------------------------------------ |
| singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值 |
| prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean() |
| request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
| session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 |
| application | 一般用于web应用环境,该作用域仅适用于WebApplicationContext环境 |
实现:
* XML中实现(了解)
~~~xml
~~~
* 基于注解
~~~java
@Component //将当前类注入到IOC容器 默认bean的名称是类名首字母小写
@Scope(value = "prototype")
public class Hello {}
~~~
### bean的生命周期 (面试题 )
Spring Bean 的生命周期可简化为以下核心阶段:
1. **实例化**:Spring 容器创建 Bean 对象(调用构造方法)
2. **属性注入**:为 Bean 设置配置的属性值和依赖(@Autowired 等)
3. 初始化:
- 执行初始化方法(如 @PostConstruct 标注的方法、XML 中 init-method 指定的方法)
- 若实现 InitializingBean 接口,调用 afterPropertiesSet ()
4. **使用**:Bean 处于可用状态,供应用程序调用
5. 销毁:
- 执行销毁方法(如 @PreDestroy 标注的方法、XML 中 destroy-method 指定的方法)
- 若实现 DisposableBean 接口,调用 destroy ()
核心流程:**实例化 → 注入属性 → 初始化 → 使用 → 销毁**
单例 Bean 会随容器启动创建,随容器关闭销毁;原型 Bean 由容器创建后,生命周期交由用户管理。
#### 初始化
* 基于XML
~~~xml
~~~
* 基于注解
~~~java
@PostConstruct
public void init(){
System.out.println("--------注解版Hello----初始化 ");
}
~~~
#### 销毁(实际应用不大)
- 执行销毁方法(如 @PreDestroy 标注的方法、XML 中 destroy-method 指定的方法)
- 若实现 DisposableBean 接口,调用 destroy ()
#### 延迟初始化
* 在xml 中通过lazy-init属性 设置为true 延迟初始化
* 注解时在类上使用@Lazy 实现 延迟初始化
## 依赖注入(DI)
### 概念
DI(Dependency Injection,依赖注入)是 IOC 的具体实现方式,指容器在创建对象时,自动将依赖的对象注入到当前对象中,无需对象自己创建或查找依赖。
### 注入方式
#### 构造注入(使用很少)
通过构造方法实现依赖的注入。
~~~xml
~~~
#### set注入(属性注入) 常用
给指定的属性提供set方法,通过property属性注入
~~~xml
~~~
#### 工厂方法注入(了解)
bean的属性:
* factory-bean 指定工厂类的 实例
* factory-method 指定由工厂类的哪个方法来创建实例
静态方法:
~~~xml
~~~
实例方法:
~~~xml
~~~
## 注解(重点)
MVC:
* m model 模型 业务层 XxxService
* v view 视图
* c 控制层

面试题:
### @Autowired 和@Resource两个注解什么区别?
`@Autowired` 和 `@Resource` 都是 Spring 框架中用于依赖注入的注解,但它们在来源、功能和使用方式上有一些重要区别:
1. **来源不同**
- `@Autowired` 是 Spring 框架自带的注解(`org.springframework.beans.factory.annotation.Autowired`)
- `@Resource` 是 JDK 自带的注解(`javax.annotation.Resource`),属于 Java EE 规范的一部分
2. **注入方式不同**
- `@Autowired` 默认按照**类型(byType)** 注入,当存在多个同类型的 Bean 时,需要配合 `@Qualifier` 指定 Bean 的名称
- `@Resource` 默认按照**名称(byName)** 注入,如果找不到对应名称的 Bean,会再按照类型查找
3. **支持的参数不同**
- `@Autowired` 只有一个 `required` 参数,用于指定依赖是否必须存在(默认 `true`,不存在会抛出异常)
- `@Resource` 有更多参数,如 `name`(指定 Bean 名称)、`type`(指定 Bean 类型)等
4. **使用范围不同**
- `@Autowired` 可用于构造方法、字段、setter 方法和参数上
- `@Resource` 可用于字段和 setter 方法上,不能用于构造方法和参数
## Spring Aop
面试题: 问什么情况下事务会失效 ?
> 失效原因:aop失效 ,动态代理失效
>
> 前提: 声明式事务的实现,利用的是aop ,aop的原理是动态代理
>
> 分两种情况 :
>
> 1. 实现事务管理的类 有接口 实现 它会走jdk动态代理
>
> 2. 事务管理在没有接口实现的类里,出现以下情况会失效 (走的是cglib代理)
>
> > 1. 目标类是final类型的
> > 2. 增加事务管理的方法是final或static 类型的
## Spring 事务
spring中事务的属性有哪些?
@Transactional 5个属性:
* **隔离级别** 5个 相比于数据库多了个默认的,默认采用数据库本身的隔离级别
* 传播行为 嵌套事务时如何处理事务
* **是否只读** 查看的时候 设置为只读 可以提高效率
* 事务超时 单们是秒, 默认值为-1 永不超时
* 回滚规则
> 1. 指定哪些异常回滚 rollbackFor={}
> 2. 指定哪些异常不回滚 noRollbackFor={}
spring中事务实现方式:
* 编程式事务
* 声明式事务
## 扩展
### Spring 事件
### Spring 异步任务
多线程:
应用场景:耗时操作 使用异步任务 另开线程执行任务
1. 发送短信
2. 发送email
3. 导入excel
### Spring定时任务
> 扩展: xxl-job 分布式定时任务
订单30分钟未支付 取消。
客户系统: 记录客户的生日。 需求生日当天,给客户发送祝福短信。
crop表达式:
* */10 * * * * * 每10s
* 0 */1 * * * *
作业:
* 定时备份数据库
* 自己尝试整合mybatis
扩展作业: 可以看一下阿里云短信文档 ,创建一个客户表,包含客户的名称、电话、生日,要求做一个定时任务,每天早晨8点给当天生日的客户发送祝福短信。
## Easy Excel 官网
> poi