声明

您可以通过在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注释。