宣告
您可以使用 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"/>。
請記住,從 6.0 版本開始,對於介面代理,Spring MVC 不再僅僅基於介面上的型別級別 @RequestMapping 註解來檢測控制器。請啟用基於類的代理,否則介面也必須具有 @Controller 註解。 |