在java中注解的使用频率相当之高,加上spring boot 的兴起和广泛应用,当然还有单元测试,注解已经成为程序员每日工作必会接触之物。在阅读过一些原始资料和实际编码体验后,我决定从如下几点和大家分享我对注解的理解和实际应用。
1、什么是注解
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
---摘自Thinking in java
这个定义中的一些信息可以让我们对注解有所窥视。
1.1、它是元数据
元数据指的是,描述数据的数据。所以注解就是用来描述代码的代码。
1.1.1、为么什么需要描述代码?
注解在一定程度上是在 (把元数据与源代码文件结合在一起而不是保存在外部文档) 这一大趋势下所催生的。它是从java SE5 引入的。它可以提供完整描述程序所需要的信息,而这些信息是无法用java描述的。他的优点大致如下包括更加干净易读的代码以及编译期类型检查等。
1.1.2、 如何做到描述代码?
参照元注解相关内容。
1.2、形式化的
注解语法很简单,除了使用@开头,它基本与java基础语法一致。且大多数时候我们通过注解名称就可以简单了解到注解所做的事情,比如@Test,@Override,@Bean 等等。这种极具辨识度的形式化便是注解的特色和优点所在,也是程序员爱不释手的原因。
1.3、某个时刻
为什么是某个时刻,这要从注解的原理讲起。我们知道java文件是存在如下状态的。
实际上注解的工作便是在这三个时期对java源代码进行描述,具体参开元注解内容。
1.4、方便地使用
我们可以通过AnnotatedElement接口下的getAnnotation()方法分别获取,类,方法,字段上所声明的注解,因为Class、Method、Filed类都实现了这个接口。当然它还包含其他方法:
2、java中的内置注解和元注解
java SE5依赖提供了三种内置注解,
和四种元注解,元注解就是构成注解的注解,
3、如何自定义注解
如图所示,我们可以很简单的定义注解,根据元注解的含义适当的搭配。然后我们就可以使用自定义注解去描述我们的代码。
4、常用注解解析
接下来,我们通过解析几个常用注解来加深对注解的理解和使用。
4.1、@Autowried
可以看到这个注解的使用范围包含构造器,方法,字段,参数,和注解类型。另外它的retention时runtime,说明vm会保留它,这是必然的,因为我们可以看到它内部的requeried字段将会在spring 注入该对象时起到决定性作用。这也就是面试中最常问的,autowired注解所在的bean如果不存在spring容器启动时会不会报错。答案是会,因为它的默认值是true。当然具体这个字段如何实现的功能,需要参考响应的beanPostProcessor阅读spring源码。
另外,我们可以看到Autowired是属于springframework 的
4.2、@Resource
首先它的范围相比较Autowired有所降低,并且它不属于springframework而是属于J2EE的注解。其中内置的方法受篇幅有限 没有全部截图。但是值得注意的是,字段name,这就是面试经常问的,autowired和resource的另一个区别,一个是byType 一个是beName注入。
所以不难看出这种功能性的注解,大多通过自身的属性去定义一些参数,在结合spring容器从而做到对java code 的优雅描述,当然还有一些纯注释性的注解。
总结:注解是java引入的一项非常受欢迎的补充。它提供了一种结构化的,并且具有类型检查能力的新途径,从而使得程序员能够轻易为代码加入元数据的同时,也不会导致代码杂乱且难以阅读。