一、什么是注解?
注解的英文是annotation,就是使用@
符號來標注類、方法、類成員、局部變量、方法參數等。用于表示一些特殊的含義。比如我們常見的@Controller
, @Service
, @Repository
, @Autowired
等。
二、為什么要有注解? 注解有什么作用?
我理解這跟編程思想中的DRY(don't repeat yourself)的原則是吻合的。用統一的一個標識符@
來標識一組具有相同屬性的對象。
在Spring中,框架會自動掃描被標注的類,并把使用@Componet
標注的類以bean的形式注入到框架中。方便供框架管理這些類的創建與銷毀。
我們常用的JUnit,也會自動掃描被@Test
標注的方法,認為它們是單獨供JUnit框架管理的單測方法。
所以,使用注解,就是為了方便我們為類、方法、屬性、參數等對象打一個標簽,做一個標識。開發框架或架構師可以根據這些標識做自己的邏輯處理。
三、如何實現自定義注解?
3.1 通過元注解來實現注解
拿我們經常用到的@Autowired
來舉例,
@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;
}
解釋:
通過 @interface 來聲明一個注解。
@Target 說明注解所修飾的對象范圍,取值的話,有
- CONSTRUCTOR: 構造器
- FIELD: 域
- LOCAL_VARIABLE: 局部變量
- METHOD: 方法
- PACKAGE: 包
- PARAMETER: 參數
- TYPE: 類、接口、enum聲明
@Retention描述注解的生命周期,在什么時候生效,有3個
- SOURCE
- CLASS
- RUNTIME
@Documented說明可被javadoc此類工具文檔化
@Inherited說明被標注的類型是被繼承的(// TODO 舉例說明)
3.2 如何獲取注解名與值
通過反射。關于什么是反射,會單獨寫一個筆記來記錄。在這里,我們先有一個概念,就是可以通過某一種方法來獲取注解的名稱,以及其中的值。
// todo 舉例
@Hello
public class Any {
}
屬性上的
@Hello
private String name;