Spring
Spring的核心特性
控制反转(IOC)
概念:核心是把对象的创建和依赖管理交给 Spring 容器,而非手动 new,解决代码耦合问题
实现方式:通过 依赖注入(DI),将对象的依赖关系注入到容器中。
例:构造函数注入,setter注入,属性注入
面向切面编程(AOP)
AOP 就是面向切面编程,将横切关注点(日志、权限、事务、限流等通用功能)从业务逻辑中分离;通过切面(Aspect)统一处理。
AOP使用:
定义切点(比如用 execution 表达式匹配要增强的方法),再根据需求写不同的通知:比如 @Before 前置通知记录方法入参,@Around 环绕通知统计方法耗时,@AfterThrowing 异常通知记录错误日志;
@Around 最强的通知,能控制目标方法是否执行(前置+后置+异常都能处理)
Spring面向切面不生效场景
同类内部调用会让注解失效,要通过代理对象调用;
切点别写太宽,避免性能损耗;
异常自己捕获会导致事务不回滚,要按需配置rollbackFor;
不要在切面里写耗时逻辑,优先异步处理;
私有 / 静态方法无法被 AOP 拦截,注解要加在 public 方法上
Bean 的作用域
Singleton(默认):全局唯一实例。
Prototype:每次请求创建新实例。
Request/Session:Web 应用中,每个请求或会话生成独立实例。
Bean的生命周期
实例化 → 属性填充->前置处理 → 初始化 ->后置处理→ 使用 → 销毁
先实例化,调用构造方法创建对象;
然后填充属性,依赖注入;
再执行各种 Aware 接口,让 Bean 拿到容器信息;
然后执行 前置处理器;
再执行初始化方法,@PostConstruct、afterPropertiesSet、init-method;
再执行后置处理器,AOP 代理在这里生成;
之后就是使用bean的属性或方法;
容器关闭时执行销毁方法。
Spring中的@Autowired和@Resource
在 Spring 框架中,@Autowired 和 @Resource 都是用于依赖注入的注解
@Resource
Java EE 规范注解,默认按名称(ByName),若名称未匹配则回退到按类型
@Autowired
Spring 框架注解,默认按类型(ByType),可结合 @Qualifier 指定名称
Spring AOP动态代理:JDK动态代理vsCGLIB动态代理
jdk动态代理:
只能代理实现了接口的类
利用java反射机制生成代理对象
CGLIB代理:
可以代理没有接口的实现类
通过继承目标类 生成子类做为代理
SPring选择使用:目标类有接口用默认用jdk代理,没有接口用CGLIB代理
Spring如何管理,使用事务
Spring管理事务主要分两种方式:
一种是声明式事务,不用写代码,加注解就行;
一种是 编程式事务,手动写代码控制,很少用
声明式事务:
在Service方法上加@Transactional注解,就能自动管理事务——方法执行成功提交,抛运行时异常就回滚;
还能通过注解参数指定隔离级别、传播行为
Spring事务传播机制(传播行为)
常用的传播行为:
required如果当前存在事务,则加入该事务;如果当前没有事务,则新建一个事务
supports 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行
REQUIRES_NEW 是不管有没有,都新建一个独立事务,把旧事务挂起。
Spring事务失效场景
Spring事务是否基于面向切面实现
方法不是 public;
同类内部方法调用,没走代理;
异常被 catch 住没抛出去;
用了不支持事务的传播机制;
类没被 Spring 管理;
数据库引擎不支持事务。
SpringMVC
SpringMVC 是基于 MVC 设计模式 的 Web 框架,其核心组件包括 DispatcherServlet、处理器映射、处理器适配器、Controller、视图解析器 等
MVC 设计模式
MVC 是一种通过 职责分离 提升代码质量的设计模式,其核心思想是:
Model:管理数据和业务逻辑。
View:负责界面展示。
Controller:协调 Model 和 View 的交互
SpringMVC的执行流程
用户请求 → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ModelAndView → → View渲染 → 响应返回
用户发请求到的 DispatcherServlet(前端控制器);
DispatcherServlet 根据 URL 匹配将请求映射到到对应的 Controller 方法;
去调用这个 Controller,执行业务逻辑(比如查数据库);
Controller 执行完返回 ModelAndView给 DispatcherServlet;
DispatcherServlet 把 ModelAndView 传给 ViewResolver(视图解析器),解析后渲染页面 / 组装 JSON 数据;
最后 DispatcherServlet 把渲染好的结果响应给用户。
Spring Boot
SpringBoot常用注解
@SpringBootApplication 启动类入口,组合了自动配置、组件扫描等功能。
@Configuration 定义配置类,替代 XML 配置。
@Bean 手动注册 Bean 到 Spring 容器。
@RestController 构建 RESTful API 控制器。
@EnableAutoConfiguration 自动根据依赖配置 Spring Bean(隐式启用)。
@EnableScheduling 启用定时任务调度。
@EnableCaching 启用缓存功能。
SpringBoot 如何实现热部署?
常用两种方式:
① 引入 spring-boot-devtools 依赖,修改代码后自动重启(轻量,重启快);
② 用 Spring Loaded 插件,支持类加载级别的热更新,不用重启应用。
SpringBoot 启动流程
① 执行 main 方法,调用 SpringApplication.run ();
② 初始化 SpringApplication,加载初始化容器、监听器;
③ 启动上下文(ApplicationContext),刷新容器;
④ 执行自动配置,扫描并注册 Bean;
⑤ 启动内嵌容器(如 Tomcat);
⑥ 执行 Runner 接口(ApplicationRunner/CommandLineRunner),完成启动。
SpringBoot 如何自定义 Starter?
三步:
① 写核心功能的自动配置类(加 @Configuration、@Conditional);
② 在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 里注册这个配置类;
③ 打包成 starter 依赖,别人引入就能用。
SpringBoot 如何优化性能?
① 关闭不用的自动配置;
② 配置 JVM 参数(调整堆内存、垃圾收集器);
③ 开启 Gzip 压缩,减少网络传输;
④ 用连接池(如 HikariCP,默认)优化数据库连接;
⑤ 接口加缓存(Redis),减少数据库查询;
⑥ 异步处理(@Async)耗时操作。
SpringBoot自动配置原理
启动类的 @EnableAutoConfiguration 开启自动配置。
会去读 META-INF 下的配置文件,加载所有自动配置类。
再通过 @Conditional 系列注解判断是否满足条件,满足就创建 Bean。
做到约定大于配置,减少手写配置。
SpringBoot 怎么在启动时把数据加载到 Redis?
有三种常用方式:
@PostConstruct,Bean 初始化完就执行;
ApplicationRunner,项目完全启动成功后执行,最推荐;
ContextRefreshedEvent 事件监听,容器启动完执行。
实际开发中我一般用 ApplicationRunner,因为最安全,能保证所有依赖都加载完成。