想自己写框架?不会写Java注解可不行
用注解一时爽,一直用一直爽
Java后端开发进入spring全家桶时代后,开发一个微服务提供简单的增删改查接口跟玩泥巴似的非常简单,一顿操作猛如虎,回头一看代码加了一堆注解:@Controller @Autowired @Value,面向注解编程变成了大家不可缺少的操作。
想象一下如果没有注解Java程序员可以要哭瞎😭
既然注解(annotation)这么重要,用的这么爽,那注解的实现原理你知道么?我猜你只会用注解不会自己写注解(手动滑稽)。
好了,下面的内容带大家从零开始写一个注解,揭开注解神秘的面纱。
原来注解不神秘
注解用大白话来说就是一个标记或者说是特殊的注释,如果没有解析这些标记的操作那它啥也不是。
注解的格式如同类或者方法一样有自己特殊的语法,这个语法下文会详细介绍。
那如何去解析注解呢?这就要用到Java强大的反射功能了。反射大家应该都用过,可以通过类对象获取到这个类的各种信息比如成员变量、方法等,那注解标记能不能通过反射获取呢?当然可以了。
所以注解的原理其实很简单,本质上是通过反射功能动态获取注解标记,然后按照不同的注解执行不同的操作,比如@Autowired可以注入一个对象给变量赋值。
看到这里是不是很躁动啊,来吧自己也撸一个注解。
造火箭啦,自己动手写一个注解
便于大家理解,这里先引入一个场景:在线教育火了,经理让我写一个模块实现学生信息管理功能,考虑到分布式并发问题,经理让我务必加上分布式锁。
经理问我几天能搞定?我说至少3天。如是脑补了以下代码:
经理走后我在思考,我能不能只花一天时间写完,剩下两天时间用来写博客划水呢?突然灵感来了,我可以把重复的代码逻辑抽出来用注解实现不就节省代码了,哈哈,赶紧写。
使用注解之后整个方法清爽了很多,HR小姐姐都夸我写的好呢。
代码已经写完上库了,现在我在划水写博客呢。是不是很简洁很优雅很牛逼,怎么做到的呢,主要分为三步:1打开冰箱门,2把大象放进去,3把冰箱门关好。好了,扯远了,大家接着往下看。
第一步定义一个注解
一个注解可以简单拆解为三个部分:
第一部分:注解体
注解的定义有点类似于接口(interface),只不过前面一个加了一个@符号,这个千万不能省。
第二部分:注解变量
注解变量的语法有点类似于接口里面定义的方法,变量名后面带一对括号,不同的是注解变量后面可以有默认值。另外返回值只能是Java基本类型、String类型或者枚举类,不可以是对象类型。
第三部分:元注解
元注解(meta-annotation)说白了就是给注解加注解的注解,是不是有点晕了,这种注解是JDK提前内置好的,可以直接拿来用的。不太懂也没有关系反正数量也不多,总共就4个,我们背下来吧:@Target @Retention @Documented @Inherited
-
Target注解
用来描述注解的使用范围,即被修饰的注解可以用在什么地方 。
注解可以用于修饰 packages、types(类、接口、枚举、注解类)、类成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数),在定义注解类时使用了@Target 能够更加清晰的知道它能够被用来修饰哪些对象,具体的取值范围定义在ElementType.java 枚举类中。
比如上面我们写的Redis锁的注解就只能用于方法上了。
-
Retention注解
用来描述注解保留的时间范围,即注解的生命周期。在 RetentionPolicy 枚举类中定义了三个周期:
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息
}
像我们熟知的@Override注解就只能保留在源文件中,代码编译后注解就消失了。比如上面我们写的Redis锁的注解就保留到了运行期,运行的时候可以通过反射获取信息。
-
Documented注解
用来描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息,很简单不多解释了。
-
Inherited注解
被Inherited注解修饰的注解具有继承性,如果父类使用了被@Inherited修饰的注解,则其子类将自动继承该注解。
好了,这一步我们已经将注解定义好了,但是这个注解如何工作呢?接着看。
第二步实现注解的业务逻辑
在第一步中我们发现定义的注解(@EnableRedisLock)中没有业务逻辑,只有一些变量,别忘了我们的注解是要使能Redis分布式锁的功能,那这个注解到底是怎么实现加锁和释放锁的功能呢?这个就需要我们借助反射的强大功能了。
这里借助了切面的功能,将EnableRedisLock注解作为一个切点,只要方法上标注了这个注解就会自动执行这里的代码逻辑。
通过反射机制拿到注解对象后就可以执行加锁解锁的常用逻辑啦。Redis实现分布式锁相信大家已经很熟悉了,这里就不在啰嗦了。
第三步在业务代码中尽情的使用注解
@EnableRedisLock(lockKey = "student", expireTime = 10, timeUnit = TimeUnit.SECONDS, retryTimes = 5)
public void method1(Student student) {
// 这里写业务逻辑
}
在需要加锁的方法上直接加上注解就可以啦,怎么样是不是很简单呀,赶紧在你的项目中运用起来吧。
好了,自己写一个注解的内容就介绍到这里了,学会了吗?
- END -
热门推荐(点击可阅读):
作者简介:
博主从华中科技大学硕士毕业,是一个对技术有追求,对生活有激情的程序员。几年间浪迹于多个一线互联网大厂,具有多年开发实战经验,如果你热爱技术或者你也不满足现状喜欢搞事情,那你不妨关注我,让我们一路同行,一起分享技术干货、交流面试技巧,吐槽职场故事。我有故事和酒,你来吗?
如果你们点个“在看”雷架会兴奋一晚上睡不着~
学会了注解可以开始自己造轮子了~
本文分享自微信公众号 - 爱笑的架构师(DancingOnYourCode)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
回顾 Kotlin 1.4 的全新语言特性和更多改进
发布人:开发技术推广工程师 Wojtek Kaliciński 来自开发者社区的热情与积极采用推动了 Kotlin 成为 Android 开发的 首选语言 (Kotlin-first)。随着 Kotlin 不断发展,JetBrains(Kotlin 的创建者)、开源社区以及 Google 团队也将持续投入更多的资源和精力。 我们很高兴与大家分享 Kotlin 1.4 版本,这将是 Kotlin 发展的下一个里程碑,包含新的语言特性、改进的编译器和工具。以下是此版本中部分振奋人心的新特性的简要概述。您可以在 JetBrains 官方博客 中阅读有关 Kotlin 1.4 的更多信息。 新语言特性 Kotlin 1.4 中引入的新语言特性改善了编写 Kotlin 代码的 "人机工程学",例如: Kotlin 接口的 SAM 转换 过去,只有 Java 编程语言中定义的功能接口(即只有一个单一抽象方法 - SAM)受益于 Kotlin 中的速记语法: executor.execute { println("This is shorthand for passing in a Runnable...
- 下一篇
AI狂欢日到来!WAVE SUMMIT+2020深度学习开发者峰会报名启动
怎样的冬日,才是最美好的呢?白居易说:“绿蚁新醅酒,红泥小火炉”。而对于开发者来讲,自然便是“WAVE SUMMIT+,狂欢与AI”。 没错,就在 12月20日 ,属于所有AI开发者的狂欢日!WAVE SUMMIT+2020深度学习开发者峰会盛大开启!让我们再次相约,嗨翻岁末~ 此次大会由深度学习技术及应用国家工程实验室与百度联合主办,既有前沿技术解析与产业落地的干货,也有美酒和音乐的派对狂欢。同时,百度开源深度学习平台飞桨也会在这次大会上带来重磅更新,新老朋友们千万不要错过! 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu 议程前瞻:一场AI界的真正狂欢 聚焦产业共进、人才共育、开源共建,本次《WAVE SUMMIT+2020深度学习开发者峰会》将于 12...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装