宣告

您可以在 Servlet 的 WebApplicationContext 中使用標準的 Spring bean 定義來定義控制器 bean。`@Controller` 註解是一種原型(stereotype),它允許自動檢測,與 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)`;使用 `` 時,您可以改為 ``。

請注意,從 6.0 版本開始,使用介面代理時,Spring MVC 不再僅根據介面上的型別級別 `@RequestMapping` 註解來檢測控制器。請啟用基於類的代理,否則介面也必須帶有 `@Controller` 註解。