参考资料:https://blog.csdn.net/KingBoyWorld/article/details/105337011
https://blog.csdn.net/qq_42843172/article/details/107293408
1.注解是什么?
java注解是一个写在接口、类、属性方法上的一个标签。跟注释不同,能够影响代码。
注解在代码运行时可以被反射读取并进行相应操作,从而影响到正常运行结果。
卧槽,你看 @SpringBootApplication @EnableGlobalMethodSecurity 我在springboot启动里,多加了个注解,已运行就报错,还tm不显示原因。
元数据和注解
什么是元数据?
从java来看,元数据就是用于提供 类、方法、属性 等其他程序元素的额外信息。本身并不属于代码的一部分。
而,注解呢,就是元数据的载体。
我么设置注解,被jvm读取到,根据我们注解的信息,利用反射给我们进行数据修改。
注解和反射
我们知道,jvm不会自动为我们通过反射机制来创建对象,需要我们手写反射API,被他读取到创建。我们拿到class对象,同样也能拿到他的相应注解。
在许多框架中,有个好处,基本都有默认实现。但是我们要去实现某个功能的自定义实现,需要我们去实现或继承他预留的一个接口,通过反射+注解,拿到我们自定义的对象,因为我们遵守了他的预留接口规范,进而调用其中的方法。
举例spring框架:模拟spring利用反射动态创建携带@Compont注解的对象_帅气的黑猫杰克的博客-CSDN博客
2.为什么要使用注解?
xml也是一种元数据,本身并不属于代码的一部分,但是呢?却能够影响我们代码。spring通过读取配置文件中的信息,再利用反射创建需要控制反转的对象。
缺点:整个项目的配置信息都写在这个配置文件里,是集中式配置,但是文件多了,变得很复杂。
现在,提倡解耦(比如:一个类和一个类的,关系小),而注解呢是分布式配置,满足这个需求。
3.注解的作用
我们在使用一些框架是,用注解用的比较多。
开发者的视角可以解读出这个类/方法/属性的作用以及该怎么使用,而从框架的视角则可以解析注解本身和其属性实现各种功能,编译器的角度则可以进行一些预检查(@Override)和抑制警告(@SuppressWarnings)等
- 作为特定标记,用于告诉编译器一些信息
- 编译时动态处理,如动态生成代码
- 运行时动态处理,作为额外信息的载体,如获取注解信息
4.注解的分类
元注解 : java内置的注解,标明该注解的使用范围、生命周期等。
标准注解 : Java提供的基础注解,标明过期的元素/标明是复写父类方法的方法/标明抑制警告。
第三方注解 : 第三方定义的注解,含义和功能由第三方来定义和实现。
4.1元注解
用于定义注解的注解,通常用于注解的定义上,标明该注解的使用范围、生效范围等。元XX 都代表最基本最原始的东西,因此,元注解就是最基本不可分解的注解,我们不能去改变它只能使用它来定义自定义的注解。
一般包括这5种,
@Retention、@Target、@Documented、@Inherited、@Repeatable,其中最常用的是@Retention和@Target下面分别介绍一下这五种元注解。
太多了,我截取关键的部分 。
1. @Retention
注释自定义注解要保留下面那个时期。
java代码到运行的周期 : 源文件 - Class - 运行时数据
一共3个值,SOURCE - CLASS - RUNTIME
如:以下代码,他能保留到运行时。
@Target({ElementType.TYPE}) // 声明自定义注解注解类型
@Retention(RetentionPolicy.RUNTIME) // 保留声明周期
public @interface MyAnnotation {
}
2.@Target
就是,定义注解能用在java那些元素上,类....,field、method、package、方法参数等等。
我的理解是反射能拿到,他都能拿到。
3.@Inherited
表明自定义注解是否能被继承。
4.@Repeatable
这个就是可重复性使用了,
@Repeatable(MyAnnotations.class) // 引用存放你重复使用的容器
5.@Documented
是否在生成的JavaDoc文档中体现,被标注该注解后,生成的javadoc中,会包含该注解,这里就不做演示了。
4.2 标准注解
java内置的注解,只不过是在元注解的基础上开发的。
不只有这三个,看一下即可。
剩下的,涉及很多底层原理,对于我的使用状况,现阶段搞清楚框架是如何通过反射注解拿到我的自定义对象即可。