@Controller
你可以通过使用标准的Spring bean定义来定义控制器bean。@Controller 注解允许自动检测,并与Spring对类路径中检测 @Component 类并为其自动注册bean定义的通用支持保持一致。它也作为被注解类的原型,指示其作为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 注解。 |