日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AOP实现Controller参数日志

發布時間:2025/4/16 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AOP实现Controller参数日志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.jie.common;import java.lang.annotation.*;/*** @author wuchunjie* @date 2018/2/23*/ @Retention(RetentionPolicy.RUNTIME)//注解會在class中存在,運行時可通過反射獲取 @Target(ElementType.METHOD)//目標是方法 @Documented//文檔生成時,該注解將被包含在javadoc中,可去掉 public @interface OperationLogger {/*** 模塊名字*/String modelName() default "";/*** 操作類型*/String option(); } package com.jie.common;import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method;/*** @author wuchunjie* @date 2018/2/23*/ @Aspect @Component public class SysLogAspect {private static final Logger logger = Logger.getLogger(SysLogAspect.class);/*** 定義Pointcut,Pointcut的名稱,此方法不能有返回值,該方法只是一個標示*/@Pointcut("@annotation(com.jie.common.OperationLogger)")public void controllerAspect(){System.out.println("我是一個切入點");}/*** 前置通知(Before advice) :在某連接點(JoinPoint)之前執行的通知,但這個通知不能阻止連接點前的執行。* @param joinPoint*/@Before("controllerAspect()")public void doBefore(JoinPoint joinPoint){System.out.println("=====SysLogAspect前置通知開始=====");//handleLog(joinPoint, null);}/*** 后通知(After advice) :當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。* @param joinPoint*/@AfterReturning(pointcut = "controllerAspect()")public void doAfter(JoinPoint joinPoint){System.out.println("=====SysLogAspect后置通知開始=====");//handleLog(joinPoint, null);}/*** 拋出異常后通知(After throwing advice) : 在方法拋出異常退出時執行的通知。* @param joinPoint* @param e*/@AfterThrowing(value = "controllerAspect()", throwing = "e")public void doAfter(JoinPoint joinPoint, Exception e){System.out.println("=====SysLogAspect異常通知開始=====");//handleLog(joinPoint, e);}/*** 環繞通知(Around advice) :包圍一個連接點的通知,類似Web中Servlet規范中的Filter的doFilter方法??梢栽诜椒ǖ恼{用前后完成自定義的行為,也可以選擇不執行。* @param joinPoint*/@Around("controllerAspect()")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("=====SysLogAspect 環繞通知開始=====");//handleLog(joinPoint, null);Object obj= joinPoint.proceed();System.out.println("=====SysLogAspect 環繞通知結束=====");return obj;}/*** 日志處理** @param joinPoint* @param e*/private void handleLog(JoinPoint joinPoint, Exception e){try{//獲得注解OperationLogger logger = giveController(joinPoint);if (logger == null){return;}String signature = joinPoint.getSignature().toString(); // 獲取目標方法簽名String methodName = signature.substring(signature.lastIndexOf(".") + 1,signature.indexOf("("));String longTemp = joinPoint.getStaticPart().toLongString();String classType = joinPoint.getTarget().getClass().getName();Class<?> clazz = Class.forName(classType);Method[] methods = clazz.getDeclaredMethods();System.out.println("methodName: " + methodName);for (Method method : methods){if (method.isAnnotationPresent(OperationLogger.class)&& method.getName().equals(methodName)){//OpLogger logger = method.getAnnotation(OpLogger.class);String clazzName = clazz.getName();System.out.println("clazzName: " + clazzName + ", methodName: "+ methodName);}}} catch (Exception exp){logger.error("異常信息:{}", exp);exp.printStackTrace();}}/*** 獲得注解* @param joinPoint* @return* @throws Exception*/private static OperationLogger giveController(JoinPoint joinPoint) throws Exception{Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null){return method.getAnnotation(OperationLogger.class);}return null;}}

spring-mvc.xml

<!-- 1、配置映射器與適配器 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- aop --> <bean id="logService" class="com.jie.common.SysLogAspect"></bean> <!-- 開啟切面編程功能 --> <aop:aspectj-autoproxy proxy-target-class="true"/>

切到controller的參數之后,將pojo直接反序列化為參數保存到數據庫中即可

轉載于:https://my.oschina.net/wugong/blog/1632553

總結

以上是生活随笔為你收集整理的AOP实现Controller参数日志的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。