java spring boot实现切面编程
spring boot实现切面编程实现简单的切面。用log日志切面来进行举例。
1.定义注解的类
@Target({ElementType.PARAMETER,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {/*** 描述*/String description() default "";/*** 方法类型 INSERT DELETE UPDATE OTHER*/MethodType methodType() default MethodType.OTHER;
}
2.定义切面类,切点@annotation的意思通过注解Log注解 进入切点
在这里插入代码片@Aspect
@Component
public class LogAspect {private static final Logger log = LoggerFactory.getLogger(LogAspect.class);/*** web层切点* 1. @Pointcut("execution(public * com.astutephone.clouddesktop.zebra.modules.*.controller..*(..))") web层的所有方法* 2. @Pointcut("@annotation(com.astutephone.clouddesktop.zebra.common.base.Log)") Log注解标注的方法*/@Pointcut("@annotation(com.astutephone.common.base.Log)")public void webLog() {}/*** 环绕通知*/@Around("webLog()")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {//获取请求对象HttpServletRequest request = getRequest();WebLog webLog = new WebLog();Object result = null;try {log.info("=================前置通知=====================");long start = System.currentTimeMillis();result = joinPoint.proceed();log.info("=================返回通知=====================");long timeCost = System.currentTimeMillis() - start;// 获取Log注解Log logAnnotation = getAnnotation(joinPoint);// 封装webLog对象
// webLog.setMethodType(logAnnotation.methodType().name());
// webLog.setDescription(logAnnotation.description());
// webLog.setTimeCost((int) timeCost);
// webLog.setStartTime(start);
// webLog.setIpAddress(request.getRemoteAddr());
// webLog.setHttpMethod(request.getMethod());
// webLog.setParams(getParams(joinPoint));
// webLog.setResult(result);
// webLog.setUri(request.getRequestURI());
// webLog.setUrl(request.getRequestURL().toString());
// log.info("{}", JSON.toJSONString(webLog));} catch (Throwable e) {log.info("==================异常通知=====================");log.error(e.getMessage());throw new Throwable(e);}finally {log.info("=================后置通知=====================");}return result;}/*** 获取方法上的注解*/private Log getAnnotation(ProceedingJoinPoint joinPoint) {Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();return method.getAnnotation(Log.class);}/*** 获取参数*/private Object getParams(ProceedingJoinPoint joinPoint) {// 参数名String[] paramNames = getMethodSignature(joinPoint).getParameterNames();// 参数值Object[] paramValues = joinPoint.getArgs();// 存储参数Map<String, Object> params = new LinkedHashMap<>();for (int i = 0; i < paramNames.length; i++) {Object value = paramValues[i];// MultipartFile对象以文件名作为参数值if (value instanceof MultipartFile) {MultipartFile file = (MultipartFile) value;value = file.getOriginalFilename();}params.put(paramNames[i], value);}return params;}private MethodSignature getMethodSignature(ProceedingJoinPoint joinPoint) {return (MethodSignature) joinPoint.getSignature();}private HttpServletRequest getRequest() {ServletRequestAttributes requestAttributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();return requestAttributes.getRequest();}
}
3.方法上面加注解类的注解
@RequestMapping("/iplist")@ApiOperation("iplist")@com.astutephone.common.base.Log(description = "aaaa")public JSONObject iplist(HttpServletRequest request) {log.info("1111");}
java spring boot实现切面编程相关推荐
- Java绝地求生—Spring AOP面向切面编程
Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...
- Spring(4)——面向切面编程(AOP模块)
Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...
- 第五章 Spring Boot的数据库编程
若有错,请指出 第二章 搭建Springboot环境,配置视图解析器jsp页面 第三章 全注解下的Spring Ioc 第四章 约定编程-Spring AOP 第五章 Spring Boot的数据库编 ...
- SpringAop篇 (2) Spring中的切面编程技术 AspectJ
介绍 : AOP(Aspect Orient Programming) 既为面向切面编程. 它可以说是OOP编程的一种扩展与补充,可以较为友好的处理不同模块之间具有横向相关性质的一类问题,比如日志管理 ...
- spring框架学习 - 使用 Spring 的面向切面编程
接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122029896?spm=1001.2014.3001.5502 七.使用 Spri ...
- JAVA Spring Boot与海康威视摄像头的故事
<菜鸟学JAVA第一篇> 前言:JAVA Spring Boot与海康威视摄像头的故事 关于本贴 干货部分 进入官网,选择sdk下载: 下载所需要的开发包(以下教程以windows为例): ...
- 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...
主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...
- Java Spring Boot VS .NetCore (七) 配置文件
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
内容摘要:大规模集群快速部署Java应用,需要制作Docker镜像,本次课程详细介绍如何制作Java程序的Docker镜像文件,深入解析DockerFile核心参数,以及实践演练把我们制作的Docke ...
最新文章
- jenkins+docker部署java项目
- Windows无法自动检测此网络的代理设置
- 计算机保存的信息是模拟信号,信息技术考试样题(附解析).doc
- Android自动化测试(UiAutomator)简要介绍
- mysql怎么对比表结构_mysql查看表结构2种方式对比
- 【剑指offer】面试题43:1~n整数中1出现的次数
- python笛卡尔_用Python 3来模拟笛卡尔积
- [渝粤教育] 西南科技大学 铁路交通信号控制 在线考试复习资料
- iPad2如何从iOS6降级到5.1.1
- webservice 缺少根元素_知识点:高中化学氮元素及其化合物知识总结
- python实战演练(二)三级菜单
- h5优秀控件_7个效果震憾的HTML5应用组件
- IntelliJ IDEA设置版权
- BlockingQueue(阻塞队列)
- DOM对象的常用属性
- 大数据开发面试题总结-超详细
- 快应用(或微信小程序)XXX is not a function的解决方案
- SpringBoot——使用外置的Tomcat服务器
- 魔域中文乱码还不让更新
- 推荐一款找回往日听收音机心情的小软件——龙卷风网络收音机