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

网站内容收费扬州工程建设招标网

网站内容收费,扬州工程建设招标网,自创品牌策划方案范文,做旅游网站宣传SpringBoot的AOP原理 Spring Boot的AOP#xff08;面向切面编程#xff09;原理是基于动态代理实现的。 在Spring Boot中#xff0c;AOP通过代理模式对目标对象进行包装#xff0c;实现在目标对象的方法执行前后增加额外的逻辑。AOP可以在不修改目标对象的情况下#xf…SpringBoot的AOP原理 Spring Boot的AOP面向切面编程原理是基于动态代理实现的。 在Spring Boot中AOP通过代理模式对目标对象进行包装实现在目标对象的方法执行前后增加额外的逻辑。AOP可以在不修改目标对象的情况下通过代理对象对目标对象进行方法的增强。 Spring Boot中的AOP主要使用了两种代理方式JDK动态代理和CGLIB动态代理。 JDK动态代理JDK动态代理是基于接口的代理目标对象必须实现至少一个接口。Spring Boot使用JDK动态代理机制生成代理对象代理对象实现了目标对象所实现的接口并且将方法调用转发给目标对象。JDK动态代理通过Proxy类和InvocationHandler接口实现。CGLIB动态代理CGLIB动态代理是基于类的代理不需要目标对象实现接口。Spring Boot使用CGLIB动态代理机制通过生成目标对象的子类来实现代理代理对象继承了目标对象的所有方法并且可以重写其中的方法来实现增强逻辑。 当目标对象的方法被调用时AOP框架会根据切面定义和通知定义来决定是否需要对目标对象的方法进行增强。如果需要增强AOP框架会通过代理对象来调用目标对象的方法并在调用前后执行通知中定义的增强逻辑。 背景功能说明 在开发应用系统的时候我需要了解什么接口是什么IP在访问用时多少用什么参数来请求请求之后的结果返回的事情全部记录下来用来帮助自己分析本系统的热点数据、接口访问频率访问地址等等信息可以根据这些信息做系统的改进策略。 代码开发 创建数据表 CREATE TABLE api_log (id bigint(20) NOT NULL AUTO_INCREMENT,ip_addr varchar(100) DEFAULT NULL COMMENT 访问IP地址,uri varchar(500) DEFAULT NULL COMMENT 请求接口地址,method_name varchar(255) DEFAULT NULL COMMENT 请求接口方法名,description varchar(255) DEFAULT NULL COMMENT 请求接口描述,duration bigint(20) DEFAULT NULL COMMENT 请求接口用时,start_time datetime DEFAULT NULL COMMENT 请求开始时间,end_time datetime DEFAULT NULL COMMENT 请求结束时间,params text COMMENT 请求接口参数,log_result text COMMENT 请求接口返回结果,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT84110 DEFAULT CHARSETutf8;注解类 此类用于注解在控制器的方法类上。 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 Loggable {/*** 日志信息描述* return*/String value() default ;/*** 是否保存到数据库* return*/boolean save() default true;/*** 是否输出到控制台* return*/boolean console() default true;}使用AOP保存接口信息 import cn.hutool.core.date.DateUtil; import cn.hutool.core.net.NetUtil; import com.alibaba.fastjson.JSON; import com.api.annotation.Loggable; import com.api.entity.ApiLog; import com.api.service.ApiLogService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.CodeSignature; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder;import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map;Aspect Component Slf4j public class LogAspect {/*** 操作开始时间*/private Long startTime 0L;Resourceprivate ApiLogService apiLogService;/*** Controller层切点*/Pointcut(execution(* com.api.controller..*.*(..)))public void controllerAspect() {}/*** 前置通知 在方法前使用*/Before(controllerAspect())public void beforeControllerLog(JoinPoint joinpoint){}Around(controllerAspect())public Object aroundControllerLog(ProceedingJoinPoint point) throws Throwable{//获取RequestRequestAttributes requestAttributes RequestContextHolder.getRequestAttributes();HttpServletRequest request (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);//获取目标方法Method method ((MethodSignature) point.getSignature()).getMethod();//判断是否有Loggable注解if(!method.isAnnotationPresent(Loggable.class)){//如果没有直接返回结果return point.proceed();}//记录日志信息ApiLog logMessage new ApiLog();/*** 获取方法上的注解实例*/Loggable loggable method.getAnnotation(Loggable.class);//处理接口请求日志handleRequestLog(point, loggable, request, logMessage);//执行目标方法内容获取执行结果Object result point.proceed();//处理接口响应日志handleResponseLog(logMessage, loggable, result);return result;}private void handleRequestLog(ProceedingJoinPoint point, Loggable loggable, HttpServletRequest request, ApiLog logMessage) {//类名String targetName point.getTarget().getClass().toString();//方法名称String methodName point.getSignature().getName();MapString, Object params getMethodParamNames(point);//判断是否输出日志if(loggable.console()){log.info(targetName:{},methodName:{},params:{},targetName,methodName,params);}startTime System.currentTimeMillis();logMessage.setStartTime(DateUtil.date());logMessage.setDescription(loggable.value());logMessage.setMethodName(methodName);logMessage.setAppKey(request.getParameter(appKey));logMessage.setUri(request.getRequestURI());logMessage.setIpAddr(getIpAddress(request)null?request.getRemoteAddr():getIpAddress(request));logMessage.setParams(JSON.toJSONString(params));}private void handleResponseLog(ApiLog logMessage, Loggable loggable, Object result) {/*** 操作结束时间*/Long endTime System.currentTimeMillis();Long duration endTime - startTime;logMessage.setDuration(duration);logMessage.setEndTime(DateUtil.date());logMessage.setLogResult(JSON.toJSONString(result));if(loggable.save()){//这里考虑用异步操作进行优化apiLogService.save(logMessage);}if(loggable.console()){log.info(方法执行所需时间 : {} , 输出的结果 : {},duration,result);}}//获取请求方法的参数private static MapString, Object getMethodParamNames(ProceedingJoinPoint point) {MapString, Object param new HashMap();Object[] paramValues point.getArgs();String[] paramNames ((CodeSignature) point.getSignature()).getParameterNames();for (int i 0; i paramNames.length; i) {param.put(paramNames[i], paramValues[i]);}return param;}// 获取代理前的IPprivate String getIpAddress(HttpServletRequest request) {String ip request.getHeader(x-forwarded-for);if (ip null || ip.length() 0 || unknown.equalsIgnoreCase(ip)) {ip request.getHeader(Proxy-Client-IP);}if (ip null || ip.length() 0 || unknown.equalsIgnoreCase(ip)) {ip request.getHeader(WL-Proxy-Client-IP);}if (ip null || ip.length() 0 || unknown.equalsIgnoreCase(ip)) {ip request.getRemoteAddr();}if (ip.contains(,)) {return ip.split(,)[0];} else {return ip;}} } 上述代码即可实现保存接口访问的信息。
http://www.pierceye.com/news/124792/

