跳到主要内容

@Controller

ChatGPT-4o-mini 中英对照 @Controller @Controller

您可以通过使用标准的 Spring bean 定义来定义控制器 bean。@Controller 别名允许自动检测,并与 Spring 对在类路径中检测 @Component 类的通用支持相一致,并为它们自动注册 bean 定义。它还作为注解类的别名,指示其作为 web 组件的角色。

为了启用对这样的 @Controller bean 的自动检测,您可以在 Java 配置中添加组件扫描,如下例所示:

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

// ...
}
java
  • 扫描 org.example.web 包。

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

AOP 代理

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

如果控制器实现了一个接口,并且需要 AOP 代理,您可能需要显式配置基于类的代理。例如,使用 @EnableTransactionManagement 您可以更改为 @EnableTransactionManagement(proxyTargetClass = true),而使用 <tx:annotation-driven/> 您可以更改为 <tx:annotation-driven proxy-target-class="true"/>

备注

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