项目地址:https://github.com/gongxianshengjiadexiaohuihui/noobspring
我们知道spring使用了大量的注解,首先我们需要了解注解是用来干嘛的,这里我讲一下个人的理解和看法。
在我看来注解的作用主要是用来标记,这个标记可以被保留到不同的时期,这个后面会有叙述,然后呢我们可以在不同的时期,获取到这个标记,然后我们就可以根据这个标记的内容,来对被标记的对象进行相应的处理。就比如一台macbook,我对它使用 @笔记本电脑 这个注解,我就可以在某个时期获取台macbook,通过它的注解,我知道它是一台笔记本电脑,我就可以用它来编程,看电影,玩游戏等等
这是我们需要实现的自定义注解,一共有两类,一类是和mvc相关的,一类是和aop相关的,我都加了前缀NB是项目名的缩写,也避免和原有的注解冲突
我们先看aop
四个通知,前置通知@NBBefore 后置通知 @NBAfter 异常通知@NBAfterThrowing 返回通知 @NBAfterReturn
切点 @NBPointcut
切面 @NBAspect
再看mvc
@NBAutowired 注入
@NBComponent 生成bean实例保存到ioc容器中
@NBRequestMapping 值为请求路径,和方法作为键值对被存放在handlerMapping中
@NBController 控制层 作为方法反射的类实例(进行方法的反射调用时,需要方法所在的类实例作为参数)
@NBRequestParam 请求参数 把请求参数的值作为需要调用的方法参数
关于自定义注解的内容,我们取一个来举例
package com.ggp.framework.annotation.mvc;
import java.lang.annotation.*;
/**
* @Author:ggp
* @Date:2019/1/21 16 04
* @Description:
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NBRequestMapping {
String value() default "";
}
首先是@Target 是声明这个注解的作用范围,里面的内容是一个枚举对象,
ElementType.TYPE 作用范围 类、接口、枚举、注解
ElementType.METHOD 作用范围 方法
ElementType.FIELD 作用范围 字段、枚举的常量
ElementType.PARAMETER 作用范围 方法的参数
ElementType.CONSTRUCTOR 作用范围 构造函数
ElementType.LOCAL_VARIABLE 作用范围 局部变量
ElementType.ANNOTATION_TYPE 作用范围 注解
ElementType.PACKAGE 作用范围 包
注解的保留政策 @Retention
Retention.SOURCE 注解仅存在于源码,在class字节码文件中不包含
Retention.CLASS 默认的保留政策,注解会在class字节码中存在,但是运行时无法获得
Retention.RUNTIME 注解会在class字节码中存在,在运行时可以通过反射获得
注解包含在javadoc中:@Document
注解可以被继承: @Inherited