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