• SpringMVC 类内部的RequestMapping注解能否被继承?


    首先注意标题,说的是内部的注解

    结论是:

    不能,但是子类却可以享有父类该注解带来的效果。

    看了一下这个:http://elf8848.iteye.com/blog/1621392

    自己也试了一下,发现子类如果覆盖父类的方法,确实不能继承被覆盖方法的注解。

    但是试了一下spring的注解,即便该注解没有被继承到子类上,子类同样能享有这个注解带来的效果,这可能和spring的注解扫描和bean加载机制有关,有时间看看源码吧,这里先记一下。

    以下是实验时写的代码:

    父类:

    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.PostConstruct;
    import java.util.UUID;
    
    @RestController
    @ConditionalOnMissingBean(name = "extDemoController")
    public class DemoController {
        @PostConstruct
        public void init(){
            System.out.println("---------------DemoController init---------------");
        }
        @Autowired
        protected OneBean oneBean;
        @RequestMapping("/random")
        public String random(){
            return UUID.randomUUID().toString();
        }
    }

    子类:

    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.UUID;
    
    @RestController
    public class ExtDemoController extends DemoController {
    
        public void init(){
            System.out.println("---------------ExtDemoController init---------------");
        }
    
        public String random(){
            System.out.println(oneBean.hello());
            return "random from ExtDemoController";
        }
    
    }

    测试代码1:

    package com.example.demo;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.lang.reflect.Method;
    
    public class CustomTest {
        public static void main(String[] args) throws NoSuchMethodException {
            Class<ExtDemoController> clazz = ExtDemoController.class;
            Method method = clazz.getMethod("random",new Class[]{});
            if(method.isAnnotationPresent(RequestMapping.class)){
                RequestMapping oneAnnotation = method.getAnnotation(RequestMapping.class);
                System.out.println(oneAnnotation.name());
            }
        }
    }

    测试代码2:

    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Bean;
    
    @SpringBootApplication
    //@EnableConfigurationProperties(FirstConfig.class)
    public class DemoApplication {
    
        public static void main(String[] args) {
            ApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
            for(String name:ctx.getBeanDefinitionNames()){
                System.out.println(name);
            }
        }
    }

    测试说明:

    这是一个普通的springboot项目,maven里只引入了

    spring-boot-starter-web

    项目可以用 http://start.spring.io/ 生成。

    测试步骤:

    执行测试代码1,发现注解不能被子类继承。

    执行测试代码2,发现子类虽未继承父类内部的三种注解,但是却完全可以享有它们的功能。即访问  /random  执行的是子类内的逻辑。

     
  • 相关阅读:
    C++ Primer 学习笔记
    闷热的北京
    EasyUI实现购物车、菜单和窗口栏等最常用的用户界面功能.
    详细解读-this-关键字在全局、函数、对象、jQuery等中的基础用法!
    对于JavaScript原生的JS
    关于JavaScript原生的JS。工作接近一年,发现对于原生JS的基础内容总是不够掌握,特定抽出三个周的周末,结合本人的工作经验还有菜鸟教程及w3school的基础内容等整理了如下内容。对JS的常用知识进行概括!希望对大家能够有所帮助。
    最简单实用的JQuery实现banner图中的text打字动画效果!!!
    一路慢行的JavaScript之旅(add)!!!
    一路慢行的CSS之旅
    一路慢行的HTML5之旅!
  • 原文地址:https://www.cnblogs.com/flying607/p/8295139.html
Copyright © 2020-2023  润新知