Spring的自定义注解简单实现
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的自定义注解简单实现的更多相关文章
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- spring AOP自定义注解方式实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- spring AOP自定义注解 实现日志管理
今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- Spring aop+自定义注解统一记录用户行为日志
写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...
- Spring AOP 自定义注解实现统一日志管理
一.AOP的基本概念: AOP,面向切面编程,常用于日志,事务,权限等业务处理.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程 ...
- 使用Spring Aop自定义注解实现自动记录日志
百度加自己琢磨,以下亲测有效,所以写下来记录,也方便自己回顾浏览加深印象之类,有什么问题可以评论一起解决,不完整之处也请大佬指正,一起进步哈哈(1)首先配置文件: <!-- 声明自动为sprin ...
- day05 Spring中自定义注解的用处-之获取自定义的Servie
PS: 在RPC远程调用中,想要获取自定义的service的方法,就得自定义标签遍历拿到方法 PS:在spring中,两个最核心的 概念是aop和ioc,aop其实就是动态代理. ioc 就是解决对象 ...
- 结合spring 实现自定义注解
注解类 import java.lang.annotation.*; /** * Created by Administrator on 2016/6/28. */ //ElementType.MET ...
随机推荐
- SpringBatch批处理框架:入门项目
1.项目结构如下:
- Java基本语法.part02
变量 变量的概念: 内存中的一个存储区域 该区域有自己的名称(变量名)和类型(数据类型) Java中每个变量必须先声明,后使用 该区域的数据可以在同一类型范围内不断变化 使用变量注意: 变量的作用域: ...
- thinkphp 模板继承
模板继承是一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区 ...
- 17个方法防止dedeCMS织梦网站被黑挂木马
dede织梦cms系统的程序存在漏洞,黑客攻击方法层出不穷,导致网站经常被黑,被百度安全中心等拦截,影响排名和流量,让站长非常头疼,下面总结一些防止dede织梦cms系统被攻击设置的方法,可有效的防止 ...
- ajax跨域获取网站json数据
由于自己的公司的项目需要调用视频地址 1:当为链接时:直接在播放器用数据库查找的地址 2:当为外部链接时:直接用window.location.href('数据库查找的地址') 3:当为H5链接时:使 ...
- 牛客多校第四场 A meeting 树的半径
题意: 有一棵树,树上有许多人,他们要聚会,找一个点使得所有人到这个点的距离的最大值最小. 题解: 首先,以一个有人的点为根,求一个生成树,删掉所有没有人的子树,保证所有的悬挂点(只连接一条边的点)都 ...
- 国内外自然语言处理(NLP)研究组
国内外自然语言处理(NLP)研究组 *博客地址 http://blog.csdn.net/wangxinginnlp/article/details/44890553 *排名不分先后.收集不全,欢迎 ...
- java.sql.SQLSyntaxErrorException: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 BINARY
2019-07-24 17:24:35 下午 [Thread: http-8080-4][ Class:net.sf.ehcache.store.disk.Segment Method: net.sf ...
- Python sort()函数和sorted()
1.原址排序 1)列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. truple无组报错: 2.副本排序 1)[:]分片方法 注意: ...
- vue项目打包后资源相对引用路径的和背景图片路径问题
vue项目中若要使用相对路径来获得相应静态资源,需要修改以下内容来确保项目打包后能正常运行. 1.修改config => index.js => build => assetsPub ...