# 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 等组件支持快速开发和微服务架构。 体系结构: ![image-20250718110251514](assets/image-20250718110251514.png) ## 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 常用 的 ![image-20250718153801466](assets/image-20250718153801466.png) ## Spring Bean ### bean的定义 ![image-20250718171604613](assets/image-20250718171604613.png) * 基于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 控制层 ![image-20250721113345424](assets/image-20250721113345424.png) 面试题: ### @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