首先注意标题,说的是类内部的注解
结论是:
不能,但是子类却可以享有父类中该注解带来的效果。
看了一下这个: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 执行的是子类内的逻辑。
本文探讨了Java类内部注解能否在子类中继承的问题,指出常规情况下子类无法直接继承,但Spring注解例外。通过实例展示了Spring注解如何独立于继承而发挥作用。
3158

被折叠的 条评论
为什么被折叠?



