面向切面编程

1. 增删改查  三层干啥
2. 文件上传  第三方api(接口) 调用准备 -- 官方代码  -- 工具类
3. 登录鉴权  登录(查询 密码) 鉴权(拦截器)登录完成后--后台生成token返回给浏览器--每次浏览器发请求时候携带token--服务器需要使用拦截器拦截请求,获取token--校验token生成   token校验
4. Springboot自动装配

面向切面编程

AOP( 面向切面编程 )是一种思想,它的目的就是在不修改源代码的基础上,对原有功能进行增强。

在你给大部分方法需要添加一部分统一功能的时候

入门案例

使用Aop完成在业务层类中的方法上打印日志

导入初始工程

创建日志类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单元测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通知类型

四大通知

四大通知描述的就是增强方法在切点方法的什么位置上执行

  • 前置通知(before):增强方法在切点运行之前执行
  • 返回后通知(after-returning):增强方法在某切点正常完成后执行的通知,不包括抛出异常的情况
  • 异常后通知(after-throwing):增强方法在某切点抛出异常退出时执行的通知
  • 后置通知(after):增强方法在某切点退出的时候执行的通知(不论是正常返回还是异常退出)
try{前置通知(before)//切点执行位置返回后通知(after-returning)
}catch(Execption e){异常后通知(after-throwing)
}finally{后置通知(after)
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

环绕通知

它是一种特殊的通知,他允许以编码的形式实现四大通知

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

切点表达式

切点表达式用于挑选切点

execution

execution() :指定一组规则来匹配某些类中的方法,匹配中的就是切点

*  代表一个或多个位置
.. 代表0个或多个位置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@annotation

@annotation:指定一个注解,凡是标有此注解的方法都是切点

① 自定义注解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

② 在需要作为切点的方法上添加注解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

③ 设置切点挑选

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

日志记录

本小节我们要实现的功能是,要记录controller中增 删 该方法的运行日志保存到日志表中

日志信息包含:操作人、操作时间、执行方法的全类名、执行方法名、方法作用、方法运行时参数、返回值、方法执行时长

准备工作

创建数据表

-- 操作日志表
create table operate_log(id bigint unsigned primary key auto_increment comment 'ID',class_name varchar(100) comment '操作的类名',method_name varchar(100) comment '操作的方法名',method_desc varchar(100) comment '方法用途',method_params varchar(1000) comment '方法参数',return_value varchar(2000) comment '返回值',operate_user int unsigned comment '操作人ID',operate_time datetime comment '操作时间',cost_time bigint comment '方法执行耗时, 单位:ms'
) comment '操作日志表';

创建日志类

package com.itheima.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperateLog {private Integer id; //IDprivate String className; //操作类名private String methodName; //操作方法名private String methodDesc; //方法用途private String methodParams; //操作方法参数private String returnValue; //操作方法返回值private Integer operateUser; //操作人IDprivate LocalDateTime operateTime; //操作时间private Long costTime; //操作耗时
}

创建日志的Mapper

package com.itheima.mapper;import com.itheima.pojo.OperateLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface OperateLogMapper {//插入日志数据@Insert("insert into operate_log (operate_user, operate_time, class_name, method_name,method_desc, method_params, return_value, cost_time) " +"values (#{operateUser}, #{operateTime}, #{className}, #{methodName},#{methodDesc}, #{methodParams}, #{returnValue}, #{costTime});")public void insert(OperateLog log);
}

制作切面

自定义注解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

package com.itheima.anno;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;//自定义注解
@Retention(RetentionPolicy.RUNTIME)//此注解保留到运行阶段
@Target(ElementType.METHOD)//此注解标注在方法上
public @interface LogAnno {String methodDesc() default "";//用于声明方法的作用
} 

标识切点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建切面

package com.itheima.aspect;import com.itheima.anno.LogAnno;
import com.itheima.mapper.OperateLogMapper;
import com.itheima.pojo.OperateLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Date;@Component
@Aspect//切面
public class LogAspect {@Autowiredprivate OperateLogMapper operateLogMapper;//自定义注解@Pointcut("@annotation(com.itheima.anno.LogAnno)")public void pt() {}//环绕通知@Around("pt()")public Object logAround(ProceedingJoinPoint pjp) {OperateLog operateLog = new OperateLog();//操作时间operateLog.setOperateTime(LocalDateTime.now());//全类名operateLog.setClassName(pjp.getTarget().getClass().getName());//请求参数operateLog.setMethodParams(Arrays.toString(pjp.getArgs()));MethodSignature ms = (MethodSignature) pjp.getSignature();Method method = ms.getMethod();//方法名operateLog.setMethodName(method.getName());//方法作用(从LogAnno注解属性中获取)operateLog.setMethodDesc(method.getAnnotation(LogAnno.class).methodDesc());//todo 操作人idObject obj = null;long start = new Date().getTime();try {obj = pjp.proceed();//方法的执行结果operateLog.setReturnValue(obj.toString());return obj;} catch (Throwable e) {throw new RuntimeException(e);} finally {long end = new Date().getTime();//方法执行时长operateLog.setCostTime(end - start);//保存日志operateLogMapper.insert(operateLog);}}
}

ThreadLocal

ThreadLocal称为线程局部变量,可以为每个线程单独提供一份存储空间

* 特点:线程之内,数据共享;线程之间,数据隔离
* 方法:public void set(T value)    设置当前线程的线程局部变量的值public T get() 		 	   返回当前线程所对应的线程局部变量的值public void remove()        移除当前线程的线程局部变量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加工具类

ThreadLocal操作工具类,可以完成对其添加、获取、清理工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改拦截器

修改拦截器代码,添加ThreadLocal相关代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改切面

修改切面代码,从ThreadLocal中获取用户id

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

声明式事务

事务回顾

事务是一组操作的集合,它是一个不可分割的工作单位,这些操作 要么同时成功,要么同时失败。

开启事务(一组操作开始前,开启事务):start transaction / begin ;提交事务(这组操作全部成功后,提交事务):commit ;回滚事务(中间任何一个操作出现异常,回滚事务):rollback ;
try{begin;//告诉mysql后面的这些sql语句的提交 你就别管了,我自己来管理//业务操作 增  删  改//sql//sql//....commit;//自己提交}catch(ex){rollback;//自己回滚
}

事务管理

注解:@Transactional

位置:业务(service)层的方法上、类上、接口上

作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

事务属性

rollbackFor

默认情况下,只有出现 RuntimeException 才回滚异常,rollbackFor属性用于控制让非运行时异常也回滚。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

propagation

propagation称为事务传播行为,表示当一个事务方法被另一个事务方法调用时,应该如何进行事务控制

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Spring支持通过配置的形式来实现7种事务传播行为,我们需要掌握其中的前两种

属性值含义
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须没事务,否则抛异常
NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务, 则开启一个新的事务。
内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。
而内层事务操作失败并不会引起外层事务的回滚。

事务,有则加入,无则在无事务状态中运行 |
| NOT_SUPPORTED | 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务 |
| MANDATORY | 必须有事务,否则抛异常 |
| NEVER | 必须没事务,否则抛异常 |
| NESTED | 如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务, 则开启一个新的事务。
内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。
而内层事务操作失败并不会引起外层事务的回滚。 |

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借老系统重构机会我写了个groovy规则引擎

公司老系统的重构计划早就有了,为了对Java硬编码的各种校验规则进行重构,特地参考了相关技术,最终选择了groovy进行了系统的学习,并编写了一个即插即用的轻量级规则引擎。 文章目录 项目背景技术选型groovy的性能groovy脚本执行线…

【拉取Git项目到本地,知识小记,后续再改】

前提:Git已经安装好 https://blog.csdn.net/mukes/article/details/115693833 安装至步骤2.2.4即可 第一步创建本地项目目录 第二步获取他人提供的项目git地址或者自己在网上找的他人项目的git地址 Git 全局设置: git init git config --global user.name “ASxx”…

1998-2023年上市公司金融/信贷/资本资源错配程度数据(含原始数据+计算代码+结果)

1998-2023年上市公司金融/信贷/资本资源错配程度数据(含原始数据计算代码结果) 1、时间:1998-2023年 2、来源:上市公司年报 3、指标:证券代码、year、应付账款、负债合计、利息支出、行业代码、是否ST或PT、上市日期…

Webpack详解与配置环境

webpack:webpack网址 1、工作原理: Webpack是一个非常强大的静态模块的打包工具。从文件入口开始,递归解析以来关系,然后将所有模块打包成一个或多个budle文件。 2、webpack核心概念: Entry:入口起点(en…

Linux——redis理论、安全模型

一、redis 主要的data type redis 的原生客户端redis 支持通过python php golang 等语言连接redis 主要适用场景 二、redis如何进行数据存储 非关系数据库 不使用二维表 redis 使用键值对完成数据的存储redis一共有16个库 ,不同的库使用编号 0-15redis 在…

设计模式-装饰器代理观察者

3.7 装饰器模式(代码见vs) 装饰器又叫做包装模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法完整性的前提下,提供了额…

前端报文加密

前端加密功能 前端提供简单的AES对称加密算法,注意key 和后端网关配置相同,这里打包混淆后,相对安全。 (lun-ui\src\store\modules\user.js、base-gateway-dev.yml) 后端解密功能 使用hutool提供的工具类进行解密pub…

Linux之grafana+onealert报警

grafana介绍 Grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警。 grafana安装与登录 在grafana服务器上安装grafana 下载地址:https://grafana.com/grafana/downloa…

Opencv中的直方图(4)局部直方图均衡技术函数createCLAHE()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个指向 cv::CLAHE 类的智能指针并初始化它。 函数原型 Ptr<CLAHE> cv::createCLAHE (double clipLimit 40.0,Size tileGridSize…

12、Django Admin在列表视图页面上显示计算字段

两种方法&#xff1a; 注册模型有两种方式&#xff0c;需要首先添加或者修改admin中的注册模型如下方式 admin.register(Origin) class OriginAdmin(admin.ModelAdmin):list_display ("name",) 1、在models的模型类中添加函数 def hero_count(self,):return sel…

评价决策类——层次分析法+数学建模+实战分析

目录 一、前言 二、历年题型分析 2.1 常用算法归纳 2.1.1 优化类算法 2.1.2 预测类算法 2.1.3 评价决策类 2.1.4 NP-hard类 2.2 评价类模型求解 2.2.1 层次分析法&#xff08;AHP&#xff09; 2.2.2 多指标评价法&#xff08;MCDA&#xff09; 2.2.3 算法区别 三、层…

如何把自动获取的ip地址固定

在大多数网络环境中&#xff0c;‌设备通常会自动从DHCP服务器获取IP地址。‌这种动态分配IP的方式虽然灵活方便&#xff0c;‌但在某些特定场景下&#xff0c;‌我们可能需要将设备的IP地址固定下来&#xff0c;‌以确保网络连接的稳定性和可访问性。‌本文将详细介绍如何把自…

MySQL-基础篇-事务(事务简介、事务操作、事务的四大特性、并发事务引发的问题、事务的隔离级别)

文章目录 1. 事务简介2. 事务操作2.1 未控制事务2.2 控制事务2.2.1 查看事务的提交方式2.2.2 设置事务的提交方式2.2.3 提交事务2.2.4 回滚事务2.2.5 开启事务2.2.6 完善转账案例 3. 事务的四大特性&#xff08;ACID&#xff09;4. 并发事务引发的问题5. 事务隔离级别5.1 演示5…

羊大师:白露养生经,羊奶不可少

随着秋风渐起&#xff0c;白露悄然而至&#xff0c;自然界中的万物开始展现出成熟与收获的喜悦。在这个季节转换的微妙时刻&#xff0c;我们的身体也需要顺应天时&#xff0c;进行一番细致的调养。白露养生&#xff0c;不仅是对自然的敬畏&#xff0c;更是对健康生活的追求。 在…

橘子学ES实战操作之管道类型Ingest pipelines的基本使用

简介 我们在使用ES的时候&#xff0c;经常的用法就是把其他数据源比如Mysql的数据灌到ES中。 借用ES的一些功能来提供数据的全文检索以及聚合分析之类的功能。 在这个灌数据的过程中&#xff0c;我们经常会对数据做一些治理&#xff0c;类似ETL的能力。然后把治理后的数据写入…

Eclipse 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 打开字体设置页面3. 找到Text Font&#xff0c;点击修改4. 修改字体 前言 Eclipse 自定义字体大小&#xff0c;统一设置为 Courier New &#xff0c;大小为 三号 具体操作 【Windows】>【Perfer…

Mac M1 安装Hadoop教程(安装包安装)

一、引言 前面一期&#xff0c;我分享了通过homebrew方式安装Hadoop&#xff0c;本期我将通过安装包方式介绍下hadoop如何安装。二、下载open jdk8 官方下载地址 注意如果是x86架构的苹果电脑&#xff0c;Architecture选择x86 64-bit或者 x86-32bit。 下载后&#xff0c;将得…

移动UI:成就勋章页面该如何设计,用例子说明。

移动应用的UI成就勋章页面通常是一个展示用户在应用中取得成就和获得勋章的页面。这种页面通常用于激励用户参与应用的活动&#xff0c;增加用户的参与度和忠诚度。 UI设计成就勋章页面时&#xff0c;一般会包括以下元素和功能&#xff1a; 1. 勋章列表&#xff1a; 展示用户…

Codeforces Round 970 (Div. 3) (个人题解)(未补完)

前言&#xff1a; 昨天晚上的比赛&#xff0c;可惜E题太笨了没想到如何解决&#xff0c;不过好在看到F过的多直接跳过去写F了&#xff0c;能过个5个也还不错了&#xff0c;而且一个罚时也没吃。之后的题我还是会再能补的时候补完的噢&#xff01; 正文&#xff1a; 链接&…

Context-Aware Depth and Pose Estimation for Bronchoscopic Navigation翻译

文章目录 摘要1.引言2. 相关工作3. 方法概述3.1. 基于CT数据的虚拟深度生成3.2. 基于视频帧的上下文感知深度估计3.3. 方法概述3.3.1. 从CT数据生成虚拟深度图3.3.2. 基于上下文感知的深度估计从视频帧中3.3.3. 相机姿态估计通过 2D/3D 配准 4. 实验4.1. 数据集和基线4.2. 实现…