Springboot提高

全局异常处理器

未做处理的情况:

当我没没有做任何异常处理时,

mapper接口操作数据库出错时,会将异常向上抛给Service

Service中的异常会往上抛给controller

controller会将异常抛给框架响应给浏览器一个JSON格式的数据

这个数据并不符合我们统一响应结果的规范

如何处理?

方案一:对controller中的所有方法做try...catch处理

缺点:代码臃肿

方案二:全局异常处理器

如何定义全局异常处理器?

定义一个一个类,在类上加上@RestcontrollerAdivce,这样就定义了一个全局异常处理器

我们还需要一个方法来捕获异常,这个方法要加上@ExceptionHandler,通过该注解中的value属性来指定我们需要捕获什么异常

事务管理

@Transactional注解

用来在Service层开启事务管理

在方法上:将当前方法交给Spring事务管理

在类上:将当前类所有方法交给Spring进行事务管理

在接口上将接口所有实现类当中的所有方法都交给spring进行事务管理

@Transactional的rollbackFor属性

通过@Transactional注解开启的事务管理,默认只有发生运行时异常,才会回滚

可以通过其的rollbackFor属性来指明需要回滚的异常类型

@Transactional的propagation属性

事务的传播行为:

就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制

 

AOP

什么是AOP?

AOP就是面向切面编程思想

AOP的作用?

利用动态代理技术,在不改变原有代码的基础上实现功能的增强和改变

AOP核心概念

目标对象:要被增强的对象被称为目标对象

代理对象:被增强后的对象被称为代理对象

连接点:目标对象中的所有方法被称为连接点

通知:要被增强的代码,共性功能

切点:目标对象中被增强的方法被称为切点

切点一定是连接点,连接点不一定是切点

切面:通知加切点

通知类型和顺序

@Before 前置通知,在原代码执行前执行

@AfterReturing 返回后通知,在原代码之后且没有异常时执行

@AfterThring 异常通知,在原代码之后发生异常时执行

@After 最终通知,在原代码之后执行无论有没有异常都执行

@Around 环绕通知,在原方法之前后都可以执行

使用流程

创建一个AOP类用@Aspect来声明定义了一个切面类

书写方法返回值必须是object,用来接收切点放回值

 

@Around通知必须是ProceedingJoinPoint

其他类型通知是JoinPoint通知
*:表示任意返回值类型,任何一个包名,类名,方法名,任意一个参数类型
..:表示任意多个参数类型的参数
@Around("excution()"):写在方法上,表示该方法是一个通知(要增强的代码):切点表达式,找出要增强的方法(切点)
使用proceed()调用原始方法,返回值表示切点的返回值
通知类型和通知顺序

在不同切面类中,默认按照切面类的类名字母排序:

  • 目标方法前的通知方法:字母排名靠前的先执行

  • 目标方法后的通知方法:字母排名靠前的后执行

可以利用@order注解来控制通知的执行顺序

在原方法执行前属性值越小的先执行

在原方法之后属性值越大的先执行

切点表达式

excution()

execution(……):根据方法的签名来匹配

execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配


eg.

@Before("execution(void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")

切入点表达式的语法规则:

  1. 方法的访问修饰符可以省略

  2. 返回值可以使用*号代替(任意返回值类型)

  3. 包名可以使用*号代替,代表任意包(一层包使用一个*

  4. 使用..配置包名,标识此包以及此包下的所有子包

  5. 类名可以使用*号代替,标识任意类

  6. 方法名可以使用*号代替,表示任意方法

  7. 可以使用 * 配置参数,一个任意类型的参数

  8. 可以使用.. 配置参数,任意个任意类型的参数

@annotation

通过使用自定义注解的方式给Sevice层的目标对象做上标记,再在切面类中的通知中声明自定义注解Around("@annotation(全路径)")

posted on   zl子路  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示