声明

您可以使用 Servlet 的 `WebApplicationContext` 中的标准 Spring bean 定义来定义控制器 bean。`@Controller` 构造型允许自动检测,与 Spring 对在类路径中检测 `@Component` 类并为其自动注册 bean 定义的一般支持保持一致。它也充当带注解类的构造型,指示其作为 Web 组件的角色。

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

  • Java

  • Kotlin

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

	// ...
}
@Configuration
@ComponentScan("org.example.web")
class WebConfig {

	// ...
}

以下示例显示了前面示例的 XML 配置等效项

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		https://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="org.example.web"/>

	<!-- ... -->

</beans>

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