交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • Spring @RestController注解组合实现方法解析

    Spring中存在很多注解组合的情况,例如@RestController

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Controller
    @ResponseBody
    public @interface RestController {
    
    	/**
    	 * 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)
    	 * @since 4.0.1
    	 */
    	@AliasFor(annotation = Controller.class)
    	String value() default "";
    
    }

    @RestController就是@Controller、@ResponseBody两个注解的组合,同时产生两个注解的作用。

    本人一开始以为这是Java的特性,Java能够通过注解上的注解实现自动组合注解的效果。于是写了这样一段代码

    /**
     * @author Fcb
     * @date 2020/6/23
     * @description
     */
    @Documented
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyComponent {
    }
    /**
     * @author Fcb
     * @date 2020/6/23
     * @description
     */
    @Documented
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @MyComponent
    public @interface MyController {
    }
    @MyController
    public class AnnotatedService {
    }

    结果测试发现翻车

    /**
     * @author Fcb
     * @date 2020/6/23
     * @description
     */
    public class Test {
    
      public static void main(String[] args) {
        Annotation[] annotations = AnnotatedService.class.getAnnotations();
        for (Annotation anno : annotations) {
          System.out.println(anno.annotationType());
          System.out.println(anno.annotationType() == MyComponent.class);
        }
      }
    }

    打印结果如下:

    interface com.example.demo.anno.MyController
    false

    经过本人查阅资料,发现我想要的那个注解组合注解的功能是Spring自己实现的。。通过Spring中的AnnotationUtils.findAnnotation(类,注解)方法来判断某个类上是否能找到组合的注解。

    比如现在我想知道AnnotatedService这个类上是否存在@MyComponent注解,毕竟这是我一开始的目的(通过组合减少注解),我可以调用一下代码

    /**
     * @author Fcb
     * @date 2020/6/23
     * @description
     */
    public class Test {
    
      public static void main(String[] args) {
        Annotation[] annotations = AnnotatedService.class.getAnnotations();
        System.out.println(AnnotationUtils.findAnnotation(AnnotatedService.class, MyComponent.class));
      }
    }

    打印如下:

    @com.example.demo.anno.MyComponent()

    假如传入的注解是一个不存在的值,则会返回null,示例如下:

    /**
     * @author Fcb
     * @date 2020/6/23
     * @description
     */
    public class Test {
    
      public static void main(String[] args) {
        Annotation[] annotations = AnnotatedService.class.getAnnotations();
        System.out.println(AnnotationUtils.findAnnotation(AnnotatedService.class, OtherAnno.class));
      }
    }

    控制台打印:

    null

    总结:Java本身没有实现 通过标记注解 来组合注解的功能。假如我们自定义注解时需要可以使用Spring的AnnotationUtils.findAnnotation()的方法帮助我们实现。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持北冥有鱼。


    广而告之:
    热门推荐:
    php读取和保存base64编码的图片内容

    本文实例为大家分享了php读取和保存图片内容的具体代码,供大家参考,具体内容如下 <?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = './4296762_165319032930_2.jpg'; $image_info = getimagesize($image···

    浅谈CSS中display/float/position属性值的相互影响

    有3个属性和布局以及box的创建有关:'display', 'position' 和 'float',彼此交互作用如下: 如果'display'值为'none',则'position' 和 'float'无作用。这种情况下,不生成box。 否则,如果'position'值为'absolute' 或 'fixed', box被绝对定位,'float'的计算值为'none',而'···

    JQuery.uploadify 上传文件插件的使用详解 for ASP.NET

    后来朋友推荐了一个这个叫uploadify的上传插件,似乎挺好,就到官方下了个示例运行,感觉挺好,自己再稍加美化一下就OK 了..! 接下来就讲讲使用过程吧: 1. 下载    官方网站:http://www.uploadify.com/    直接下载:jquery.uploadify-v2.1.0.rar ···

    什么是软件404和404错误 它们之间有什么区别

    首先什么是404 和软404 404:简单说就是当用户输入了一个不存在的页面链接时,返回的页面会用一个404代码来表示。 软404:软404是用户访问的页面不存在时返回的不是一个404错误代码,而是200代码。引导用户继续访问访问网站。 那么他们的区别我想大家已经看出来了: 404:···

    JavaScript编写九九乘法表(两种任选)

    话不多说,请看代码: <script language=javascript> for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ document.write (i+"*"+j+"="+i*j+" "); if(i==j) {document.write ("<br/>"); break;} //用的if语句,如果这两个数字相同了 那么跳出,另起一行 } } <···

    用纯CSS实现禁止鼠标点击事件示例代码

    JavaScript有一个preventDefault方法, 他可用以来取消事件的默认动作。比如取消打开链接,选择文本或拖放等。 复制代码 代码如下: event.preventDefault() 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 “subm···

    php实现汉字验证码和算式验证码的方法

    本文实例讲述了php实现汉字验证码和算式验证码的方法。分享给大家供大家参考。具体分析如下: 大家知道简单数字或者字母验证码很容易被破解,但是算式验证码或者中文汉字验证码不容易被破解, 所以建议大家在使用验证码的时候,尽量用算式验证码或者中文汉字验证码。 下面是我···

    DW怎么做热点链接?dw热点链接制作方法图解

    在平常我们的店铺装修中,经常会遇到在一张图片上做产品链接,或者在一张海报上做产品的链接,在这个时候我们就需要用到DW来给我们做热点链接,方便我们的店铺装修。 步骤 把我们在ps软件中做好的图片先上传到到图片空间,然后复制图片链接,新建一个html的空白页面,把图片链···

    jQuery 表格工具集

    jQuery 表格插件 Flexigrid – Web 2.0 Javscript Grid for jQuery - 可变列宽,自动适应表头宽度,可通过 Ajax 连接 XML 数据源,类似 Ext Grid,但基于 jQuery 因此更轻量小巧。 Chromatable JQuery Plugin - 固定表头,可滚动内容区,内容区滚动的时候表头···

    编写React组件项目实践分析

    当我刚开始写React的时候,我看过很多写组件的方法。一百篇教程就有一百种写法。虽然React本身已经成熟了,但是如何使用它似乎还没有一个“正确”的方法。所以我(作者)把我们团队这些年来总结的使用React的经验总结在这里。希望这篇文字对你有用,不管你是初学者还是老手。 开···