9000字通俗易懂的讲解下Java注解,你还看不明白?,你连原理都还没弄明白

这里的@Repository就是一个注解,看这段代码,上面还有注释,我们看到注释,发现都看得明白,但是看到@Repository之后,就不那么明白,这是啥,有啥用?

于是我们查,大概知道,哦,这是个注解,有了这个注解,UserBean就会被装载进Spring容器中,我们可以知道这些信息,但是,它实际上做了哪些事情,是如何起作用,也就是如何把UserBean交给Spring去处理的,这个内部实现,我们不清楚。

但是,我们虽然不清楚,有个东西它清楚,什么呢?就是一个特定的程序,也就是说,有一个专门的程序,当它看到这个UserBean上面有一个@Repository之后,这个程序就知道了,原来要把这个UserBean装载进Spring容器中,于是这个程序员就开始执行一系列的操作区把这个UserBean装载进Spring容器中。

所以,你到此应该明白:

注释是给人看到的,注解是给程序看的。

我们再进一步总结下什么是注解:

在程序中,可以把注解看成一种特殊的标记,一般是用来标记类,方法或者接口等,这些标记有一些特点,比如可以在编译的时候,(javac命令把java源文件编译成字节码文件class),类加载和运行的时候(使用java命令执行字节码文件的时候,类的生命周期开始,从加载到卸载)被读取到(一般是有专门的程序去读区这些注解,利用反射技术去解析注解,然后根据得到的信息做相应的处理)

是的,关于注解,你要知道这么一个知识点了:

对于注解,是有专门的程序去读取它,解析它,然后根据得到的消息去执行相应的操作。

关于这个程序,要看具体的场景,也就是说这个程序是不同的,那么关于这个程序怎么知道读到哪个注解该干嘛,这个还是依靠注解本身的定义,比如@Repository注解被定义成是把被注解的装载进Spring容器中,那么特有的程序获取到这个注解就知道该干什么事了。

到此,你应该知道什么是注解了,当然,是概念上的一些东西,另外,对注解是怎么起作用的,你也应该有点内味了……

注解的简单分类

这个知识点很是轻松愉快,不需要你失去多少脑细胞。

注解是有分类的,一般有三种类型的注解:

  1. 自定义注解(实际很少)
  2. JDK内置注解(@Override检验方法重写)
  3. 框架中的注解

不知道这个能不能理解,就是说,对于注解而言,是有几种不同分类的,首先,我们可以自己写一个注解出来(下面会讲),另外对于JDK本身而言有自己的的注解,我们看个代码,你就知道了:

比如这个,是重写toString方法,上面就有个JDK的内置注解@Override,这个注解就起到一个检验的作用,因为它是Object的方法,你现在要重写它,那么名字啊,参数啊要和之前的一样,不一样,就给你报错,不信你试试:

这个是关于JDK的内置注解,那么最后一个关于框架的注解,我想你只要学过Spring都知道,比如@Controller,熟悉吧,这就是框架中的注解。

注解的本质

经过上面的讲解,我们应该大致了解了什么是注解,以及注解的一些分类,现在,我们对于概念上的注解算是清楚了,但是这个注解本质是个什么呢?

告诉你吧,注解的本质是个接口,为啥,先来看下,如何定义一个注解(下面会详细讲解)

public @interface Main {
}

就这些,就定义了一个注解,不知道你发现了没,这个和接口很像啊,有啥区别,就是多了一个@,不然就是接口啊,接下来我们使用XJad把这个注解反编译一下看看:

看到没,这里的Main直接就是interface定义,然后还继承了Annotation,这个足以说明,注解其实就是接口啊。

这个暂且聊到这,记住即可!

如何定义注解

接下来我们就来聊聊如何去自定义一个注解,我们在上面说过,注解的本质其实就是接口,上面也简单演示了一个注解的定义,如下:

public @interface Main {
}

想一下,我们平常怎么定义一个接口,是不是使用关键字interface,那么类呢?是不是使用class关键字,也就是说啊,定义这些一般都是需要一个关键字来加以声明的,显而易见,定义注解的关键字就是@interface,它和接口的定义就是多了一个@,但是注解的定义却不仅仅是如此!

元注解

这里要引入一个元注解的概念,我们先来想一下,注解我们上面说了,一般可以用来标记类,接口或者方法等,那么这里就有一个问题了,比如我定义了这么一个Main注解:

public @interface Main {
}

那么,我这个注解是不是可以用在类上,也可以用在接口或者方法上?一般类呀,接口啊,方法啊等等它们还是有点差别的,所以对于这些最好有区分,也就是说,有些注解只能标记类,有些注解只能标记方法等,这样一来就需要对注解的作用域去进行限制。

