对于注解的理解

问题描述

@DubboProvider 是 自定义注解。其定义如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface DubboProvider {
    @AliasFor(annotation = Component.class, attribute = "value")
    String value() default "";
}

看了上边的一堆东西,你估计不太了解这个东西,上边这一堆东西,到底是啥?个人理解拆分为3块

1) @Target、@Retention、@Documented 注解

这三个是 java 中的元注解,看java中的定义如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}


@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
 
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {


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

以上四个,都是java中元注解(java8中 添加了Repeatable 注解,自动百度),你可能现在有点云里雾里o.o,注解是什么?元注解是什么?

注解:描述数据(代码本身也是一种数据)的数据(你也可以理解为代码的标签,表明代码是什么用途)

元注解:也是一种注解,只能标记(此处用标记,你可以理解注解是一种标签,那么它的作用就是标记)注解的注解。

对于上边 4 个元注解的具体用法,可以参考下边的文章:

https://www.cnblogs.com/huajiezh/p/5263849.html

https://blog.csdn.net/briblue/article/details/73824058

 

2)@Component 注解 

看到这,你应该能知道 注解 和 元注解了,那么 元注解 干嘛呢?我们来看看 @Component 的定义

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {

   /**
    * The value may indicate a suggestion for a logical component name,
    * to be turned into a Spring bean in case of an autodetected component.
    * @return the suggested component name, if any (or empty String otherwise)
    */
   String value() default "";

}

从上边可以得知,Component 是通过 元注解 标记(也理解为 通过元注解 组合)来生成的,那么可以把它叫做:一个由元注解组合而成的注解 – 组合注解

关于组合注解,可以参考下边的问题:

https://blog.csdn.net/qq_26525215/article/details/53523970

 

 

3)@AliasFor 注解 

它也是一种组合注解,那么它的具体用法可以参考

https://blog.csdn.net/wolfcode_cn/article/details/80654730


----------------------------------------------------------------------------------- 

说了这么多,根据个人理解,总结如下:

1、注解是一系列元数据(可以为代码的标签,也就是用来描述数据(代码本身也是一种数据)的数据)

2、使用自定义注解,可以明确类别,提高可读性

3、给以后做扩展带来一些方便(比如dubbo这一类操作,需要统一做一些操作)

 

还有一些参考文章:

java中的注解

http://www.jasongj.com/2016/01/17/Java1_%E6%B3%A8%E8%A7%A3Annotation

https://www.jianshu.com/p/e9329c8a59c2

 

元注解&组合注解:

https://www.hifreud.com/2017/06/27/spring-boot-08-composite-annotation

https://www.cnblogs.com/ludashi/p/6598806.html

http://wemedia.ifeng.com/13639490/wemedia.shtml

https://cloud.tencent.com/developer/article/1018008

https://cn.aliyun.com/jiaocheng/800260.html

https://www.cnblogs.com/MaxElephant/p/8086810.html

https://blog.csdn.net/qq_26525215/article/details/53523970

https://blog.csdn.net/xiaolyuh123/article/details/66968883

 

java8中新增注解@repeatable:

https://yanbin.blog/java8-repeatable-annotations

https://blog.csdn.net/aitangyong/article/details/54346342

posted @ 2018-09-26 01:15  fight-ing  阅读(537)  评论(0编辑  收藏  举报
Fork me on GitHub