SpringBoot 使用@Aspect进行日志管理(基于反射代理模式+动态修改注解Log)
来源:互联网 发布:淘宝订单清洗三次机会 编辑:程序博客网 时间:2024/06/07 02:54
在上一篇“SpringBoot 使用@Aspect进行日志管理(基于反射代理模式+注解Log)”的基础上,添加注解进行日志管理升级版
1、修改日志注解类
/** * 日志注解 * Created by 陈梓平 on 2017/9/7. */@Target({ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface JournalLog { /** 要执行的操作类型比如:add **/ int operationType() default -1; /** 要执行的模块名称如:Carouse **/ int modularTypeName() default -1; /**注解说明*/ String xplain() default ""; /**判断类型*/ boolean checkBoolean() default false; /**注解说明数组*/ String[] xplainArray() default "";}
2、添加注解工具类
/** * 注解工具类 * Created by 陈梓平 on 2017/9/11. */public class AnnotationUtils { /**日志输出*/ private static final Logger logger = LoggerFactory.getLogger(AnnotationUtils.class); private static AnnotationUtils mInstance; public AnnotationUtils() { } public static AnnotationUtils get() { if (mInstance == null) { synchronized (AnnotationUtils.class) { if (mInstance == null) { mInstance = new AnnotationUtils(); } } } return mInstance; } /** * 获取注解属性值信息 * @param className 类名 * @param methodName 方法名 * @param annotationClass 注解类 * @param attrName 注解属性名 * @throws NotFoundException */ public static Object getAnnotationAttr(String className,String methodName,Class<?> annotationClass,String attrName) throws NotFoundException, NoSuchMethodException { Object value = null; if (StringUtils.isBlank(className)) return value; if (StringUtils.isBlank(methodName)) return value; if (annotationClass==null) return value; if (StringUtils.isBlank(attrName)) return value; ClassPool pool = ClassPool.getDefault(); //获取要修改的类的所有信息 CtClass ct = pool.get(className); CtMethod ctMethod = ct.getDeclaredMethod(methodName); MethodInfo methodInfo = ctMethod.getMethodInfo(); //获取注解属性 AnnotationsAttribute attribute = (AnnotationsAttribute) methodInfo.getAttribute(AnnotationsAttribute.visibleTag); String annotationName = annotationClass.getName(); Method operationType = annotationClass.getDeclaredMethod(attrName); Class<?> returnType = operationType.getReturnType(); if (attribute!=null){ //获取注解 Annotation annotation = attribute.getAnnotation(annotationName); if (annotation!=null){ //获取注解的值 if (int.class.isAssignableFrom(returnType)){ IntegerMemberValue memberValue = (IntegerMemberValue) annotation.getMemberValue(attrName); if (memberValue!=null) value = memberValue.getValue() ; } if (String.class.isAssignableFrom(returnType)){ StringMemberValue memberValue = (StringMemberValue) annotation.getMemberValue(attrName); if (memberValue!=null) value = memberValue .getValue() ; } if (boolean.class.isAssignableFrom(returnType)){ BooleanMemberValue memberValue = (BooleanMemberValue) annotation.getMemberValue(attrName); if (memberValue!=null) value = memberValue.getValue() ; } if (String[].class.isAssignableFrom(returnType)){ ArrayMemberValue memberValue = (ArrayMemberValue) annotation.getMemberValue(attrName); if (memberValue!=null){ MemberValue[] strValueArray = memberValue.getValue(); String[] strValueA = new String[strValueArray.length]; for (int i = 0;i<strValueArray.length;i++){ StringMemberValue stringMemberValue = (StringMemberValue) strValueArray[i]; strValueA[i] = stringMemberValue.getValue(); } value = strValueA; } } } } return value; } /** * 修改注解属性 * @param className 类名 * @param methodName 方法名 * @param annotationClass 注解名 * @param attrName 属性名 * @param value 修改值 * @throws NotFoundException */ public static boolean updateAnnotationAttr(String className,String methodName,Class<?> annotationClass,String attrName,Object value) throws NotFoundException, NoSuchMethodException { if (StringUtils.isBlank(className)) return false; if (StringUtils.isBlank(methodName)) return false; if (annotationClass==null) return false; if (StringUtils.isBlank(attrName)) return false; if (value==null) return false; ClassPool pool = ClassPool.getDefault(); //获取需要修改的类 CtClass ct = pool.get(className); CtMethod minInfo = ct.getDeclaredMethod(methodName); MethodInfo methodInfo = minInfo.getMethodInfo(); ConstPool cp = methodInfo.getConstPool(); AnnotationsAttribute attribute = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag); String annotationName = annotationClass.getName(); Method operationType = annotationClass.getDeclaredMethod(attrName); Class<?> returnType = operationType.getReturnType(); Annotation annotation = new Annotation(annotationName, cp); //修改名称为unitName的注解 if (annotation != null) { if (String.class.isAssignableFrom(returnType)) annotation.addMemberValue(attrName, new StringMemberValue((String) value, cp)); else if (int.class.isAssignableFrom(returnType)) annotation.addMemberValue(attrName, new IntegerMemberValue(cp,(Integer)value)); else if (boolean.class.isAssignableFrom(returnType)) annotation.addMemberValue(attrName, new BooleanMemberValue((boolean) value, cp)); else if (String[].class.isAssignableFrom(returnType)){ String[] stres = (String[])value; StringMemberValue[] elements = new StringMemberValue[stres.length]; for(int i=0;i<stres.length;i++) elements[i] = new StringMemberValue(stres[i],cp); ArrayMemberValue amv = new ArrayMemberValue(cp); amv.setValue(elements); annotation.addMemberValue(attrName,amv); }else return false; attribute.setAnnotation(annotation); methodInfo.addAttribute(attribute); return true; } return false; }}
3、修改日志切面类
import com.chen.annotation.JournalLog;import com.chen.exception.CustomException;import com.chen.staticInfos.StaticInfo;import com.chen.utils.AnnotationUtils;import com.chen.utils.JournalUtils;import javassist.NotFoundException;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;/** * 日志切面 * Created by 陈梓平 on 2017/9/11. */@Component@Aspectpublic class JournalAspect { /**日志输出*/ private static final Logger logger = LoggerFactory.getLogger(JournalAspect.class); /**日志工具类*/ @Autowired private JournalUtils aspectJournalUtils; /**service层切面*/ private final String POINT_CUT = "execution(* com.chen.service..*(..))"; @Pointcut(POINT_CUT) private void pointcut(){} /** * 后置最终通知(目标方法只要执行完了就会执行后置通知方法) * 日志管理 * @param joinPoint */ @After(value = "pointcut()") @Transactional public void doAfterAdvice(JoinPoint joinPoint) throws CustomException, ClassNotFoundException, NotFoundException, NoSuchMethodException { String className = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); int modulerType = -1; int opreationType = -1; modulerType = (int) AnnotationUtils.get().getAnnotationAttr(className, methodName, JournalLog.class, StaticInfo.AOP_LOG_ATTR_NAME1); opreationType = (int) AnnotationUtils.get().getAnnotationAttr(className, methodName, JournalLog.class, StaticInfo.AOP_LOG_ATTR_NAME2); //3.添加日志 if (modulerType!=-1&&opreationType!=-1) //TODO 3.1 从请求获取用户id aspectJournalUtils.addJournalInfo(modulerType,opreationType, 10086); }}
代码链接:https://git.oschina.net/CatalpaFlat/JouranlDemo3.git
阅读全文
0 0
- SpringBoot 使用@Aspect进行日志管理(基于反射代理模式+动态修改注解Log)
- SpringBoot 使用@Aspect进行日志管理(基于反射代理模式+注解Log)
- SpringBoot 使用@Aspect进行日志管理(基于反射代理模式)
- SpringBoot @Aspect注解详情
- Spring_AOP_XML使用Aspect实现动态代理(常用)
- Spring_AOP_XML使用Aspect实现动态代理(常用) .
- Spring_AOP_Annotation使用Aspect实现动态代理
- Spring_AOP_Annotation使用Aspect实现动态代理 .
- 注解、动态代理、反射文章
- SpringBoot动态修改日志级别
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- python中从str中提取元素到list以及将list转换为str
- 【angular】you have to be inside an Angular CLI project in order to use the serve command
- C语言操作符总结
- C# winform 将dataGridView导出到excel
- mybatis中的foreach标签
- SpringBoot 使用@Aspect进行日志管理(基于反射代理模式+动态修改注解Log)
- XAMPP下mysql插入数据中文乱码问题
- android 浏览器 该网站的安全证书有问题
- [随笔] Mac版本SercureCRT安装及破解
- spring配置文件的启用
- List集合导出成Excel表格
- git diff 配置 meld diff
- mysql max 与 where 间的执行问题
- 使用eval("("+data+")")转json格式