Java 注释是否适用于子类?
我想知道这一点有一段时间了,但没有找到任何关于这个主题的东西 假设我正在使用SpringMVC并定义一系列Java 注释是否适用于子类?,java,spring-mvc,inheritance,annotations,Java,Spring Mvc,Inheritance,Annotations,我想知道这一点有一段时间了,但没有找到任何关于这个主题的东西 假设我正在使用SpringMVC并定义一系列控制器 @RestController public abstract class AbstractController { @Resource private Environment env; ... ... } 对于以下内容,注册UserController是否需要@RestController注释 @RequestMapping(value = "
控制器
@RestController
public abstract class AbstractController {
@Resource
private Environment env;
...
...
}
对于以下内容,注册UserController
是否需要@RestController
注释
@RequestMapping(value = "/user")
public class UserController extends AbstractController {
@RequestMapping("value = "", method = RequestMethod.GET)
public ResponseEntity<User> getUser() {
...
return new ResponseEntity<>(user, HttpStatus.OK);
}
}
@RequestMapping(value=“/user”)
公共类UserController扩展了AbstractController{
@RequestMapping(“value=”,method=RequestMethod.GET)
公共响应性getUser(){
...
返回新的响应属性(用户,HttpStatus.OK);
}
}
如果您决定注释为,则为“是”。在本例中,@RestController
未使用@Inherited
元注释定义,因此它不适用于AbstractController
的子类。这里有两个关于类型注释继承的问题
第二个问题
注册UserController
是否需要@RestController
注释
@RequestMapping(value = "/user")
public class UserController extends AbstractController {
@RequestMapping("value = "", method = RequestMethod.GET)
public ResponseEntity<User> getUser() {
...
return new ResponseEntity<>(user, HttpStatus.OK);
}
}
有点牵扯
Spring的概念是:
Spring提供的许多注释都可以用作
元注释在您自己的代码中。元注释只是
可以应用于其他批注的批注
[……]
还可以组合元注释来创建组合注释。
例如,SpringMVC中的@RestController
注释是
由@Controller
和@ResponseBody
组成
但是,组件扫描过程不会为abstract
类生成bean定义。更重要的是,它不会在自身未注释的子类型上发现这些元注释。换句话说,Spring将跳过您的UserController
类型,并且不会为其注册bean定义。(我相信它可以,只是在4.1.7.发行版
时没有)
现在,如果您确实使用@Component
注释您的类型UserController
,以强制Spring生成bean定义,那么处理@ResponseBody
的Spring MVC进程将检测@RestController
超类型上的@RestController
注释
这是在中完成的,使用查找包含处理程序方法的类型上的注释
在提供的类
上查找注释类型
的单个注释
,
遍历其接口、注释和超类如果
注释不存在于给定类本身上
此方法显式地处理类级别的注释,这些注释不是
声明为继承的以及元注释和上的注释
接口
因此,如果你有
@Component
@RequestMapping(value = "/user")
public class UserController extends AbstractController {
Spring将检测并为UserController
生成一个bean。当使用getUser
处理程序方法处理对/user
的请求时,Spring MVC的操作将如同您的类实际被@RestController
注释一样(或@ResponseBy
)
但是,同样在您的情况下,处理程序方法返回的是一个ResponseEntity
。这不是由HandlerMethodReturnValueHandler处理的。对于@responseBy
,它是由处理的
<> >注意>代码>抽象<代码>类,它是超代码类型<>代码>控制器< /C> >类型:如果你有许多子类型也意味着bean,并且<>代码>抽象/<代码>超类型包含<代码> @请求映射< /COD>注释方法,Spring MVC将无法登记你的处理方法,因为它会考虑超级。键入要在它们之间复制的方法。建议回答的增强:指定(或@Controller
或@Component
)可能会导致异常,因为Spring将尝试实例化抽象类。@Andreas您必须给Spring一些信任。它不会做这样的事情。