跳到主要内容

声明

DeepSeek V3 中英对照 Declaration

你可以通过在 Servlet 的 WebApplicationContext 中使用标准的 Spring bean 定义来定义控制器 bean。@Controller 注解允许自动检测,这与 Spring 对在类路径中检测 @Component 类的通用支持一致,并自动为它们注册 bean 定义。它还作为被注解类的原型,表明其作为 Web 组件的角色。

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

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

// ...
}
java

@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 MVC 不再仅根据接口上的类型级 @RequestMapping 注解来检测控制器。请启用基于类的代理,否则接口也必须具有 @Controller 注解。