SpringMVC 类内部的RequestMapping注解能否被继承?
2024-09-27 14:12:49
首先注意标题,说的是类内部的注解
结论是:
不能,但是子类却可以享有父类中该注解带来的效果。
看了一下这个: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 执行的是子类内的逻辑。
最新文章
- AngularJs之五
- HTML5+javascript实现图片加载进度动画效果
- C++编程开发学习的50条建议(转)
- leetcode:Reverse Bits
- (转载) jQuery 页面加载初始化的方法有3种
- linux网址
- Redis 上实现的分布式锁
- 用《VisualStudio命令提示》生成WSDL客户端文件
- 分布式缓存Hazelcast案例一
- Ubuntu16.04安装Redis并配置
- Nginx+Keepalived部署
- JAVA泛型中的类型擦除及为什么不支持泛型数组
- javaBean转为json
- Android无法访问本地服务器(localhost/127.0.0.1)的解决方案
- AngularJS 路由 resolve属性
- AJAX(Jquery)
- 一个web应用的诞生(3)--美化一下
- RESTful API &; Swagger入门
- Python开发【第五篇】迭代器、生成器、递归函数、二分法
- MySQL之mysql命令使用详解
热门文章
- 探秘C#中的yield关键字
- 平时常用的Visual Studio操作技巧,持续更新中&hellip;&hellip;
- JavaScript对于函数的调用及原理
- Java读取properties配置文件时,中文乱码解决方法
- Solution Explorer 和 Source Control Explorer 的 View History 异同
- google protocol buffer的原理和使用(二)
- crtmpserver实现防盗流和流推送验证 之二
- SQL基础(二):SQL命令
- operator++()和operator++(int)的区别
- 升级mojave后的小问题解决