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

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

结论是:web

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

 

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

本身也试了一下,发现子类若是覆盖父类的方法,确实不能继承被覆盖方法的注解。app

 

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

如下是实验时写的代码:maven

 

父类:spring-boot

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:spa

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  执行的是子类内的逻辑。

相关文章
相关标签/搜索