1. 程式人生 > >6. Spring:Java註解技術詳解

6. Spring:Java註解技術詳解

6. Spring:Java註解技術詳解

自定義註解示例:https://blog.csdn.net/wangpengzhi19891223/article/details/78131137/

  1. Java註解技術基本概念

    Annotation是Java5開始引入的新特徵。中文名稱一般叫註解。它提供了一種安全的類似註釋的機制,用來將任何的資訊或元資料(metadata)與程式元素(類、方法、成員變數等)進行關聯

    • 原理

      註解其實是一種介面,通過Java反射機制相關的API來訪問註解的資訊。

      註解不會影響程式的執行

    • 和介面的區別

      • 註解是使用的關鍵字@interface而不是interface,是繼承了java.lang.annotation.interface

        並非聲明瞭一個介面

      • 註解型別方法定義是受限制的,獨特的。

      • 可以定義常量

    • 應用場合

      • 工具類,工具框架中
  2. Java標準註解

    • Override

      標註過載了父類的方法(如果標註在不是覆蓋父類的方法上,會編譯錯誤)

    • Deprecate

      標註此方法已過時

    • SuppressWarnings

      遮蔽警告

      @SuppressWarnings(value={"unchecked","fallthrough"})
      public void test
      () { /* method body */ } @SuppressWarnings({"unchecked","fallthrough"}) public void test() { /* method body */ } @SuppressWarnings("unchecked") public void test() { /* method body */ }
  3. Java元註解

    元註解:負責註解其他註解的註解

    Java5.0定義了4個標準的meta-annotation型別,它們被用來提供對其它 annotation型別作說明,Java5.0定義的元註解有以下四種類型:

    • @Target

      @Target主要作用是用於描述註解的使用範圍,即被描述的註解可以用在什麼地方

      • 作用範圍

        • CONSTRUCTOR
        • FIELD
        • LOCAL_VARIABLE
        • METHOD
        • PACKAGE
        • PARAMETER
        • TYPE
      • 示例

        @Target(ElementType.TYPE)
        public @interface Table {
            public String tableName() default "className";
        }
        // Table註解可以用來註解類,介面,型別,列舉宣告
        
        
        @Target(ElementType.FIELD)
        public @interface NoDBColumn {     }
        // NoDBColumn僅用來類的成員變數
        
    • @Retention

      Retention主要表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期

      • 描述生命週期(註解在什麼範圍內有效)

        • SOURCE:原始檔中是有效的,原始檔中是保留的
        • CLASS:CLASS檔案中是有效的
        • RUNTIME:在執行時有效,執行時保留
      • 示例

        @Target(ElementType.FIELD)
        @Retention(RetentionPolicy.RUNTIME)
        public @interface Column {
            public String name() default "fieldName";
            public String setFuncName() default "setField";
            public String getFuncName() default "getField"; 
            public boolean defaultDBValue() default false;
        }
        
    • @Documented

      @Documented用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化

      • 示例

        @Target(ElementType.FIELD)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        public @interface Column {
            public String name() default "fieldName";
            public String setFuncName() default "setField";
            public String getFuncName() default "getField"; 
            public boolean defaultDBValue() default false;
        }
        
        
    • @Inherited

      @Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類:

      • 示例

        @Inherited
        public @interface Greeting {
            public enum FontColor{ BULE,RED,GREEN};
            String name();
            FontColor fontColor() default FontColor.GREEN;
        }
        
  4. Java自定義註解

    • 步驟

      • 通過@interface關鍵字宣告註解名稱、註解成員屬性等

      • 使用Java內建四個元註解對自定義標註的功能和範圍進行約束

        自定義註解的格式: public @interface 註解名 { 定義體 }

    • 支援的資料型別

      • 所有基本資料型別
      • String 型別
      • Class 型別
      • enum 型別
      • Annotation 型別
      • 以上所有型別的陣列
    • 自定義註解定義:

      @Target(ElementType.FIELD)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface FruitName {
          String value() default "";
      }
      
    • 自定義註解的使用

      public class Apple {
          @FruitName("Apple")
          private String appleName;
          // ……
      }
      
      
  5. 註解元素預設值

    註解元素的預設值:註解元素必須有確定的值,要麼在定義註解的預設值中指定,要麼在使用註解時指定,非基本型別的註解元素的值不可為null:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitProvider {
    	//供應商編號
    	public int id() default -1;
    	//供應商名稱
    	public String name() default "";
    	//供應商地址
    	public String address() default "";
    }