1. 程式人生 > >Spring註解與Java元註解小結

Spring註解與Java元註解小結

spa package param style 值範圍 描述 tro ret 類型

註解 Annotation

基於註解的開發,使得代碼簡潔,可讀性高,簡化的配置的同時也提高了開發的效率,尤其是SpringBoot的興起,隨著起步依賴和自動配置的完善,更是將基於註解的開發推到了新的高度。

元註解 meta-annotation

Java 5 定義了四個標準的元註解類型,用以提供對其它註解的功能說明。

位於java.lang.annotation包下,分別為:

  1. @Target

  2. @Retention

  3. @Documented

  4. @Inherited

以@Profile註解為例:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.
class) public @interface Profile { /** * The set of profiles for which the annotated component should be registered. */ String[] value(); }

@Target

說明註解所修飾的對象範圍。

註解可用於:package、type(類、接口、枚舉、註解)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(循環變量、catch參數)。

按照作用範圍,個人給出的常用註解,按照作用範圍排序,各類暫舉一:

  @Configuration、@MapperScan、@RestController、@RequestMapping、@ResponseBody、@Autowired、@Resource、@Value、@PathVariable。。。

具體的取值範圍為ElementType(enum)類型的數組,見源碼:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     
*/ ElementType[] value(); }
  1. ElementType.Constructor : 描述構造器
  2. ElementType.Field : 描述域
  3. ElementType.LocalVariable : 描述局部變量
  4. ElementType.Method : 描述方法
  5. ElementType.Package : 描述包
  6. ElementType.Parameter : 描述參數
  7. ElementType.Type : 描述類、接口、enum、annotation

@Retention

定義註解的作用時期(源文件、字節碼、運行期)。

用以 說明被描述的註解在什麽範圍內生效。

取值唯一,即具體的保存策略,RetentionPolicy(enum)之一。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}

RetentionPolicy包括:

  1. SOURCE : 源文件有效
  2. CLASS : 字節碼文件有效
  3. RUNTIME : 運行時有效

@Documented

標記註解,可被javadoc之類的工具文檔化,即描述該類型的註解,應該作為被標註的程序成員的公共API,沒有成員

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Inherited

標記註解,描述的註解是可被繼承的。即如果一個類被@Inherited標記的註解所修飾,則該註解同樣作用於這個類的子類。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

Spring註解與Java元註解小結