深入理解Spring四大元注解DIRT

背景

在jdk1.5引入了注解概念。好多框架(如Spring)都都开始大量的使用注解。

四大元注解对应的package是 java.lang.annotation。

作用

负责注解其他注解。

1、@Documented

一个标记注解,没有成员,
描述其它类型的注解应该被作为被标注的程序成员的公共API,
因此可以被例如javadoc此类的工具文档化。
即拥有这个注解的元素可以被javadoc此类的工具文档化。
它代表着此注解会被javadoc工具提取成文档。
在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@return,@param 等。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
    
    
}

使用实例:
并不是每个注解都有此元注解。如 @Override

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
    
    
}

2、@Inherited

一个标记注解,没有成员,
描述了某个被标注的类型是被继承的。
如果一个使用了@Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类。
允许子类继承父类中的注解。即拥有此注解的元素其子类可以继承父类的注解。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
    
    
}

使用实例:
并不是每个注解都有此元注解。
含有@Inherited的注解,如 swagger下的 @ApiModel

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ApiModel {
    
    
    String value() default "";

    String description() default "";

    Class<?> parent() default Void.class;

    String discriminator() default "";

    Class<?>[] subTypes() default {
    
    };

    String reference() default "";
}


3、保留策略 @Retention

描述了此注解被保留的时间长短。
表示需要在什么级别保存该注释信息,用于描述注解的生命周期【被描述的注解在什么范围内有效】。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    
    
    RetentionPolicy value();
}

使用实例:
这个@Retention 好像每个注解都有的。就不举例子了。

4、使用范围 @Target

描述了此注解所修饰的对象范围。
用于描述注解的使用范围【被描述的注解可以用在什么地方】。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    
    
    ElementType[] value();
}

使用实例:
这个@Target 好像每个注解都有的。就不举例子了。

扩展基础知识

1、@Retention之RetentionPolicy

public enum RetentionPolicy {
    
    
    /**
     * 仅出现在源代码中,而编译器将丢弃注释。
     */
    SOURCE,

    /**
     * 编译器将注释记录在类文件中,但不需要在运行时由VM保留。这是默认值行为。
     */
    CLASS,

    /**
     *
     * 编译器将注释记录在类文件中,并在运行时由VM保留,因此可以反射地读取它们。
     * 可以看看 java.lang.reflect.AnnotatedElement
     * 
     */
    RUNTIME
}

深入可以研究 java.lang.reflect.AnnotatedElement。

2、@Target之ElementType

public enum ElementType {
    
    
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}

最后

分享一个记忆四大元注解的方法就是简写 DIRT(Documented Inherited Retention Target )。

感谢

如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【点赞】支持,或请我喝杯咖啡【赞赏】,这将是我继续写作,分享的最大动力!
作者:勤快的小蚂蚁
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
————————————————
版权声明:本文为CSDN博主「勤快的小蚂蚁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fxzzq/article/details/126027955

猜你喜欢

转载自blog.csdn.net/fxzzq/article/details/126027955