【Tomcat】第三站:注解

发布于:2024-12-19 ⋅ 阅读:(9) ⋅ 点赞:(0)

目录

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包括注释名(注释名可以是任意的,张三、李四都可以)全是用户自定义的 。要获取这些值,只能通过反射