Java中的註解-自定義註解

Java中的註解-自定義註解

Hello,你們好,很久沒有更了,看到上篇博文裏有人說到讓我快點更Spring系列博客,這樣就能夠不用買書了。這裏我以爲有責任和你們說一下,千萬不要有隻看博客不看書的習慣,不少人以爲博客來得快,學的快,緊抓重點。我認可,看博客是快速入門的一種方式,固然你的選好博客,老實說,做者自愧不如,真心只是懂點皮毛,不少東西都是拾人牙慧。不少東西也處於學習階段。並且做者有不少知識也不見得全是對的,僅供你們參考。 其實真正想把一系列只是學透徹,做者仍是強烈推薦看書的,看一些淘寶,京東的架構寫的書,雖然來的慢,可是很全面,很系統。若是把博客看作是吃飯時的菜的話,那麼看書無疑就是咱們的主食大米了,有點養生常識的都知道,吃主食大米或者麪食纔是最補身體的。好了,扯了這麼多,這一篇準備把Java中的自定義註解分享一會兒,由於我身邊好多小夥伴,貌似不少都不知道註解這個東西究竟是什麼,只知道怎麼用,確不知道註解的底層原理。這一篇就和你們分享一下,文章結構:java

  1. Java中的註解概述
  2. 四種元註解
  3. 自定義註解

1. Java中的註解概述

首先要說明一個東西,註解這個東西絕對不是Spring爲咱們提供的,而是JDK帶的,JDK本身也是有不少內置註解的,好比@override. 註解的功能其實就是爲一些加了註解的類,方法等賦予特殊的含義,具體如何產生自定義的含義,其實就是註解處理器了,這是下一篇和你們講的.數組

2. 四種元註解

元註解,說白了,就是JDK自帶的註解,這些註解是幹嗎的呢?其實就是在咱們自定義註解時,註解到咱們自定義的註解上的,舉個例子:bash

@Target(ElementType.TYPE)
public @interface Table {
    public String tableName() default "className";
}
複製代碼

你們先不要管語法,Table其實就是我自定義的一個註解,能夠@Table這樣使用了,那麼這個@Target其實就是元註解了。JDK自帶的元註解以下:架構

  1. @Target
  2. @Retention
  3. @Documented
  4. @Inherited
@Target

用於描述註解的使用範圍,有一個枚舉ElementType來指定,具體以下:ide

  1. CONSTRUCTOR:用於描述構造器
  2. FIELD:用於描述域
  3. LOCAL_VARIABLE:用於描述局部變量
  4. METHOD:用於描述方法
  5. PACKAGE:用於描述包
  6. PARAMETER:用於描述參數
  7. TYPE:用於描述類、接口(包括註解類型) 或enum聲明

eg:性能

@Target(ElementType.METHOD)
public @interface Dog {
    
}
複製代碼

你們能夠看到,我這個Dog註解,只能用到方法上面 。學習

2. @Retention

表示須要在什麼級別保存該註釋信息,用於描述註解的生命週期,也是一個枚舉RetentionPoicy來決定的,這個枚舉我不列出來了,包括這個註解的具體怎麼決定註解的生命週期我也很少講,由於根據小弟這麼多年使用的經驗,都是填的RetentionPoicy.RUNTIME,填這個值註解處理器才能經過反色拿到註解信息,實現本身的語義,因此你們都填RetentionPoicy.RUNTIME就能夠了,想擴展瞭解的自行google..google

3. @Documented

若是用javadoc生成文檔時,想把註解也生成文檔,就帶這個。(話說老鐵們都是怎麼寫文檔的,小弟表示從不寫文檔... ^_^)spa

4. @Inherited

@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的。若是一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。注意,@Inherited annotation類型是被標註過的class的子類所繼承。類並不從它所實現的接口繼承annotation,方法並不從它所重載的方法繼承annotation。日誌

其實這幾個註解只有一個有點用,就是@Target,你們稍微注意下就好了。註解不是你想加哪就加哪的

3. 自定義註解

