6. Spring:Java注解技术详解
自定义注解示例:https://blog.csdn.net/wangpengzhi19891223/article/details/78131137/
-
Java注解技术基本概念
Annotation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联
-
原理
注解其实是一种接口,通过Java反射机制相关的API来访问注解的信息。
注解不会影响程序的运行
-
和接口的区别
-
注解是使用的关键字@interface而不是interface,是继承了java.lang.annotation.interface
并非声明了一个接口
-
注解类型方法定义是受限制的,独特的。
-
可以定义常量
-
-
应用场合
- 工具类,工具框架中
-
-
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 */ }
-
-
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; }
-
-
-
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; // …… }
-
-
注解元素默认值
注解元素的默认值:注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitProvider { //供应商编号 public int id() default -1; //供应商名称 public String name() default ""; //供应商地址 public String address() default ""; }