相关文章:

  • 网站开发费用一般是多少怎么建设宣传网站
  • 做网站的背景怎么做ps免费模板网站
  • 为什么要建设应急管理网站sketch做网站
  • 做的网站在百度上搜不出来的宁波关键词优化平台
  • 哪里有手机网站建设公司有道网站收录提交入口
  • 赣州网站建设较好的公司贵州网站建设hsyunso
  • 网站建设和管理是教什么科目鹤壁网站建设鹤壁
  • 网站域名和邮箱域名解析国外网站国内做二维码
  • 万万州州微微网站网站建建设设福州建设网站效果图
  • 长安网站建设详细教程鸿科经纬教网店运营推广
  • 微信营销模式有seo短视频网页入口引流推广
  • 做商城网站简单吗长春网站建设服务
  • 工厂弄个网站做外贸如何app开发报价公司
  • 网销网站建设流程如何创建网站挣钱
  • 韶关网站制作手机推广app
  • Linux做视频网站网速均衡网页编辑实践报告
  • 做ppt好的模板下载网站如何查看网站空间商
  • 武义公司网站建设公司如何建设网站首页
  • hdwiki做网站罗湖网站建设联系电话
  • 深圳网站建设 利科技wordpress插件 手机版
  • 南通优普网站建设团队课程设计模板
  • 网站建设与维护的选择题浦东新区做网站
  • 做视频网站视频放在哪里网站备案目的
  • 建设部安全事故通报网站怎么更改网站的备案号
  • 重庆网站建设维护网络推广引流方法
  • 精品网站开发分销网站建站
  • 建设一个教程视频网站需要什么资质策划书案例范文
  • 郑州汉狮做网站的大公司海尔网站建设
  • 成都网站制作成都重庆网红景点排名
  • 广西南宁市网站制作公司制作图片的软件加字体