学习目的
方便看懂被人的代码,尤其是框架
让编码更简洁,代码更加清晰
Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法
Java中常见注解
JDK自带注解
@Override : 表示覆盖/实现父类的方法
@Deprecated : 表示方法已经过时了
@SuppressWarning("某种警告") : 忽略警告;例如 @SuppressWarning("deprecated")
Spring中注解
@AutoWired @Service @Repository @Compent ......
Mybatis中注解
@InsertProvider @UpdateProvider @Options ......
Java注解的分类
按照运行机制分
源码注解 : 源码里有,.class文件中没有
编译注解 : .class文件中存在,运行时没有
运行注解 : 运行是起作用,如 @AutoWired
按来源分
JDK自带注解
第三方注解
自定义注解
自定义注解的语法
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String desc();
String author();
int age() default 18;
}
说明1: 使用 @interface 关键字定义注解
说明2: 成员以无参无异常方式声明
说明3: 可以用 default 为成员指定一个默认值
说明4: 成员类型是受限制的,只能是 原始类型 及 String/Class/Annotation/Enumeration
说明5: 如果注解只有一个成员,则成员名必须是 value() ,在使用时可以忽略成员名和赋值号(=)
说明6: 注解类可以没有成员,没有成员的注解称为标识注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
这几个是元注解,其各自的作用:
@Target 定义注解作用域
ElementType.METHOD : 方法声明
ElementType.TYPE : 类和接口
ElementType.CONSTRUCTOR : 构造方法声明
ElementType.FIELD : 字段声明
ElementType.LOCAL_VARIABLE : 局部变量声明
ElementType.PACKAGE : 包声明
ElementType.PARAMETER : 参数声明
@Retention 生命周期
RetentionPolicy.SOURCE : 源码级别
RetentionPolicy.CLASS : 编译级别
RetentionPolicy.RUNTIME : 运行级别,运行时存在,可以通过反射读取
@Inherited 允许子类继承,只会继承类的注解
@Documented 生成javadoc时会包含注解
使用自定义注解
语法:
@<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ......)
解析注解
概念 : 通过反射获取类、函数或者成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
需求 :
1. 用户表: 用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号
2. 方便的对每个字段或字段组合条件进行检索,并打印出sql
3. 使用方式要足够简单
代码github地址: https://github.com/aston2016/AstonProject/tree/master/annotation