基于注解SpringAOP,AfterReturning,Before,Around__springboot工程 @Around 简单的使用__SpringBoot:AOP 自定义注解实现日志管理

基于注解SpringAOP,AfterReturning,Before,Around

AOP(Aspect Oriented Programming),即面向切面编程(也叫面向方面编程,面向方法编程)。其主要作用是,在不修改源代码的情况下给某个操作添加额外的功能。像日志记录,事务处理,权限控制,都可以用AOP来“优雅”地实现,使这些额外功能和真正的业务逻辑分离开来,软件的结构将更加清晰。

Spring AOP是基于代理机制的,通过JDK Proxy和CGLIB Proxy两种方法实现代理。
1)如果target object没有实现任何接口,那么Spring将使用CGLIB来实现代理。CGLIB是一个开源项目,它是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
2)如果target object实现了一个以上的接口,那么Spring将使用JDK Proxy来实现代理,因为Spring默认使用的就是JDK Proxy,并且JDK Proxy是基于接口的。这也是Spring提倡的面向接口编程。

依赖jar

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

下面是一个简单的示例:

1.定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperationLog {String type();
}

2.AOP配置

@Aspect
@Component
public class AOPConfig {@Around(value = "@annotation(OperationLog)")public Object around(ProceedingJoinPoint proceedingJoinPoint){System.out.println("方法环绕begin...参数:"+Arrays.toString(proceedingJoinPoint.getArgs()));try {Object ret= proceedingJoinPoint.proceed();System.out.println("方法环绕end...结果:"+ret);return ret;} catch (Throwable throwable) {throwable.printStackTrace();}return null;}@Before(value = "@annotation(OperationLog)")public void doBefore(JoinPoint joinPoint){ServletRequestAttributes requestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest req= requestAttributes.getRequest();System.out.println("uri:"+req.getRequestURI());System.out.println("执行方法前 : " + Arrays.toString(joinPoint.getArgs()));}@After(value = "@annotation(OperationLog)")public void after(JoinPoint joinPoint){System.out.println("执行方法后:"+ Arrays.toString(joinPoint.getArgs()));}@AfterReturning(pointcut = "@annotation(OperationLog)",returning = "ret")public void doAfterReturning(Object ret){System.out.println("方法的返回值 : " + ret);}@AfterThrowing(pointcut = "@annotation(OperationLog)",throwing = "ex")public void AfterThrowing(JoinPoint joinPoint,Throwable ex){System.out.println("方法执行异常 : " + ex);}
}

3.服务类

@RequestMapping("/aop")
@RestController
public class AOPCtrl {@Autowiredprivate MessageService messageService;@RequestMapping(value = "/test",method = RequestMethod.GET)public String test(){return messageService.sendMessage("xiaoming",29);}
}@Service
public class MessageService {@OperationLog(type = "sendMessage")public String sendMessage(String name,int age){return "this person: "+name+" age: "+age;}
}运行结果:
方法环绕begin...参数:[xiaoming, 29]
uri:/aop/test
执行方法前 : [xiaoming, 29]
方法环绕end...结果:this person: xiaoming age: 29
执行方法后:[xiaoming, 29]
方法的返回值 : this person: xiaoming age: 29

需要详细了解可以参照官方文档:https://docs.spring.io/spring/docs/2.5.x/reference/aop.html

springboot工程 @Around 简单的使用

一 .定义自定义注解

@Documented //生成文档API
@Target(ElementType.METHOD)//这个注解能写的位置,如method ,class
@Retention(RetentionPolicy.RUNTIME) //注解的生存时间
public @interface LoginUser{
}

二.导入的依赖包

 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.8.RELEASE</version><!-- 根据自己spring工程版本选择--></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>

三.实现环绕注解

