声明
你可以通过在Servlet的WebApplicationContext中使用标准的Spring Bean定义来定义控制器bean。@Controller这个注解允许自动检测,这与Spring对类路径中@Component类的自动检测及其Bean定义的自动注册是一致的。它同时也作为被标注类的一个标识,表明其作为Web组件的角色。
要启用对此类@Controller bean的自动检测,你可以在Java配置中添加组件扫描功能,如下例所示:
- Java
- Kotlin
- Xml
@Configuration
@ComponentScan("org.example.web")
public class WebConfiguration {
// ...
}
@Configuration
@ComponentScan("org.example.web")
class WebConfiguration {
// ...
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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"/>。
请注意,从Spring MVC 6.0开始,由于引入了接口代理机制,Spring MVC不再仅根据接口上@RequestMapping注解的类型来检测控制器。请启用基于类的代理机制,否则该接口还必须带有@Controller注解。