一、什么是注解?
注解的英文是annotation谈火,就是使用@
符號(hào)來(lái)標(biāo)注類(lèi)侈询、方法、類(lèi)成員糯耍、局部變量扔字、方法參數(shù)等。用于表示一些特殊的含義温技。比如我們常見(jiàn)的@Controller
, @Service
, @Repository
, @Autowired
等革为。
二、為什么要有注解? 注解有什么作用?
我理解這跟編程思想中的DRY(don't repeat yourself)的原則是吻合的舵鳞。用統(tǒng)一的一個(gè)標(biāo)識(shí)符@
來(lái)標(biāo)識(shí)一組具有相同屬性的對(duì)象震檩。
在Spring中,框架會(huì)自動(dòng)掃描被標(biāo)注的類(lèi)蜓堕,并把使用@Componet
標(biāo)注的類(lèi)以bean的形式注入到框架中抛虏。方便供框架管理這些類(lèi)的創(chuàng)建與銷(xiāo)毀。
我們常用的JUnit俩滥,也會(huì)自動(dòng)掃描被@Test
標(biāo)注的方法嘉蕾,認(rèn)為它們是單獨(dú)供JUnit框架管理的單測(cè)方法。
所以霜旧,使用注解,就是為了方便我們?yōu)轭?lèi)、方法挂据、屬性以清、參數(shù)等對(duì)象打一個(gè)標(biāo)簽,做一個(gè)標(biāo)識(shí)崎逃。開(kāi)發(fā)框架或架構(gòu)師可以根據(jù)這些標(biāo)識(shí)做自己的邏輯處理掷倔。
三、如何實(shí)現(xiàn)自定義注解?
3.1 通過(guò)元注解來(lái)實(shí)現(xiàn)注解
拿我們經(jīng)常用到的@Autowired
來(lái)舉例个绍,
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
解釋:
通過(guò) @interface 來(lái)聲明一個(gè)注解勒葱。
@Target 說(shuō)明注解所修飾的對(duì)象范圍,取值的話巴柿,有
- CONSTRUCTOR: 構(gòu)造器
- FIELD: 域
- LOCAL_VARIABLE: 局部變量
- METHOD: 方法
- PACKAGE: 包
- PARAMETER: 參數(shù)
- TYPE: 類(lèi)凛虽、接口、enum聲明
@Retention描述注解的生命周期广恢,在什么時(shí)候生效凯旋,有3個(gè)
- SOURCE
- CLASS
- RUNTIME
@Documented說(shuō)明可被javadoc此類(lèi)工具文檔化
@Inherited說(shuō)明被標(biāo)注的類(lèi)型是被繼承的(// TODO 舉例說(shuō)明)
3.2 如何獲取注解名與值
通過(guò)反射。關(guān)于什么是反射钉迷,會(huì)單獨(dú)寫(xiě)一個(gè)筆記來(lái)記錄至非。在這里,我們先有一個(gè)概念糠聪,就是可以通過(guò)某一種方法來(lái)獲取注解的名稱荒椭,以及其中的值。
// todo 舉例
@Hello
public class Any {
}
屬性上的
@Hello
private String name;