自定义注解,实现业务处理
这是我的学习笔记,只做记录
前言:
由于工作需要,这里也是根据场景来贴的代码。
在工作中除了网关需要做鉴权等,在一些提供对外的接口中也是需要做处理的,在每个接口上都进行鉴权等操作会引起代码可读性不高和效率低下的问题。这时可以采用注解方式!
目录
- 注解概念
- 元注解
- @Target
- @Retention
- @Documented
- @Inherited
- 自定义注解
- AOP实现业务
注解概念
简单的几个字,简化配置,通过反射得到注解,再决定怎么去运行类。网上解释的很多,可以看看
元注解
@Target
用来定义注解的使用范围,可以对哪些起作用
public enum ElementType {/** 接口、类、枚举、注解 */TYPE,/** 字段、枚举的常量 */FIELD,/** 方法 */METHOD,/** 方法参数 */PARAMETER,/** 构造函数 */CONSTRUCTOR,/** 局部变量 */LOCAL_VARIABLE,/** 注解 */ANNOTATION_TYPE,/** 包 */PACKAGE,/*** 用来标注类型参数,JDK8新增*/TYPE_PARAMETER,/*** 能标注任何类型名称,JDK8新增*/TYPE_USE
}
@Retention
作用是:描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。也就是存活时间
Reteniton注解用来限定那些被它所注解的注解类在注解到其他类上以后,可被保留到何时,一共有三种策略,定义在RetentionPolicy枚举中
public enum RetentionPolicy {/*** 源文件保留*/SOURCE,/*** 注解将由编译器记录在类文件中,但不需要由VM在运行时保留。这是默认行为。*/CLASS,/*** 注释由编译器记录在类文件中,并由VM在运行时保留,因此它们可以被逐个读取。*/RUNTIME
}
@Documented
将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited
作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
自定义注解
这里也就直接上代码了
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @Description: 校验签名
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SignApp {String id() default "";
}
AOP实现业务
定义好注解后,使用AOP切点切到注解所在包
/*** @ClassName SignAppAspect* @Description: 校验签名**/
@Aspect
@Component
@Order(2)
public class SignAppAspect {// 依赖所需要的类@Autowiredprivate AppInfoMapper appInfoMapper;// 切入点@Pointcut("@annotation(com.sasa.wallet.apitrade.aspect.SignApp)")private void SignAppAspect() {}/*** @MethodName: around* @Description: before通知,在自定义注解所描述的方法前执行任务* @Param: [joinPoint]* @Return: void**/@Before("SignAppAspect()")public void around(JoinPoint joinPoint) throws Throwable {// 从上下文中拿到requestHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String methodPath = request.getServletPath();// 支持GET和POSTObject[] args = joinPoint.getArgs();// 对于参数为JSON类型的JSONObject paramObject = (JSONObject) JSONObject.toJSON(args[0]);// 获取所需要的参数进行业务校验String appId = paramObject.getString("appId");String openId = paramObject.getString("openId");String sign = paramObject.getString("sign");String signType = paramObject.getString("signType");if(StringUtils.isBlank(appId)) {throw new RuntimeException("appId Can't be empty.");}if(StringUtils.isBlank(openId)) {throw new RuntimeException("openId Can't be empty.");}if(StringUtils.isBlank(sign)) {throw new RuntimeException("sign Can't be empty.");}AppInfo appInfo = appInfoMapper.getByAppIdAndOpenId(appId,openId);if(appInfo == null) {throw new RuntimeException("appId invalid.");}String valSign = SignUtils.createSign(paramObject,appInfo.getAppPrivatekey(),signType);if(!StringUtils.equals(sign,valSign)) {throw new RuntimeException("sign error.");}}
}
PS: 这篇文章是给自己记录的,东西杂容易混淆。没太多时间写的不够详细,以后会补充!
自定义注解,实现业务处理相关推荐
- 自定义注解实现业务分发
有时候,在我们的项目中,一个请求中会包含很多种情况.我们需要根据一个字段不同的状态去走不同的逻辑.如果用我们的正常逻辑写,就会产生很多的if else判断,使得代码的可读性和维护性降低. 比如我们有一 ...
- Jackson 通过自定义注解来控制json key的格式
Jackson 通过自定义注解来控制json key的格式 最近我这边有一个需求就是需要把Bean中的某一些特殊字段的值进行替换.而这个替换过程是需要依赖一个第三方的dubbo服务的.为了使得这个转换 ...
- java 自定义注解_两步实现Java自定义注解
什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...
- java注释跳转方法,Java自定义注解实现Router跳转
简介 Android项目架构中,随着业务的复杂越来越大,模块化/组件化是必须的.对于Activity之间的跳转希望通过注解自动实现,模仿ARouter做法,实现简单路由组件. 思路 创建注解lib模块 ...
- 如何利用自定义注解放行 Spring Security 项目的接口
在实际项目中使用到了springsecurity作为安全框架,我们会遇到需要放行一些接口,使其能匿名访问的业务需求.但是每当需要当需要放行时,都需要在security的配置类中进行修改,感觉非常的不优 ...
- 自定义注解-aop实现日志记录
关于注解,平时接触的可不少,像是 @Controller.@Service.@Autowried 等等,不知道你是否有过这种疑惑,使用 @Service 注解的类成为我们的业务类,使用 @Contro ...
- java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用
Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...
- Spring 自定义注解玩法大全,从入门到…
在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...
- 干货,springboot自定义注解实现分布式锁详解
背景 在互联网的很多场景下,会产生资源竞争,如果是单机环境,简单加个锁就能解决问题:但是在集群环境下(分布式环境),多个客户端在一个很短的时间内竞争同一服务端资源(如抢购场景),或者同一客户端重复提交 ...
最新文章
- 大年初三,过年期间最让你受不了的习俗有哪些?
- Lansys PV 1.2 1CD(化工容器强度计算软件)
- 循环数组最大子段和--51nod1050
- 词法分析器java语言_Java语言词法分析器
- ZZULIOJ1026
- 可以说是比较浅显易懂的区块链解释了
- tippy.js_Tippy.js的指令包装
- HTML吸引人眼球的网页,这8个神奇的HTML5文字特效让你的网页抓人眼球
- Zint 库:Zint库的编译及使用(二维码QrCode生码),MFC/VC使用实例
- 浙大计算机系课本,浙大计算机系毕业的一个理工男 找遍西湖边所有亭子写成了书...
- 如何用ppt做自我介绍
- gromacs 安装_安装gromacs的一些心得
- 渗透中超全的Google hack语法
- 宏基掠夺者圣盾5000、圣盾3000 评测
- mmo游戏服务器性能指标,关于performance:厚积薄发MMORPG手游合理的性能参数
- 新职业人才缺口近千万,90后最担心失业;字节跳动回应TikTok被收购传闻;Twitter公布账号劫持事故细节 | EA周报...
- 面向对象基础案例(2)
- 前端开发实习生-实习日志
- 2017下半年掘金日报优质文章合集:iOS篇
- 利用html制作网页的小结,HTML_CSS制作网页的一些经验分享,CSS制作网页总结的一些经验
1: - phpStudy...
热门文章
- 用伪分布式处理爬取下来的数据并用flume监听hive分析,sqoop传入MySQL并可视化
- 后台和用户跟踪要点_联系人跟踪应用程序的一些基本要点
- switch里面,一开头就放default是什么意思
- RAS - Reliability, Availability and Serviceability
- ZCMU 1919: kirito's 星爆气流斩(多重背包+二进制优化)
- IMX6Q安卓解开温度墙,设置高性能模式
- python爬取网站大数据_基于腾讯位置大数据平台的全球移动定位数据获取(Python爬取)...
- 石油大学华东matlab王海燕,中石大获2019全国三维数字化创新设计大赛年度总决赛二等奖...
- 深信服售前产品经理面试准备材料(更新ing)
- 6.Paper小结——《A Privacy-Preserving and Verifiable FederatedLearning Scheme》