过滤器与拦截器的区别
接口规范不同:过滤器需要实现 Filter 接口,而拦截器需要实现 HandlerInterceptor 接口。
拦截范围不同:过滤器 Filter 会拦截所有的资源,而 Interceptor 只会拦截 Spring 环境中的资源。
@RestControllerAdvice 注解的作用
表明是一个全局异常处理器
@ExceptionHandler 注解的作用
指定可以捕获哪种类型的异常进行处理
Spring 事务管理 - @Transactional 注解
注解: @Transactional
位置: 业务层的方法上, 类上, 接口上
作用: 将当前方法交给 spring 进行事务管理,方法执行前,开启事务; 成功执行完毕,提交事务; 出现异常,回滚事务
结论:在 Spring 的事务管理中,默认只有运行时异常 RuntimeException 才会回滚。
如果还需要回滚指定类型的异常,可以通过 rollbackFor
属性来指定。
事务属性 - 传播行为
@Transactional
[默认值] 需要事务,有则加入,无则创建新事物
@Transactional(propagation = Propagation.REQUIRES_NEW)
需要新事务,无论有无,总是创建新事务
AOP 概述
AOP: Aspect Oriented Programming(面向切面编程, 面向方面编程), 就是面向特定方法编程
AOP 实现
动态代理是面向切面编程最主流的实现. 而 SpringAOP 是 Spring 框架的高级技术,旨在管理 bean 对象的过程中, 主要通过底层的动态代理机制, 对特定的方法进行编程
AOP 的优势
- 代码无侵入
- 减少重复代码
- 提高开发效率
- 维护方便
AOP 的作用
在程序运行期间在不修改源代码的基础上对已有方法进行增强(无侵入性: 解耦)
面向切面编程
面向指定的一个或多个方法进行编程, 称之为面向切面编程
@Aspect 注解的作用
当前类是一个切面类
AOP 的应用场景
- 记录系统的操作日志
- 权限控制
- 事务管理
AOP 核心概念
- 连接点: JoinPoint, 可以被 AOP 控制的方法
- 通知: Advice, 指哪些重复的逻辑, 也就是共性功能
- 切入点: PointCut, 匹配连接点的条件, 通知仅会切入点方法执行时被应用
- 切面: Aspect, 描述通知与切入点的对应关系(通知 + 切入点)
- 目标对象: Target, 通知所应用的对象
AOP 通知类型
@Around
: 环绕通知, 此注解标注的通知方法在目标方法前, 后都被执行
@Before
: 前置通知, 此注解标注的通知方法在目标方法前被执行
@After
: 后置通知, 此注解标注的通知方法后被执行, 无论是否有异常都会执行
@AfterReturning
: 返回后通知, 此注解标注的通知方法在目标方法后被执行, 有异常不会执行
@AfterThrowing
: 异常后通知, 此注解标注的通知方法发生异常后执行
如果程序没有发生异常的情况下, @AfterThrowing
标识的通知方法不会执行
程序发生异常的情况
@AfterReturning
标识的通知方法不会执行, @AfterThrowing
标识的通知方法执行了
@Around
环绕通知中原始方法调用时有异常, 通知中的环绕后的代码逻辑也不会执行了(因为原始方法调用已经出异常了)
使用通知时的注意事项
@Around
环绕通知需要自己调用 ProceedingJoinPoint.proceed()
来让原始方法执行, 其他通知不需要考虑目标方法执行
@Around
环绕通知方法的返回值必须指定为 Object 来接受原始方法的返回值, 否则原始方法执行完毕是获取不到返回值的
@PointCut 注解的作用
将公共的切入点表达式抽取出来, 需要用到时引用该切入点表达式即可.
当切入点方法使用 private
修饰时, 仅能在当前切面类中引用该表达式, 当外部其他切面类中也要引用当前类中的切入点表达式, 就需要把 private
改为 public
, 而在引用的时候, 具体的语法为: 全类名.方法名()
通知的执行顺序
- 目标方法前的通知方法: 字母排名靠前的先执行
- 目标方法后的通知方法: 字母排名靠前的后执行
控制通知的执行顺序的两种方法
修改切面类的类名(繁琐, 不便管理)
使用 Spring 提供的 @Order
注解
@Order 注解的作用
控制通知的执行顺序
切入点表达式
描述切入点方法的一种表达式
作用: 主要用来决定项目中的哪些方法需要加入通知
常见形式: execution()
: 根据方法的签名来匹配
@annotation()
: 根据注解匹配
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于