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 "";
    }
    
    

猜你喜欢

转载自blog.csdn.net/Hi_maxin/article/details/83415042
今日推荐