@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 注解。 |