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实现切面编程相关推荐

  1. Java绝地求生—Spring AOP面向切面编程

    Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...

  2. Spring(4)——面向切面编程(AOP模块)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  3. 第五章 Spring Boot的数据库编程

    若有错,请指出 第二章 搭建Springboot环境,配置视图解析器jsp页面 第三章 全注解下的Spring Ioc 第四章 约定编程-Spring AOP 第五章 Spring Boot的数据库编 ...

  4. SpringAop篇 (2) Spring中的切面编程技术 AspectJ

    介绍 : AOP(Aspect Orient Programming) 既为面向切面编程. 它可以说是OOP编程的一种扩展与补充,可以较为友好的处理不同模块之间具有横向相关性质的一类问题,比如日志管理 ...

  5. spring框架学习 - 使用 Spring 的面向切面编程

    接上一篇博客:https://blog.csdn.net/qq_43605444/article/details/122029896?spm=1001.2014.3001.5502 七.使用 Spri ...

  6. JAVA Spring Boot与海康威视摄像头的故事

    <菜鸟学JAVA第一篇> 前言:JAVA Spring Boot与海康威视摄像头的故事 关于本贴 干货部分 进入官网,选择sdk下载: 下载所需要的开发包(以下教程以windows为例): ...

  7. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  8. Java Spring Boot VS .NetCore (七) 配置文件

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  9. Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库

    内容摘要:大规模集群快速部署Java应用,需要制作Docker镜像,本次课程详细介绍如何制作Java程序的Docker镜像文件,深入解析DockerFile核心参数,以及实践演练把我们制作的Docke ...

最新文章

  1. jenkins+docker部署java项目
  2. Windows无法自动检测此网络的代理设置
  3. 计算机保存的信息是模拟信号,信息技术考试样题(附解析).doc
  4. Android自动化测试(UiAutomator)简要介绍
  5. mysql怎么对比表结构_mysql查看表结构2种方式对比
  6. 【剑指offer】面试题43:1~n整数中1出现的次数
  7. python笛卡尔_用Python 3来模拟笛卡尔积
  8. [渝粤教育] 西南科技大学 铁路交通信号控制 在线考试复习资料
  9. iPad2如何从iOS6降级到5.1.1
  10. webservice 缺少根元素_知识点:高中化学氮元素及其化合物知识总结
  11. python实战演练(二)三级菜单
  12. h5优秀控件_7个效果震憾的HTML5应用组件
  13. IntelliJ IDEA设置版权
  14. BlockingQueue(阻塞队列)
  15. DOM对象的常用属性
  16. 大数据开发面试题总结-超详细
  17. 快应用(或微信小程序)XXX is not a function的解决方案
  18. SpringBoot——使用外置的Tomcat服务器
  19. 魔域中文乱码还不让更新
  20. 推荐一款找回往日听收音机心情的小软件——龙卷风网络收音机

热门文章

  1. Fedora 7安装中文输入法
  2. 网格布局中 grid-template
  3. 2019-2020 ICPC昆明站 爆炸记兼赛后总结(日记向)
  4. python fixture_使用Fixture
  5. DeFi 市场复苏 GameFi 的夏天依旧火热
  6. SQL排序时null前后顺序分析
  7. html设置按钮样式表,如何使用样式表设置QToolButton的图标?
  8. maven引用公共包_maven项目打包jar给其他项目pom引用和外部引用
  9. Java环境变量配置及完全卸载
  10. pm2 和github上面的自动部署