【Tomcat】第三站:注解
目录
1. 什么是注解
1.1 注解的作用
1.2 注解的格式
1.3 注解在哪里使用
2. 注解的类型
(1).内置注解
(2).元注解
(3).自定义注解
3. 注解实现
4. 与Tomcat的联系
引入
消息打过来的流程
1. 什么是注解
1.1 注解的作用
1> 注解一般用于对程序的说明,就像注释一样,但是区别是注释是给人看的,但是注解是给程序看的。
2> 让编译器进行编译检查的作用,比如下边这个@Override注解是重写的意思,子类重写了父类的方法,但是改动了方法名,所以报错。
1.2 注解的格式
注解是以“@注释名”在代码当中存在的,还可以添加一些参数值,例如 @SuppressWarnings(value = "unchecked")。
1.3 注解在哪里使用
可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息。我们可以通过反射的方式对这些注解进行访问。
2. 注解的类型
!! 一定要明白: 注解是给程序看的
一般常用的注解分为三类:
(1).内置注解
$1. @Override:修辞方法的,表示一个方法重写了父类方法。
$2. @Deprecated:修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。通俗来说就是遗弃。
$3. @SuppressWarnings:用来抑制编译时的警告信息,括号里的的值包括
a. deprecation: -- 使用了过时的类或方法的警告
b. unchecked: -- 执行了未检查时的转换时的警告,集合就是未指定泛型
c. fall through: -- 当在switch语句使用时发生case穿透
d. path: -- 在类路径、源文件路径等中有不存在路径的警告
e. serial: --可序列化类上缺少serialVerisonUID定义时的警告
f. finally: --任何finally橘子不能完成时的警告
g. all: 以上所有情况的警告。
一个 @SuppressWarnings("all"),
多个 @SuppressWarnings(value={"all","path"})
(2).元注解
元注解是用于注解的注解,在JDK 1.5中提供了4个标准的用来对注解类型进行注解的注解类。
以下四类学前两类就可。
$1. @Target注解(用来描述注解的使用范围,即注解可以使用在什么地方,在定义注解的时候使用这个我们可以更加清晰的知道它的使用范围) --- 它是一个枚举类
public enum ElementType { TYPE, //类,接口 FIELD, //成员变量,全局变量 METHOD, //方法 PARAMETER, //方法参数 CONSTRUCTOR, //构造方法 LOCAL_VARIABLE, //局部变量 ANNOTATION_TYPE, //注解类 PACKAGE, // 包 TYPE_PARAMETER, //类型参数 TYPE_USE //使用类型的任何地方 }
如果定义TYPE,就不能在变量上定义了,会报错.
|
只能在类上。
只能在一个方面上表达,(不能既在方法又在变量),任何地方用TYPE_USE即可。
$2. @Retention注解(表示这个注解在什么时候还有效 , 用于描述注解的生命周期) 生命周期一定让他在运行时有效
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息,咱们自定义的类一般使用这个
}
反射的三个阶段:
源文件阶段 xx.java
类对象阶段 :加载到内存当中,放在方法区当中 Class clazz=Class.forName("xx")
runtime阶段:运行时阶段
$3. @Documented 这个注解只是用来标注生成javadoc的时候是否会被记录(了解就好)。
$4. @Inherited注解的作用是:使被它修饰的注解具有继承性
(3).自定义注解
$1. @interface是用来声明一个注解的,格式public @interface 注解名{定义内容}
$2. 其中的每一方法实际上是声明了一个配置参数
$3. 方法的名称就是参数的名称
$4. 返回值类型就是参数的类型(返回值类型只能是基本数据类型,Class,String,enum)
$5. 可以通过default来声明参数的默认值
$6. 如果只有一个参数成员,一般参数名称为value
$7. 注解参数必须有值,我们自定义注解元素时,经常使用空字符串,0作为默认值
3. 注解实现
1>.自定义注解实现类
@Retention(RetentionPolicy.RUNTIME) //元注解:定义自定义注解的生命周期 ---》在运行期间保留
@Target(value = {ElementType.TYPE}) //元注解:定义自定义注解的作用返回 ---》只能作用在类上边
public @interface WebServlet {
String urlMapping() default ""; //写值的
}
2>. 在一个类上使用注解
@WebServlet(urlMapping = "/third")
public class ThridServlet {
}
3>. 利用反射获取注解信息
//利用反射获取注信息
public static void getMessage() throws Exception {
Class clazz = Class.forName("com.qcby.MyServletDemo.FirstServlet");
//获取注解信息
WebServlet webServlet = (WebServlet) clazz.getDeclaredAnnotation(WebServlet.class);
System.out.println(webServlet.urlMapping());
}
public static void main(String[] args) throws Exception {
getMessage();
}
4. 与Tomcat的联系
我们写tomcat项目
tomcat启动的时候,一定要获得key值,即@WebServlet里的值,如何获取,通过反射。
引入
反射只是工具
实现浏览器将数据传给tomcat,整个过程通过Socket去实现。
tomcat中有许多的项目,项目里有许多Servlet,许多前端html页面。
当消息打过来,要么访问Servlet,要么访问html。(原因在Tomcat第二站)
我们想让他对应起来,--加注解。
@WebServlet中肯定是访问地址。
消息打过来的流程
第一步在消息还没访问之前,Tomcat在启动时,就需要维护map表,key-value类型的map表。(这个映射表在上一博客中有提到)
当Tomcat启动完成之后,请求打过来,对应map表的key值,找到其类对象获取信息。
这些Servlet包括注释名(注释名可以是任意的,张三、李四都可以)全是用户自定义的 。要获取这些值,只能通过反射。