1、注解的示例为在方法入参上加后缀

注解代码示例:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WoToken {
String value() default "好人";
}

注解解析代码示例:

@Component
@Aspect
public class HelloAspect {
// 将此类的解析指向注解
@Pointcut("@annotation(com.annotation.annotationImpl.WoToken)")
private void cut() {
//切点
}
@Around("cut()&&@annotation(woToken)")
public Object advice(ProceedingJoinPoint joinPoint, WoToken woToken) throws Throwable {
// 获取连接点方法运行时的入参列表
Object[] args = joinPoint.getArgs();
for (int i= 0;i<args.length;i++) {
String argValue = (String) args[i];
String s = argValue + woToken.value();
args[i] = s;
}
//执行
Object proceed = joinPoint.proceed(args);
return proceed;
} }

代码示例:https://github.com/Pinshuducha/annotation

参考:https://blog.csdn.net/message_lx/article/details/77652260

参考代码:

@Aspect
@Component
@Order(500)
public class DecryptParamInterceptor {
public static final Log logger = LogFactory.getLog(DecryptParamInterceptor.class); @Pointcut("@annotation(com.haiercash.common.util.annotation.DecryptParam)")
private void decryptParamCut() {
//切点
} @Around(value = "decryptParamCut()")
public Object dectyptParam(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
if (method == null) {
return joinPoint.proceed();
}
DecryptParam annotation = methodSignature.getMethod().getAnnotation(DecryptParam.class);
if (annotation.value().length == 0) {
return joinPoint.proceed();
} String[] decryptParams = annotation.value();
List<String> decryptParamsList = Arrays.asList(decryptParams); MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String[] parameterNames = signature.getParameterNames();
Object[] args = joinPoint.getArgs();
boolean isSimpleArg = false; for(int i = 0; i < args.length; i++) {
if (decryptParamsList.contains(parameterNames[i]) && args[i] instanceof String) {
String argValue = (String) args[i];
String decryptValue = EncryptUtil.simpleDecrypt(argValue);
args[i] = decryptValue;
logger.info(String.format("参数【%s】原值【%s】解密为【%s】", parameterNames[i], argValue, decryptValue));
isSimpleArg = true;
}
}
if (isSimpleArg) {
return joinPoint.proceed(args);
} // 复杂参数,只对第一个对象做处理
for(int i = 0; i < args.length; i++) {
if (args[i] == null) {
continue;
}
Map<String, Object> map = BeanUtils.beanToMap(args[i]);
decryptParamsList.stream().filter(decryptParam -> !StringUtils.isEmpty(map.get(decryptParam)) && map.get(decryptParam) instanceof String)
.forEach(decryptParam -> {
String argValue = (String) map.get(decryptParam);
String decryptValue = EncryptUtil.simpleDecrypt(argValue);
map.put(decryptParam, decryptValue);
logger.info(String.format("参数【%s】原值【%s】解密为【%s】", decryptParam, argValue, decryptValue));
}); Class<?> aClass = args[i].getClass();
args[i] = BeanUtils.mapToBean(map, aClass);
}
return joinPoint.proceed(args);
}
}

Spring的自定义注解简单实现的更多相关文章

  1. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  2. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  3. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  4. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  5. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  6. Spring AOP 自定义注解实现统一日志管理

    一.AOP的基本概念: AOP,面向切面编程,常用于日志,事务,权限等业务处理.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程 ...

  7. 使用Spring Aop自定义注解实现自动记录日志

    百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为sprin ...

  8. day05 Spring中自定义注解的用处-之获取自定义的Servie

    PS: 在RPC远程调用中,想要获取自定义的service的方法,就得自定义标签遍历拿到方法 PS:在spring中,两个最核心的 概念是aop和ioc,aop其实就是动态代理. ioc 就是解决对象 ...

  9. 结合spring 实现自定义注解

    注解类 import java.lang.annotation.*; /** * Created by Administrator on 2016/6/28. */ //ElementType.MET ...

随机推荐

  1. Centos7 下修改日期

    Centos7 下修改日期 2017年11月19日 19:37:47 harris135 阅读数:2851    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  2. Mysql保留字列表

      Mysql保留字列表.吠品整理. 尝试使用一个识别符,例如使用嵌入式MySQL 数据类型或函数名作为表名或列名,例如TIMESTAMP 或GROUP,会造成一个常见问题.允许你这样操作( 例如,A ...

  3. 基础数据类型补充 set集合 深浅拷贝

    一.基础数据类型补充 1. "拼接字符串".join(可迭代对象) 可迭代对象为列表时,输出列表元素与拼接字符串的拼接 li = ['张三', '李四', '王五', '赵四'] ...

  4. STM32之glossary

    glossary Word: data/instruction of 32-bit length. Half word: data/instruction of 16-bit length. Byte ...

  5. hive 总结四(优化)

    本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 表的优化 小表join大表.大表join小表 将key相对分散,并且数据量小的表放在join的左边 ...

  6. 一个上午,勉强记住了几种不同语言编译PE的启动函数

    VC:启动函数最乱,三大函数都在后面.前面8个PUSH DELPHI7:启动函数最整洁,2.3.4.2,形式排队 VB:启动函数最好记,12个0.... 汇编:三大函数距离最紧凑,除VB外,启动函数最 ...

  7. 7款外观迷人的HTML5/CSS3 3D特效按钮特效

    下面我整理了7款外观都十分迷人的HTML5/CSS3 3D按钮特效,有几个还挺实用的,分享给大家. 1.CSS3超酷3D弹性按钮 按钮实现非常简单 之前我们分享过几款不错的CSS3 3D立体按钮,比如 ...

  8. Linq学习笔记(第一部分)

    本文分享自lliulun的30分钟linq教程,地址:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 一:与LINQ有关的语 ...

  9. minutia cylinder code MCC lSSR 匹配算法

    图一 是LSS匹配算法, 图二是LSSR 匹配算法,数据采用MCC SDK自带的十个人的数据.LSS EER6.0%左右,LSSR EER 0%

  10. 初探Remax微信小程序

    1.创建项目 npx degit remaxjs/template-wechat my-app cd my-app && npm install 2.运行项目 npm run dev ...