初步带你了解注解
简介
我是2020年的一名应届毕业生,这是我踏出校园的第一份工作。进入公司的第22天,我将在博客上记录我在公司里成长,请各位技术博主多指教。
进入正题
我将从以下几个简单的方面介绍一下spring boot注解:
spring boot底层技术介绍
了解注解前,我们需要知道在spring boot使用到的底层技术主要:
- 1.反射 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
- 2.注解 一种代码级别的说明,它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
- 3.java配置 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置,他的实现主要依赖于2个注解:
- 1.@Configuration 声明当前类是一个配置类,相当于spring配置的xml文件
- 2.@Bean注解在方法上,声明当前方法返回值为一个Bean
为什么要使用注解,有什么好处?
- 1.易读易懂
- 2.注解代替xml配置
- 3.代码简洁,条理清晰
jdk中常见的注解
注解 | 作用 |
---|---|
@Override | 重写 |
@Deprecated | 过时 |
@SuppressWarnings | 去掉警告 |
- @Override 重写父类方法
- @Deprecated 写在类上
- @SuppressWarnings 注解 可以加在类上也可以加在方法上,加在类上全类里忽略警告,加在方法上,忽略该方法警告
注解的作用域
- 源码注解(SOURCE)只在源码中显示,编译时丢弃(了解)
- 编译时注解(CLASS)编译时会记录到.class文件中,运行时丢弃(了解)
- 运行时注解(RUNTIME)运行时存在,可通过反射解析(重点)
自定义注解
- 元注解(注解的注解)
- 使用自定义注解
- 反射解析注解
了解注解
- 元注解:可以注解(动词)到注解(名词)上的注解(名词)就叫元注解,也就是说元注解的@Target必然有一个值是 ANNOTATION_TYPE
- @Target注解表示该注解能加到哪些属性上
- @Retention表示该注解的作用域
- @Inherited表示允许子类继承
- @Documented表示生成javadoc时会包含该类
- 定义注解用@interface关键字
- 里面的字段用 类型 名字();格式定义
- 一般我们会给字段一个默认值,格式为:类型 名字()default 默认值;
- 注解有一个比较特殊的字段名叫 value(); 如果注解只有一个字段,那么这个字段建议使用value(),如果使用注解时,没有指明字段名,那么默认的就是给value()赋值
反射解析注解
- 使用反射可以解析运行时注解,根据解析的结果来确定程序的功能,其作用与解析XML没有区别
- 要求掌握类、字段、和方法上面的注解
- 1.解析类上面的注解
/*
* 解析类上面的注解
* 1.先通过反射获得该类
* 2.判断该类上是否有指定注解类
* 3.如果有该注解,那么就获得该注解
* 4.获得注解里面字段的值
*/
@Test
@SuppressWarnings({ "unchecked", "rawtypes" })
public void analyticalType() throws ClassNotFoundException {
Class class1 = Class.forName("com.fs.pojo.Book");
boolean flag = class1.isAnnotationPresent(Introduce.class);
if (flag) {
Introduce introduce = (Introduce) class1.getAnnotation(Introduce.class);
String author = introduce.author();
String description = introduce.description();
int value = introduce.value();
System.out.println("author:" + author + ",decription:" + description + ",value:" + value);
}
}
- 2.解析方法上的注解
/*
* 解析方法上的注解
* 1.先通过反射获得该类
* 2.再通过反射获得该类的方法
* 3.判断该上方法是否有指定注解
* 4.如果有注解,那么获得该方法上的注解
* 5.解析获得该注解字段属性
*
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void analyticalMethod() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
Class class1 = Class.forName("com.fs.pojo.Book");
Method method = class1.getMethod("show");
boolean flag = method.isAnnotationPresent(Introduce.class);
if (flag) {
Introduce introduce = (Introduce) method.getAnnotation(Introduce.class);
String author = introduce.author();
String description = introduce.description();
int value = introduce.value();
System.out.println("author:" + author + ",decription:" + description + ",value:" + value);
}
}
- 3.解析字段上的注解,方式与解析方法一致,关键字:Field,建议学生自己写
/*
* 解析方法上的注解
* 1.先通过反射获得该类
* 2.再通过反射获得该类的字段
* 3.判断该字段上是否有指定注解
* 4.如果有注解,那么获得该字段上的注解
* 5.解析获得该注解字段属性
*/
@Test
@SuppressWarnings("rawtypes")
public void analyticalField() throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Class class1 = Class.forName("com.fs.pojo.Book");
Field field = class1.getField("name");
boolean flag = field.isAnnotationPresent(Introduce.class);
if (flag) {
Introduce introduce = (Introduce) field.getAnnotation(Introduce.class);
String author = introduce.author();
String description = introduce.description();
int value = introduce.value();
System.out.println("author:" + author + ",decription:" + description + ",value:" + value);
}
}
只有一个成员的注解,强烈建议字段设置为value(),虽然设置为其他好像也没错。
加了@Inherited元注解的注解,允许子类继承其注解
- 我们在Book类上加了注解,并设置了值
- 我们再创建一个JavaBook类来继承Book类,没写任何东西
- 解析JavaBook类上的注解,发现也存在注解并且值和其父类Book类一致
public class AnalyticalInherited {
@Test
public void analyticalInherited() throws ClassNotFoundException {
Class class1 = Class.forName("com.fs.pojo.JavaBook");
boolean flag = class1.isAnnotationPresent(Introduce.class);
if (flag) {
Introduce introduce = (Introduce) class1.getAnnotation(Introduce.class);
String author = introduce.author();
String description = introduce.description();
int value = introduce.value();
System.out.println("author:" + author + ",decription:" + description + ",value:" + value);
}
}
}
如何生成API文档
-
选中项目–>project–>Generate javadoc–>然后看图![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZRdmY1w-1592904325730)(B11B892D38F6415F842F36264565E8FC)]–>Document Title取个名字–>finish
-
生成的API
这篇文章借助资料来练一下手,有什么问题请联系我。