在工作中,无论是接触到JDK、还是如SpringBoot诸如此类的框架,总会用到一种东西—-注解。

1、为什么要学习注解?学完能做什么?

  • 1、能够读懂别人代码,特别是框架相关的代码
  • 2、让编程更加简洁,代码更清晰,自定义注解,解决问题

概念:

Java提供了一种原程序中的元素关联任何信息和任何元素的途径和方法(概念比较抽象,看不懂没关系)。

学习路径

  • Java中的常见注解
  • 注解的分类
  • 自定义注解
  • 注解的应用实例

二、Java中常见注解

JDK自带注解

Person 接口类

public interface Person {
    
    public String name();
    
    public int age();
    
    @Deprecated //表示该方法过时了
    public void sing();

}

Child类 实现 Person类

public class Child implements Person{

    @Override   //告诉编译器,覆盖父类的方法
    public String name() {
        return null;
    }

    @Override
    public int age() {
        return 0;
    }

    @Override
    public void sing() {
        
    }

}

Test 测试类

public class Test {
    public void sing() {
        Person p = new Child();
        p.sing();
    }
}

@Override:

@Deprecated:

@SuppressWarnings:

第三方注解

Spring:

@Autowired 自动装配
@Service Service层
@Repository

Mybatis:

@InsertProvider
@UpdateProvider
@Options

三、注解的分类

按照运行机制分类:

  • 源码上注解:注解只在源码中存在,编译成.class文件就不存在了。
  • 编译时注解:注解在源码和.class文件中都存在(例如JDK注解:@Override@Deprecated@Suppvisewarnings)。
  • 运行时注解:运行阶段还起作用,甚至会影响运行逻辑的注解(例如:Spirng提供的@Autowired注解,程序运行时,把成员变量自动注入)。

按照来源分类:

  • 来自JDK的注解
  • 来自第三方的注解(比如框架里的)
  • 自定义注解

元注解:给注解进行注解

原注解示例,如下(一下为通过原注解自定义的注解Description):

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {  //使用关键字@interface定义注解 Description
    String desc();               //成员以无参无异常方式声明
    String author();
    int age() default 18;     //用default为成员指定默认值
}

四、自定义注解

原注解详解

1、@Target({ElementType.METHOD,ElementType.TYPE}) 声明自定义注解的作用域
参数有:

  • CONSTRUCTOR(构造方法)
  • FIELD(字段声明)
  • LOCAL_VARIABLE(局部变量声明)
  • METHOD(方法声明)
  • PACKAGE(包声明)
  • PARAMETER(参数声明)
  • TYPE(类,接口)

2、 @Retention(RetentionPolicy.RUNTIME) 注解的声明周期
参数有:

  • SOURCE(只在源码中显示,编译时丢弃)
  • CLASS(编译时会记录到class中,运行时忽略)
  • RUNTIME(运行时存在,可以通过反射读取)

3、 @Inherited 表示该注解对class使用时,可以被其子类继承

4、@Documented 表示生成javadoc是会包含注解的信息

自定义注解

自定义注解 Description

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {  //使用关键字@interface定义注解 Description
    String desc();               //成员以无参无异常方式声明
    String author();
    int age() default 18;     //用default为成员指定默认值
}

使用自定义注解

自定义注解的使用

@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)

示例:

@Description(desc="I am eyeColor", author="xiaowang", age=18)
public String eyeColor(){
    return "red";
}