Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 注释是否适用于子类?_Java_Spring Mvc_Inheritance_Annotations - Fatal编程技术网

Java 注释是否适用于子类?

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 = "

我想知道这一点有一段时间了,但没有找到任何关于这个主题的东西

假设我正在使用SpringMVC并定义一系列
控制器

@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一些信任。它不会做这样的事情。