那么这个该怎么搞,答案就是元注解,那什么是元注解呢?

元注解就是标记注解的注解

啥意思,来看下,比如我们定义的这个Main注解,我们规定它只能用来标记方法,那么可以这样做:

我们在上面加了一个注解@Target,后面还有参数(下面会讲),这个参数
ElementType.METHOD就代表我们这个注解是用于注解方法的,来,试一下:

你看,可以用在我们的main方法上,那么是不是不能用于类呢?我们试下:

报错了,看来是不行,所以这个@Target就是一个元注解,可以用来注解注解,也就是标记注解的注解。

关于元注解,一般有以下主要的几个:

  1. @Documented 用于制作文档
  2. @Target 指定注解的使用位置,不指定的话任何位置都可以使用
  3. @Retention(注解的保留策略)

这里单独提一下最后一个也就是声明注解的保留策略@Retention,这个是什么意思呢?

这个保留策略啊,简单来讲就是说你这个注解可以在哪个时间段起作用,这个就得说说我们的代码从写出来,然后编译到执行的主要三个阶段了,画个图就是这样的:

这个我已经画的很清楚了吧,一般来说,我们的注解都是要保留到运行期间的,所以一般就是这样:

当然,具体情况具体对待。

到这里你可能发现,这个注解里面可以有参数?当然是可以的,我这里简单演示下,下面讲到注解的语法的时候你就知道了:

然后再看下使用:

其实还是蛮简单的!

注解的基本使用语法

接下来我们就来看看注解的语法吧,就是注解具体是如何使用的。

对于注解,我们知道了如何去定义它,比如简单定义一个注解:

这很简单,我们继续去看,对于注解还可以定义属性:

虽然这个属性看起来很像方法,但是人家就是属性,注解还是比较特殊的,那么现在我们来使用下这个注解:

这个时候它会报错,告诉我们需要一个value值,其实也好理解,你的注解定义中定义的有一个value属性,那么你在使用的时候就需要把这个属性值给用上,那你说我可不可以不用,可以的,那定义注解属性的时候就需要给属性添加默认值,就是这样:

可以设置成一个空字符串也可以设置成具体的值。除此之外我们还可以设置多个属性值,像这样:

这里就有知识点了,如果你在使用的时候只是给一个属性值赋值,那么在使用的时候可以这样:

那有人可能疑问,我这个hello对应的是value还是name啊,默认对应的都是value,所以这个要牢记。

但是给多个属性值赋值的时候就必须指明具体的属性名称了,就是这样:

PS:通过上面的介绍我们会发现注解一个比较奇怪的地方,就是对于注解而言,我们可以定义属性,但是注解的属性长得真的像方法,但是在注解里面,它就是属性,就可以直接赋值,这里需要注意下!

属性的类型

上面简单介绍了注解的属性,那么这些属性都是可以取哪些类型值呢?大致有如下这么多:

  1. 基本数据类型
  2. String
  3. 枚举
  4. Class
  5. 注解类型
  6. 数组(以上类型的一维数组)

关于数组的看个例子,比如这样:

使用的时候也是同样的道理:

如何真正的理解注解

我们平常对于注解之所以忽视的原因在于,很多地方只需要我们去使用,比如这样:

至于注解是怎么定义的以及注解是怎么起作用的都不太了解,好像需要我们自定义注解的也都很少,所以不去系统化的学习注解的话,会忽略掉注解的很多东西,只会使用,也就是@XXX

那么,从今天开始,我希望你能够记住,对于注解而言,它一定有如下三个流程:

  1. 定义注解
  2. 使用注解
  3. 读取并执行相应流程

下面我们就以@Repository这个注解来看看这三个流程,首先是定义注解,这个我们可以在IDEA中按住Ctrl点进去@Repository来看,是这样的:

](http://www.ithuangqing.vip/wp-content/uploads/2020/07/wp_editor_md_4185e9864c1c7fc41fb1173d6526a9df.jpg)

这个就是@Repository注解的定义,接着我们看看@Repository的使用:

然后就是对注解的读取了,怎么读取呢?很多人对这块是比较模糊的,这也是对注解理解最大的障碍所在。

我们一般就是使用注解,对于注解的定义和读取这块一般都是框架什么的给我们搞定了,我们不看源码一般不知道是怎么回事的,也就不清楚注解到底是怎么运行起来的,简单的理解就是注解需要靠反射去读取,然后做相应的处理。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

[外链图片转存中…(img-5t56W60q-1710868261475)]
[外链图片转存中…(img-MngjIFsv-1710868261475)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-NrXRgWqi-1710868261476)]

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值