首页 > 其他分享 >Springboot提高

Springboot提高

时间:2023-04-23 16:25:15浏览次数:36  
标签: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(全路径)")

标签:Springboot,通知,提高,切点,方法,任意,返回值,异常
From: https://www.cnblogs.com/zlsame/p/17331133.html

相关文章

  • Java__SpringBoot与Vue连接
    SpringBoot与Vue注解RequestMapping("/dir/")创建一个方便前端调用的接口目录/接口函数,前端可以获取到函数返回的数据@RestController@RequestMapping("/dir/")publicclassBotInfoController{@RequestMapping("getinfo/")publicMap<String,String>GetI......
  • SpringBoot 集成 Quartz + MySQL
    Quartz简单使用JavaSpringBoot中,动态执行bean对象中的方法源代码地址=>https://gitee.com/VipSoft/VipBoot/tree/develop/vipsoft-quartz工作原理解读只要配置好DataSourceQuartz会自动进行表的数据操作,添加QuartzJob任务保存QRTZ_JOB_DETAILS、QRTZ_TRIGGERS=>QR......
  • Java SpringBoot 7z 压缩、解压
    JavaSpringBoot7z压缩、解压JavaSpringBoot7z压缩、解压cmd7z文件压缩7z压缩测试添加依赖<dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.12</versi......
  • SpringBoot中底层对 /health 的请求是怎么处理的?
     在SpringBoot应用程序中,/health端点是通过HealthEndpointbean来处理的。当您访问/health端点时,SpringBoot会调用HealthEndpointbean的health()方法来检查应用程序的健康状态,并返回相应的响应。HealthEndpointbean是通过HealthEndpointAutoConfiguration自......
  • 五、自制代码生成器提高开发效率
    主要内容以乘车人增删改查为模板,自制单表管理,前后端生成器。学习代码生成器原理,学习freemarker。写自己的生成器,可用于导出复制excel,页面静态化等。代码生成器的底层原理生成器原理:使用freemarker,利用模板,生成java、vue等项目文件。freemarker是老牌模板引擎,以前常用于页......
  • 记录一次艰难的云服务器部署前后端项目springBoot+mybatis和vue(两天解决的前后端跨域
    前言大家好我是歌谣今天继续给大家带来后端java的学习最近刚学习完java的一个增删改查紧接着就是部署项目了代码准备工作前端:vue后端:springboot+mybatis数据库mysql部署后端项目打包找到maven-package-runmavenbuild云服务器上面建立文件mkdir/www/springBoot创建文件......
  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口
    场景Forest声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,是封装调用第三方restfulapiclient接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口。官网:Forest 代码地址:forest:声明式HTTP客户......
  • 使用Maven-shade-plugin打包SpringBoot项目
    使用Maven-shade-plugin打包SpringBoot项目另附参考文章:https://blog.csdn.net/u011441473/article/details/127844885好奇葩的打包之旅,最后在stackoverflow上找到了解决办法,遇到问题,还是多去google吧,国内真不行,百度质量太低,一件很小的事,花了我1个多小时。。下面说一下我遇到......
  • Springboot 多实例负载均衡部署
    Springboot多实例负载均衡部署一、测试代码:控制层测试代码:importjava.net.Inet4Address;importjava.net.InetAddress;importjava.net.UnknownHostException;@Controller@RequestMapping("/test")publicclassTestController{@GetMapping("")@Resp......
  • SpringBoot+Mybatis这个bug估计连作为神仙的您也无法解决--》Invalid bound statement
    最近开发一个调查单的应用系统,加班加点为了解决几个bug,但是最近两天卡在一个bug上。作为一头牛,不能轻易放弃,向困难挑战是牛的精神。1、Invalidbound问题展示首先,我针对题型QuestionType功能,写了五个子功能:增加题型,删除题型,修改题型,查询单条题型,模糊查询多条记录;还写了问题、调查......