上面把元註解說了,來說下如何自定義註解,順帶提一下,自定義的註解又叫組合註解.而後說下自定義註解格式:

  1. 固定格式,不要搞事.
  2. 只能用public或默認(default)這兩個訪問權修飾.例如,String value();這裏把方法設爲defaul默認類型;
  3. 定義註解參數的類型,只能爲:
  • 全部基本數據類型(int,float,boolean,byte,double,char,long,short)
  • String類型
  • Class類型
  • enum類型
  • Annotation類型
  • 以上全部類型的數組
  1. 方法名,就是這個註解的支持的屬性名,像常見的value.
  2. 表示該屬性名在不指定時的默認值,能夠不要。

好了,我舉個例子:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dog {
    public String dog() default "";
}
複製代碼

我定義了一個Dog註解,它有一個屬性爲dog,是String類型的,默認值爲"".我在使用的時候能夠這樣使用,@Dog(dog="小黃"),還能夠直接這樣使用@Dog,不指定dog屬性,默認就是"" .

好了,你們能夠看到,這樣就定義了一個註解了,你們可能好奇,這樣有個毛用,我就是加到了具體的類上,也沒什麼鳥用啊。我這裏和你們分享下本身的一點經驗,自定義註解有兩種用法:

  1. 自定義註解處理器專門爲你自定義的註解實現語義(好比加了@Dog註解的方法,在調用的時候,所有都打印出調用信息到日誌系統) ,後一篇博客講自定義註解處理器。
  2. 配合Spring使用.

在講如何配合Spring使用前,先說一個知識點,你們可能會忽略掉,那就是註解是能夠組合的,如上圖,在自定義註解時,不只能夠加元註解,還能夠加其餘自定義註解 。這就好玩了,我舉個例子:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Dog {
    public String dog() default "";
}
複製代碼

我爲剛剛的@Dog註解加了@Component,那麼這個註解就會有@Component的功能了(被Spring當作bean加入到Spring容器裏).如今在順帶說下屬性修飾符public和默認的區別

  • public修飾的屬性能被覆蓋,默認的則不能. 舉個例子:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Dog
public @interface StupidDog {
    public String dog() default "我是一條StupidDog";
}
複製代碼

我如今又定義了一個StupidDog註解,這個註解覆蓋掉了@Dog的dog屬性,把默認值從""改爲了"我是一條StupidDog"..

好了,回到話題上,知道了組合註解能夠擁有被註解的註解的功能,還拿剛纔那個加了@Component註解的@Dog註解來講,當某個類被加了這個註解,好比:

@Dog
public class TestService {
    ...
}
複製代碼

咱們知道這個TestService在Spring的環境下會被加到Spring容器裏成爲Bean,但是這有什麼鳥用了?這個做用可大了!這能夠把Spring容器裏的bean區分開來,好比以下代碼片斷:

// ctx 爲Spring的ApplicationContext
// // 獲取全部帶有 Dog 註解的 Spring Bean
Map<String, Object> serviceBeanMap = ctx.getBeansWithAnnotation(Dog.class); 
複製代碼

你們能夠看到,能夠經過ApplicationContext取到一些帶有特殊標記(自定義註解)的Spring bean! 你們不要小看了這一功能,若是你想在Spring容器初始化完畢後,對某一類Spring Bean作一些特殊操做。自定義註解能夠幫你區分開來。

結語

好了,自定義註解的一些知識就和你們分享完了,其實比較簡單,語法也很清晰,而後又提了下運用組合註解的知識來結合Spring的@Componenet使用,截止到目前爲止,你們會發現本身定義的註解,除了能和Spring結合用一會兒,並沒什麼鳥用,上面也提到了,目前爲止是的,下一篇給你們分享下自定義註解處理,這個東西可讓咱們自定義的註解實現本身特有的功能。今天週五,你們週末愉快,多出去打個野。少加班,保重龍體,幹it的,別和需求過不去,能推就推。Over,Have a good day .

相關文章
相關標籤/搜索