package com.qf.annotation.impl;import com.qf.annotation.LoginUser;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoginUserImpl {@Around("@annotation(loginUser)")public void parseToken( ProceedingJoinPoint point,LoginUser loginUser) {System.out.println("loginUser = [" + loginUser + "]");try {//放行调用目标方法Object proceed = point.proceed();//返回值就是controller的返回值System.out.println("proceed = " + proceed);} catch (Throwable throwable) {throwable.printStackTrace();}}
}

需要注意点

  1. 使用该的注解时,必须在启动类进行包扫描,如果同一个模块则无需
  2. LoginUser 参数一定要写在最后面否则会报非法参数异常

在这里插入图片描述

SpringBoot:AOP 自定义注解实现日志管理

1.引入AOP依赖

<!-- aop依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.定义自定义注解@Log

package com.ohes.missclass.common.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {String value() default "";
}

3.定义AOP 。类名上使用@Aspect,@Component注解(说明是一个切面,并让spring扫描)

@Around 是可以同时在所拦截方法的前后执行一段逻辑

@Before 是在所拦截方法执行之前执行一段逻辑

@After 是在所拦截方法执行之后执行一段逻辑

@Pointcut 切入点

@annotation 表明只有在方法上引用@Log注解才会被AOP拦截执行

/*** AOP 记录用户操作日志**/
@Slf4j
@Aspect
@Component
public class LogAspect {@Pointcut("@annotation(com.ohes.missclass.common.annotation.Log)")public void pointcut() {// do nothing}@Around("pointcut()")public Object around(ProceedingJoinPoint point) throws Throwable {Object result = null;long beginTime = System.currentTimeMillis();// 执行方法result = point.proceed();// 获取 requestHttpServletRequest request = HttpContextUtil.getHttpServletRequest();// 设置 IP 地址String ip = IPUtil.getIpAddr(request);// 执行时长(毫秒)long time = System.currentTimeMillis() - beginTime;// 执行保存日志的数据库操作,把需要的信息插入到日志表中,根据实际业务逻辑编写return result;}
}

4.在保存日志的service方法上使用@Async注解,表明异步执行

@Async
void saveLog(ProceedingJoinPoint point, SysLog log) throws JsonProcessingException;

5.在controller层使用自定义@Log(利用AOP实现日志管理完成)

@Log("班级信息删除")
@DeleteMapping("/delClass/{ids}")
public Result delClass(@PathVariable(value = "ids", required = true) String ids) throws Exception {return iBizClassService.delClass(ids);
}

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

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

相关文章

流浪地球开机动画包zip_【文娱热点】流浪地球2定档2023大年初一;迪士尼计划裁员32000人...

剧集、综艺任嘉伦、白鹿《长安如故》开机11月26日&#xff0c;根据小说《一生一世美人骨》古代篇改编的剧集《长安如故》开机&#xff0c;两位主演任嘉伦和白鹿继现代篇《一生一世》之后再演古代篇&#xff0c;俩人穿着棉服、梳着古装发髻现身开机仪式&#xff0c;心情非常好。…

matlab读气象数据,中国气象数据网

“中国气象科学数据共享服务网”的气象卫星资料与国内其他气象卫星资料发布平台的最大不同之处&#xff0c;在于卫星数据资源内容不同且时间序列相当完整。而且&#xff0c;(1)数据获取更便捷。在线获取数据无需等待邮件通知&#xff0c;无数据下载量限制。共享卫星资源是公益性…

spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志

spring中自定义注解(annotation)与AOP中获取注解 一、自定义注解(annotation) 自定义注解的作用&#xff1a;在反射中获取注解&#xff0c;以取得注解修饰的类、方法或属性的相关解释。 package me.lichunlong.spring.annotation;import java.lang.annotation.Documented; …

python 编译器pyc_有没有办法知道哪个Python版本.pyc文件被编译?

Is there any way to know by which Python version the .pyc file was compiled? 解决方案 You can get the magic number of your Python as follows: $ python -V Python 2.6.2 # python >>> import imp >>> imp.get_magic().encode(hex) d1f20d0a To ge…

Spring AOP——Spring 中面向切面编程

前面两篇文章记录了 Spring IOC 的相关知识&#xff0c;本文记录 Spring 中的另一特性 AOP 相关知识。 部分参考资料&#xff1a; 《Spring实战&#xff08;第4版&#xff09;》 《轻量级 JavaEE 企业应用实战&#xff08;第四版&#xff09;》 Spring 官方文档 W3CSchool Spri…

python getchar,Linux C编程学习:getchar()和getch()

getchar函数名: getchar功 能: 从stdin流中读字符用 法: int getchar(void);注解&#xff1a;getchar有一个int型的返回值&#xff0c;当程序调用getchar时程序就等着用户按键&#xff0c;用户输入的字符被存放在键盘缓冲区中直到用户按回车为止(回车字符也放在缓冲区中)。当用…

python 折线图中文乱码_彻底解决 Python画图中文乱码问题--Pyplotz组件

1 源起 自从开始学习Python&#xff0c;就非常喜欢用来画图。一直没有需求画要中文显示信息的图&#xff0c;所以没有配置Python中文的环境。由于昨天就需要画几十个形式相同&#xff0c;只是数据不同的图&#xff0c;并且需要显示中文信息。如果用Excel画图会很浪费时间&#…

SpringBoot的AOP是默认开启的,不需要加注解@EnableAspectJAutoProxy____听说SpringAOP 有坑?那就来踩一踩

Aspect Component public class CustomerServiceInterceptor {Before("execution(public * org.example.aop.demo..*.*(..))")public void doBefore() {System.out.println("do some important things before...");} }另外SpringBoot默认是cglib动态代理&a…

mysql 开启远程访问_QxOrm 访问 MySQL

在前面的 QxOrm 章节中&#xff0c;我们已经介绍了对本地数据库的操作&#xff0c;现在是时候介绍对远程数据库的访问了&#xff0c;那么就以最常用的 MySQL 为例吧&#xff01;在开始之前&#xff0c;首先要安装 MySQL。如果条件允许&#xff0c;建议将其安装在 Linux 系统上&…

当泛型遇到重载

当泛型遇到了重载&#xff0c;好戏&#xff0c;就发生了。 请看下面代码&#xff1a; 问题&#xff1a;代码能正确编译吗&#xff1f; 这个题目是一个考察泛型的题目。java里面&#xff0c;泛型实际上是“伪泛型”&#xff0c;并不像C#那样是实际上的泛型。 IDE会提示我们下…

redis查询所有key命令_三歪推荐:Redis常见的面试题

本文公众号来源&#xff1a;科技缪缪作者&#xff1a;科技缪缪本文已收录至我的GitHub说说Redis基本数据类型有哪些吧字符串&#xff1a;redis没有直接使用C语言传统的字符串表示&#xff0c;而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息…

springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

文章目录一、redisTemplate和stringRedisTemplate对比1、StringRedisTemplate2、RedisTemplate二、redisTemplate序列化方式比较1、性能测试对比2、性能总结3、方案一、考虑效率和可读性&#xff0c;牺牲部分空间4、方案二、空间敏感&#xff0c;忽略可读性和效率影响5、使用示…

mysql查询默认排序规则_深究 mysql 默认排序, order by 的顺序【收藏】

mysql 语句中如果没有使用 order by 来排序&#xff0c;通常会用 主键正序排列&#xff0c;但是有的时候不是这样&#xff0c;来看一个实例。实例群友问&#xff1a;请教一个问题&#xff0c;mysql 默认排序问题&#xff0c;当sql 语句 的排序没有指定 主键&#xff08;id&…

Spring Boot jackson配置使用详解

Spring Boot系列-json框架jackson配置详解 T1 - 前言 目前Java最常见的3中JSON操作框架分别为Gson、Jackson、FastJson&#xff0c;该篇文章主要讲解jackson在SpringBoot环境中各配置项的具体作用。 T2 - 环境依赖 jackson是spring-boot的web/webflux框架默认依赖的json库&…

频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...

文末有仿真模型下载方式1.1 基于C语言的SIMULINK仿真模型使用C语言在MATLAB/SIMULINK中仿真&#xff0c;需要借助s-function builder模块实现。七段式SVPWM仿真模型如图1-1所示。仿真解算器&#xff08;Solver&#xff09;选择变步长&#xff08;Variable-step&#xff09;、od…

php基本语法 格式,PHP 基本语法格式

PHP 基本语法格式标准代码如下:复制代码 代码如下:...?>短标签模式(此模式需要修改PHP配置&#xff0c;让PHP支持短标签模式)&#xff1a;复制代码 代码如下:...?>注释&#xff1a;复制代码 代码如下:/* ...*///#时间&#xff1a; 2009-12-14Abs: 取得绝对值. Acos: 取…

linux 服务器启用端口,linux服务器放行端口

一、默认使用iptables的系统(例如centos6)1、关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放。下面是命令实现&#xff1a;iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP再用命令iptables -L -n查看 是否设置好&#xff0c; 好看到全部 DROP 了这…

MySQL 无符号和有符号的区别

随笔记录: mysql无符号和有符号的区别 无符号unsigned 表示设置的的数据为0或者正数&#xff1b; 有符号则可以是负数 -&#xff1b; 内存占比 有符号 0-255 无符号 -127~127

linux下tomcat启动后无进程,Linux中Tomcat shutdown.sh后进程仍然存在解决办法

最近我们在使用Jenkins自动化部署项目时&#xff0c;在生产liunx环境下&#xff0c;使用脚本shutdown.sh停止tomcat服务&#xff0c;然后再start之后发现应用无法访问了&#xff0c;后台查看tomcat进程是发现有个2个tomcat进程&#xff0c;说明之前的shutdown并没有完全停掉tom…

扫地机器人电路原理图_扫地机有这一台就够了:石头扫地机器人T6 首拆

听说集齐13台扫地机器人可以召唤扫地机神兽&#xff0c;所以集齐了22台扫地机后我的神兽呢&#xff1f;自从上个月入手了石头科技出品的小瓦青春版扫地机之后已经集齐了所有小米(石头)系扫地机。小瓦青春版是一款无序清洁的扫地机产品&#xff0c;也是石头科技价格最低的入门级…