手写spring(二)------------------------------------------------------------------自定义注解

项目地址: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

猜你喜欢

转载自blog.csdn.net/qq_33543634/article/details/86999327