• 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);
        }
    }
    
  • 相关阅读:
    lumen简单使用exel组件
    VIM 批量注释的两种方法 (转)
    linux时间校准 设置时间为上海时区
    lumen发送邮件配置
    centos 下安装redis 通过shell脚本
    shell 脚本接收参数
    linux设置系统变量
    linux通配符
    UCCI协议[转]
    一种编程范式:对拍编程
  • 原文地址:https://www.cnblogs.com/lu51211314/p/10375530.html
Copyright © 2020-2023  润新知