当前位置: 首页 > news >正文

公司网站的专题策划百度地图在线查询

公司网站的专题策划,百度地图在线查询,wordpress+runoob.com,建设交易网站多少钱原理 AOP:面向切面编程(spring AOP) ThreadLocal:实现线程范围内的局部变量,即ThreadLocal在一个线程中是共享的,在不同线程之间是隔离的。ThreadLocal 自定义注解:自定义注解 代码实现 自定…

在这里插入图片描述

原理

AOP:面向切面编程(spring AOP)
ThreadLocal:实现线程范围内的局部变量,即ThreadLocal在一个线程中是共享的,在不同线程之间是隔离的。ThreadLocal
自定义注解:自定义注解

代码实现

自定义注解

package com.dd.controller.log;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 LogAnnotation {/*** 日志名称*/String description() default "";/*** 日志操作类型*/String type();}

日志切面

package com.dd.controller.log;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.NamedThreadLocal;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;@Aspect
@Component
@Slf4j
public class LogAspect {private static final ThreadLocal<Date> beginTimeThreadLocal = new NamedThreadLocal<Date>("ThreadLocal beginTime");/*** Controller层切点,注解方式*/@Pointcut("@annotation(com.dd.controller.log.LogAnnotation)")public void controllerAspect() {}/*** 前置通知 (在方法执行之前返回)用于拦截Controller层记录用户的操作的开始时间** @param joinPoint 切点* @throws InterruptedException*/@Before("controllerAspect()")public void doBefore(JoinPoint joinPoint) throws InterruptedException {//线程绑定变量(该数据只有当前请求的线程可见)Date beginTime = new Date();beginTimeThreadLocal.set(beginTime);log.info("前置通知, 开始时间:" + beginTime);}/*** 后置通知(在方法执行之后返回) 用于拦截Controller层操作** @param joinPoint 切点*/@After("controllerAspect()")public void after(JoinPoint joinPoint) {try {Object[] objs = joinPoint.getArgs();if (objs != null && objs.length > 0) {for (Object object : objs) {if (object instanceof HttpServletRequest) {break;}}}String logName = getControllerMethodInfo(joinPoint).get("description").toString();String logType = getControllerMethodInfo(joinPoint).get("type").toString();//请求开始时间long beginTime = beginTimeThreadLocal.get().getTime();long endTime = System.currentTimeMillis();log.info("后置通知,结束时间{}, logName:{}, logType:{}" , endTime, logName, logType);//请求耗时Long logElapsedTime = endTime - beginTime;log.info("接口耗时:" + endTime);} catch (Exception e) {log.error("AOP后置通知异常", e);}}/*** 获取注解中对方法的描述信息 用于Controller层注解** @param joinPoint 切点* @return 方法描述* @throws Exception*/public static Map<String, Object> getControllerMethodInfo(JoinPoint joinPoint) throws Exception {Map<String, Object> map = new HashMap<String, Object>(16);//获取目标类名String targetName = joinPoint.getTarget().getClass().getName();//获取方法名String methodName = joinPoint.getSignature().getName();//获取相关参数Object[] arguments = joinPoint.getArgs();//生成类对象Class targetClass = Class.forName(targetName);//获取该类中的方法Method[] methods = targetClass.getMethods();String description = "";String type = null;for (Method method : methods) {if (!method.getName().equals(methodName)) {continue;}Class[] clazzs = method.getParameterTypes();if (clazzs.length != arguments.length) {//比较方法中参数个数与从切点中获取的参数个数是否相同,原因是方法可以重载哦continue;}description = method.getAnnotation(LogAnnotation.class).description();type = method.getAnnotation(LogAnnotation.class).type();map.put("description", description);map.put("type", type);}return map;}}

package com.dd.controller.log;

import lombok.extern.slf4j.Slf4j;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.NamedThreadLocal;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Aspect
@Component
@Slf4j
public class LogAspect {

private static final ThreadLocal<Date> beginTimeThreadLocal = new NamedThreadLocal<Date>("ThreadLocal beginTime");/*** Controller层切点,注解方式*/
@Pointcut("@annotation(com.dd.controller.log.LogAnnotation)")
public void controllerAspect() {}/*** 前置通知 (在方法执行之前返回)用于拦截Controller层记录用户的操作的开始时间** @param joinPoint 切点* @throws InterruptedException*/
@Before("controllerAspect()")
public void doBefore(JoinPoint joinPoint) throws InterruptedException {//线程绑定变量(该数据只有当前请求的线程可见)Date beginTime = new Date();beginTimeThreadLocal.set(beginTime);log.info("前置通知, 开始时间:" + beginTime);
}/*** 后置通知(在方法执行之后返回) 用于拦截Controller层操作** @param joinPoint 切点*/
@After("controllerAspect()")
public void after(JoinPoint joinPoint) {try {Object[] objs = joinPoint.getArgs();if (objs != null && objs.length > 0) {for (Object object : objs) {if (object instanceof HttpServletRequest) {break;}}}String logName = getControllerMethodInfo(joinPoint).get("description").toString();String logType = getControllerMethodInfo(joinPoint).get("type").toString();//请求开始时间long beginTime = beginTimeThreadLocal.get().getTime();long endTime = System.currentTimeMillis();log.info("后置通知,结束时间{}, logName:{}, logType:{}" , endTime, logName, logType);//请求耗时Long logElapsedTime = endTime - beginTime;log.info("接口耗时:" + endTime);} catch (Exception e) {log.error("AOP后置通知异常", e);}
}/*** 获取注解中对方法的描述信息 用于Controller层注解** @param joinPoint 切点* @return 方法描述* @throws Exception*/
public static Map<String, Object> getControllerMethodInfo(JoinPoint joinPoint) throws Exception {Map<String, Object> map = new HashMap<String, Object>(16);//获取目标类名String targetName = joinPoint.getTarget().getClass().getName();//获取方法名String methodName = joinPoint.getSignature().getName();//获取相关参数Object[] arguments = joinPoint.getArgs();//生成类对象Class targetClass = Class.forName(targetName);//获取该类中的方法Method[] methods = targetClass.getMethods();String description = "";String type = null;for (Method method : methods) {if (!method.getName().equals(methodName)) {continue;}Class[] clazzs = method.getParameterTypes();if (clazzs.length != arguments.length) {//比较方法中参数个数与从切点中获取的参数个数是否相同,原因是方法可以重载哦continue;}description = method.getAnnotation(LogAnnotation.class).description();type = method.getAnnotation(LogAnnotation.class).type();map.put("description", description);map.put("type", type);}return map;
}

}
引用注解

@LogAnnotation(description = "测试接口", type = "测试")@GetMapping("/test")public void test() throws Exception {}

效果
在这里插入图片描述

http://www.wooajung.com/news/28944.html

相关文章:

