声明

你可以通过在应用的 ApplicationContext 中使用标准的 bean 定义来定义控制器 bean。 @Controller 允许自动检测,与框架通用支持在类路径中检测 @Component 类并自动注册 bean 定义一致。它还作为被注释类的刻板印象,指示其作为 Web 组件的角色。

要启用这些 @Controller bean 的自动检测,你可以将组件扫描添加到你的 Java 配置中,如下例所示:

@Configuration
@ComponentScan("org.example.web")
public class WebConfiguration {

  // ...
}

@RestController 是一个 组合注解, 它本身被 @Controller@ResponseBody 元注释,以指示一个控制器,其每个方法都继承了类型级别的 @ResponseBody 注解, 因此直接写入响应体,而不是通过视图解析和渲染 HTML 模板。

AOP 代理

在某些情况下,你可能需要在运行时用 AOP 代理装饰控制器。一个例子是如果你选择直接在控制器上使用 @Transactional 注解。 当这种情况发生时,对于控制器,我们建议使用基于类的代理。这在控制器上直接使用这些注解时会自动发生。

如果控制器实现了一个接口,并且需要 AOP 代理,你可能需要显式配置基于类的代理。例如,使用 @EnableTransactionManagement 你可以更改为 @EnableTransactionManagement(proxyTargetClass = true)

请注意,从 5.0 开始,使用接口代理时,Web MVC 不再仅基于接口上的类型级别 @RequestMapping 注解来检测控制器。 请启用基于类的代理,或者接口也必须具有 @Controller 注解。