注解和自定義注解

一、注解(Annotation)

1祟滴、什么是注解

jdk1.5后出的特性。代碼的說明歌溉,是一個元數(shù)據(jù)。

注解在 Java 中以“@注解名”的形式呈現(xiàn)骑晶。

2痛垛、 Java 內置的常用注解

    @Override : 用于注解方法,說明該方法是重寫方法

    @SuppressWarnings : 用于抑制編譯器警告

    @Deprecated : 用于注解屬性桶蛔、方法匙头、類。 說明已經過時過期

    @FunctionalInterface : jdk1.8 用于注解接口仔雷,說明該接口是一個函數(shù)式接口

二蹂析、元注解:

元數(shù)據(jù):裝載數(shù)據(jù)的的數(shù)據(jù) String name = "atguigu";

元注解:定義注解的注解

1、java.lang.annotation提供了四種元注解:

@Retention –什么時候使用該注解

@Target –注解用于什么地方

@Documented –修飾的注解可以隨之生成說明文檔碟婆,注解的生命周期必須是 RUNTIME

@Inherited – 是否允許子類繼承該注解

2电抚、元注解使用說明

1.)@Retention– 定義該注解的生命周期

● RetentionPolicy.SOURCE : 在編譯階段丟棄。這些注解在編譯結束之后就不再有任何意義竖共,所以它們不會寫入字節(jié)碼蝙叛。@Override, @SuppressWarnings都屬于這類注解。

● RetentionPolicy.CLASS : 在類加載的時候丟棄公给。在字節(jié)碼文件的處理中有用借帘。注解默認使用這種方式

● RetentionPolicy.RUNTIME : 始終不會丟棄,運行期也保留該注解淌铐,因此可以使用反射機制讀取該注解的信息肺然。

2.)Target – 表示該注解用于什么地方。默認值為任何元素腿准,ElementType參數(shù)包括

● ElementType.CONSTRUCTOR:用于描述構造器

● ElementType.FIELD:成員變量际起、對象、屬性(包括enum實例)

● ElementType.LOCAL_VARIABLE:用于描述局部變量

● ElementType.METHOD:用于描述方法

● ElementType.PACKAGE:用于描述包

● ElementType.PARAMETER:用于描述方法參數(shù)

● ElementType.TYPE:用于描述類释涛、接口(包括注解類型) 或enum聲明

ElementType.ANNOTATION_TYPE :用于描述注解

3.)@Documented–一個簡單的Annotations標記注解加叁,表示是否將注解信息添加在java文檔中。

4.)@Inherited – 定義該注釋和子類的關系

 @Inherited 元注解是一個標記注解唇撬,@Inherited闡述了某個被標注的類型是被繼承的它匕。

三、自定義注解:

1窖认、規(guī)則:

1. Annotation的類型為@interface,

所有的Annotation會自動繼承java.lang.Annotation這一接口,并且不能再去繼承別的類或是接口.

2. 參數(shù)成員只能用public或默認(default)這兩個訪問權修飾

3. 參數(shù)成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和String豫柬、Enum告希、Class、annotations等數(shù)據(jù)類型,以及這些類型的數(shù)組.

2烧给、格式

package com.dodou.liwh.annotation;

import java.lang.annotation.*;


@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.FIELD, ElementType.METHOD})

@Documented

public @interface AppleName {

    String name() default "";//default 表示參數(shù)的默認值

    String value() default "";//value()是默認方法燕偶,調用時可以不寫

}

四、注解的使用:調用是方法——結果是值

注解本質是一個繼承了Annotation的特殊接口础嫡,其具體實現(xiàn)類是Java運行時生成的動態(tài)代理類指么。而我們通過反射獲取注解時,返回的是Java運行時生成的動態(tài)代理對象$Proxy1榴鼎。通過代理對象調用自定義注解(接口)的方法伯诬,會最終調用AnnotationInvocationHandler的invoke方法。該方法會從memberValues這個Map中索引出對應的值巫财。而memberValues的來源是Java常量池盗似。

1)使用反射獲取到注解,拿到注解的數(shù)據(jù)

aop的JoinPoint也可拿到平项,原理就是java的反射機制

2)結合aop赫舒,作為aop的切入點規(guī)則