  • 沈阳网站建设工作室推广互联网营销
  • 营销型网站策划建设市场调研分析
  • 网站开发有那些费用南宁seo主管
  • 做网站要用写接口网站推广软件免费
  • 长春最专业的网站建设班级优化大师免费下载
  • 同一服务器建两个wordpress企业seo排名有 名
  • 大连网站制作-中国互联seo关键词优化推广价格
  • 山东做外贸网站的公司湖州网站seo
  • 做网站后的总结网站排名推广推荐
  • 页面设计文档学seo如何入门
  • 制作一个企业网站过程哔哩哔哩推广网站
  • 网站建设的经费预算报告免费推广seo
  • 珠海公司做网站湖南网站建站系统哪家好
  • 免费网站制作app网站免费优化
  • 做视频网站利润如何处理免费制作永久个人网站
  • 微信小程序点餐系统怎么做北京推广优化经理
  • 网站开发哪家好厦门网络推广哪家强
  • 深圳上市公司网站建设海外社交媒体营销
  • 咸阳网站建设多少钱黄页网络的推广网站有哪些
  • 网站开发主要用什么语言亚洲长尾关键词挖掘
  • 沧州英文网站制作迅雷磁力链bt磁力种子
  • 360网站做二维码百度搜索量查询
  • 国外大气网站免费企业黄页查询官网
  • 云南品牌网站开发国内外十大免费crm软件推荐
  • 快速网站备案东莞网络优化公司
  • 邯郸做网站公司国内搜索引擎排名第一
  • 做网站的成本有多少seo咨询岳阳
  • 天津河西做网站哪家好百度地图推广电话
  • 佛山电商网站制作团队新乡网络推广外包
  • wordpress 百度搜索图片百度seo权重