zhiyuan0 2020-07-04
注解是JDK1.5的新特性,它是一种标记,可以标记类,方法,成员变量,局部变量,参数等.... 这个标记主要是给编译器看的,或者给JVM看的
a.生成帮助文档: @author 作者信息 @verson 版本信息 b.编译检查: @Override 检查方法重写是否正确 c.给框架的作为配置使用 (Mybatis,Spring,SpringMVC)这些框架都会用到注解
@Override 方法重写注解 @FunctionalInterface 函数式接口注解 @Deprecated 过期注解 @author 用来标识作者 @version 用于标识版本 @Test junit单元测试
public @interface 注解名{}
格式: public @interface 注解名{ //注解中只能写属性 数据类型 属性名() [default 默认值]; } 注解中属性的数据类型必须是以下三大类之一: a.8种基本类型(byte,short,int,long,char,float,double,boolean) b.4种引用类型(String,枚举类型,Class类型,其他注解类型) c.以上12种的一维数组 注意事项: a.默认情况下,我们的注解可以标记在类上,方法上,成员变量上,参数上,局部变量上等... b.使用注解进行标记时,必须保证该注解的某个属性都有值 即没有默认值的属性必须赋值,有默认值的属性可以赋值也可以不赋值 /** * 自定义注解 */ public @interface MyAnnotation { //给注解添加属性 int age();// default 10; String name();// default "张三"; String[] hobby();// default {"抽烟","喝酒","烫头"}; }
a.如果注解中只有一个属性且名字叫value,则在使用该注解时可以直接给该属性赋值,而不需要 给出属性名。 /** * 特殊属性名value */ public @interface MyAnno { String value(); } @MyAnno("jack") //省略"value="直接写属性值 public class Demo { } b.如果注解中除了value之外,其他的属性都有默认值,并且使用时只给value赋值,那么直接给该属性赋值,而不需要 给出属性名。 /** * 特殊属性名value */ public @interface MyAnno { String value(); int age() default 10; String name() default "rose"; } @MyAnno("jack") //省略"value="直接写属性值 public class Demo { }
两个元注解: 元注解 作用: 规定我们的注解的标记目标 属性名: value 属性值: 在ElementType枚举类中的如下值: TYPE,类,接口 FIELD, 成员变量 METHOD, 成员方法 PARAMETER, 方法参数 CONSTRUCTOR, 构造方法 LOCAL_VARIABLE, 局部变量 /** * 自定义注解 */ //@Target(ElementType.TYPE) //@Target(ElementType.FIELD) //@Target(ElementType.METHOD) //@Target(ElementType.CONSTRUCTOR) //@Target(ElementType.PARAMETER) @Target(ElementType.LOCAL_VARIABLE) public @interface MyAnnotation { } 元注解 作用:规定我们的注解的生命周期 属性名:value 属性值: 必须是RetensionPolicy枚举类中的成员,其值如下: SOURCE: 代表我们的注解只在源码阶段存在 CLASS: 代表我们的注解在源码中存在,编译之后也存在,但是加载到JVM中会删除 RUNTIME:代表我们的注解 在源码中存在,编译之后也存在,加载到JVM后还是存在(一直存在) @Rentension(RetensionPolicy.SOURCE) public @interface MyAnnotation { }
在《聊聊、手写Mybatis XML配置方式》中聊了通过 XML配置方式 来实现 Mybatis,也聊到了 Mybatis 中用到的动态代理技术。这篇文章主要是聊聊通过注解方式来手写 Mybatis。