package com.dodou.liwh.annotation;

import java.lang.annotation.*;


@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.FIELD, ElementType.METHOD})

@Documented

public @interface AppleName {

    String name() default "";//default 表示參數(shù)的默認值

    String value() default "";//value()是默認方法,調用時可以不寫

}
package com.dodou.liwh.annotation;

import org.springframework.beans.factory.annotation.Configurable;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.EnableAspectJAutoProxy;


@Configurable

@ComponentScan("com.dodou.liwh.annotation")

@EnableAspectJAutoProxy

public class AopConfig {

}
package com.dodou.liwh.annotation;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.stereotype.Component;

import java.lang.reflect.Method;


@Component

@Aspect

public class LogAspect {

    //定義切入點的方法闽瓢,一次書寫切入規(guī)則接癌,處處引用

    //這里的規(guī)則:標注了@annotation(com.dodou.liwh.annotation.AppleName) 這個注解的

    @Pointcut("@annotation(com.dodou.liwh.annotation.AppleName)")

    public void pointCut() {

    }

    //引用切入點方法

    @After("pointCut()")

    public void after(JoinPoint joinPoint) {

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        Method method = signature.getMethod();

        //使用方法上的注解

        AppleName annotation = method.getAnnotation(AppleName.class);

        System.out.println("注解式攔截:調用自定義注解:" + annotation.name());

    }

    //自己寫切入點表達式

    @Before("execution(* com.dodou.liwh.annotation.MethodAction.*(..))")

    public void before(JoinPoint joinPoint) {

        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();

        Method method = methodSignature.getMethod();

        System.out.println("切入點表達式攔截:" + method.getName() + ":apple");

    }

}
package com.dodou.liwh.annotation;

import org.springframework.stereotype.Service;


@Service

public class AnnotationAction {

    //使用了@AppleName注解,滿足aop切入點方法:進行切入

    @AppleName(name = "我吃蘋果")

    public void eat() {

        //被切入的方法

    }

}
package com.dodou.liwh.annotation;

import org.springframework.stereotype.Service;


@Service

public class MethodAction {

    public void eat() {

        //被切入的方法

    }

}
package com.dodou.liwh.annotation;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class Main {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);

        //已標注@AppleName的類

        AnnotationAction annotationAction = (AnnotationAction) context.getBean("annotationAction");

        annotationAction.eat();

        //未標注@AppleName的類

        MethodAction methodAction = (MethodAction) context.getBean("methodAction");

        methodAction.eat();

    }

}

3)執(zhí)行結果
image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末扣讼,一起剝皮案震驚了整個濱河市扔涧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌届谈,老刑警劉巖枯夜,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艰山,居然都是意外死亡湖雹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門曙搬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摔吏,“玉大人,你說我怎么就攤上這事纵装≌鹘玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵橡娄,是天一觀的道長诗箍。 經常有香客問我,道長挽唉,這世上最難降的妖魔是什么滤祖? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任筷狼,我火速辦了婚禮,結果婚禮上匠童,老公的妹妹穿的比我還像新娘埂材。我一直安慰自己,他們只是感情好汤求,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布俏险。 她就那樣靜靜地躺著,像睡著了一般扬绪。 火紅的嫁衣襯著肌膚如雪寡喝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天勒奇,我揣著相機與錄音,去河邊找鬼巧骚。 笑死赊颠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的劈彪。 我是一名探鬼主播竣蹦,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沧奴!你這毒婦竟也來了痘括?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤滔吠,失蹤者是張志新(化名)和其女友劉穎纲菌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疮绷,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡翰舌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冬骚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椅贱。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖只冻,靈堂內的尸體忽然破棺而出庇麦,到底是詐尸還是另有隱情,我是刑警寧澤喜德,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布山橄,位于F島的核電站,受9級特大地震影響舍悯,放射性物質發(fā)生泄漏驾胆。R本人自食惡果不足惜涣澡,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丧诺。 院中可真熱鬧入桂,春花似錦、人聲如沸驳阎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵晚。三九已至蜘腌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饵隙,已是汗流浹背撮珠。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留金矛,地道東北人芯急。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像驶俊,于是被迫代替她去往敵國和親娶耍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容