@Controller

您可以通过使用标准的 Spring bean 定义来定义控制器 bean。 @Controller 构造型允许自动检测,并与 Spring 在类路径中检测 @Component 类并为其自动注册 bean 定义的通用支持保持一致。 它还充当带注解类的构造型,指示其作为 Web 组件的角色。 要启用此类 @Controller bean 的自动检测,您可以在 Java 配置中添加组件扫描, 如以下示例所示:

Java
@Configuration
@ComponentScan("org.example.web") [id="CO1-1"][id="CO1-1"][id="CO1-1"](1)
public class WebConfiguration {

	// ...
}
<1>  扫描 `org.example.web` 包。
Kotlin
@Configuration
@ComponentScan("org.example.web") [id="CO2-1"][id="CO1-2"][id="CO2-1"](1)
class WebConfiguration {

	// ...
}
<1>  扫描 `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 注解。