@Controller
您可以使用标准的 Spring bean 定义来定义控制器 bean。@Controller
注解允许自动检测,并且与 Spring 对类路径中 @Component
类的通用检测和自动注册 bean 定义的支持一致。它也作为被注解类的刻板印象(stereotype),指示其作为 Web 组件的角色。
要启用对这类 @Controller
bean 的自动检测,您可以在 Java 配置中添加组件扫描,示例如下:
-
Java
-
Kotlin
@Configuration
@ComponentScan("org.example.web") (1)
public class WebConfiguration {
// ...
}
1 | 扫描 org.example.web 包。 |
@Configuration
@ComponentScan("org.example.web") (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 注解。 |