全局异常处理器
未做处理的情况:
当我没没有做任何异常处理时,
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))")
切入点表达式的语法规则:
-
方法的访问修饰符可以省略
-
返回值可以使用
*
号代替(任意返回值类型) -
包名可以使用
*
号代替,代表任意包(一层包使用一个*
) -
使用
..
配置包名,标识此包以及此包下的所有子包 -
类名可以使用
*
号代替,标识任意类 -
方法名可以使用
*
号代替,表示任意方法 -
可以使用
*
配置参数,一个任意类型的参数 -
可以使用
..
配置参数,任意个任意类型的参数
@annotation
通过使用自定义注解的方式给Sevice层的目标对象做上标记,再在切面类中的通知中声明自定义注解Around("@annotation(全路径)")
标签:Springboot,通知,提高,切点,方法,任意,返回值,异常 From: https://www.cnblogs.com/zlsame/p/17331133.html