Hello,你們好,很久沒有更了,看到上篇博文裏有人說到讓我快點更Spring系列博客,這樣就能夠不用買書了。這裏我以爲有責任和你們說一下,千萬不要有隻看博客不看書的習慣,不少人以爲博客來得快,學的快,緊抓重點。我認可,看博客是快速入門的一種方式,固然你的選好博客,老實說,做者自愧不如,真心只是懂點皮毛,不少東西都是拾人牙慧。不少東西也處於學習階段。並且做者有不少知識也不見得全是對的,僅供你們參考。 其實真正想把一系列只是學透徹,做者仍是強烈推薦看書的,看一些淘寶,京東的架構寫的書,雖然來的慢,可是很全面,很系統。若是把博客看作是吃飯時的菜的話,那麼看書無疑就是咱們的主食大米了,有點養生常識的都知道,吃主食大米或者麪食纔是最補身體的。好了,扯了這麼多,這一篇準備把Java中的自定義註解分享一會兒,由於我身邊好多小夥伴,貌似不少都不知道註解這個東西究竟是什麼,只知道怎麼用,確不知道註解的底層原理。這一篇就和你們分享一下,文章結構:java
首先要說明一個東西,註解這個東西絕對不是Spring爲咱們提供的,而是JDK帶的,JDK本身也是有不少內置註解的,好比@override. 註解的功能其實就是爲一些加了註解的類,方法等賦予特殊的含義,具體如何產生自定義的含義,其實就是註解處理器了,這是下一篇和你們講的.數組
元註解,說白了,就是JDK自帶的註解,這些註解是幹嗎的呢?其實就是在咱們自定義註解時,註解到咱們自定義的註解上的,舉個例子:bash
@Target(ElementType.TYPE)
public @interface Table {
public String tableName() default "className";
}
複製代碼
你們先不要管語法,Table其實就是我自定義的一個註解,能夠@Table這樣使用了,那麼這個@Target其實就是元註解了。JDK自帶的元註解以下:架構
用於描述註解的使用範圍,有一個枚舉ElementType來指定,具體以下:ide
eg:性能
@Target(ElementType.METHOD)
public @interface Dog {
}
複製代碼
你們能夠看到,我這個Dog註解,只能用到方法上面 。學習
表示須要在什麼級別保存該註釋信息,用於描述註解的生命週期,也是一個枚舉RetentionPoicy來決定的,這個枚舉我不列出來了,包括這個註解的具體怎麼決定註解的生命週期我也很少講,由於根據小弟這麼多年使用的經驗,都是填的RetentionPoicy.RUNTIME,填這個值註解處理器才能經過反色拿到註解信息,實現本身的語義,因此你們都填RetentionPoicy.RUNTIME就能夠了,想擴展瞭解的自行google..google
若是用javadoc生成文檔時,想把註解也生成文檔,就帶這個。(話說老鐵們都是怎麼寫文檔的,小弟表示從不寫文檔... ^_^)spa
@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的類型是被繼承的。若是一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。注意,@Inherited annotation類型是被標註過的class的子類所繼承。類並不從它所實現的接口繼承annotation,方法並不從它所重載的方法繼承annotation。日誌
其實這幾個註解只有一個有點用,就是@Target,你們稍微注意下就好了。註解不是你想加哪就加哪的。
上面把元註解說了,來說下如何自定義註解,順帶提一下,自定義的註解又叫組合註解.而後說下自定義註解格式:
好了,我舉個例子:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dog {
public String dog() default "";
}
複製代碼
我定義了一個Dog註解,它有一個屬性爲dog,是String類型的,默認值爲"".我在使用的時候能夠這樣使用,@Dog(dog="小黃"),還能夠直接這樣使用@Dog,不指定dog屬性,默認就是"" .
好了,你們能夠看到,這樣就定義了一個註解了,你們可能好奇,這樣有個毛用,我就是加到了具體的類上,也沒什麼鳥用啊。我這裏和你們分享下本身的一點經驗,自定義註解有兩種用法:
在講如何配合Spring使用前,先說一個知識點,你們可能會忽略掉,那就是註解是能夠組合的,如上圖,在自定義註解時,不只能夠加元註解,還能夠加其餘自定義註解 。這就好玩了,我舉個例子:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Dog {
public String dog() default "";
}
複製代碼
我爲剛剛的@Dog註解加了@Component,那麼這個註解就會有@Component的功能了(被Spring當作bean加入到Spring容器裏).如今在順帶說下屬性修飾符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 .