手寫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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章