宣言

サーブレットの WebApplicationContext で標準 Spring Bean 定義を使用して、コントローラー Bean を定義できます。@Controller ステレオタイプは、クラスパス内の @Component クラスの検出およびそれらの Bean 定義の自動登録の Spring 一般サポートに合わせて、自動検出を可能にします。また、アノテーション付きクラスのステレオタイプとしても機能し、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 プロキシで装飾する必要があります。1 つの例は、コントローラーに直接 @Transactional アノテーションを付けることを選択した場合です。この場合、特にコントローラーの場合は、クラスベースのプロキシを使用することをお勧めします。これは、コントローラーに直接そのようなアノテーションがある場合に自動的に当てはまります。

コントローラーがインターフェースを実装し、AOP プロキシが必要な場合は、クラスベースのプロキシを明示的に設定する必要があります。例: @EnableTransactionManagement では @EnableTransactionManagement(proxyTargetClass = true) に変更でき、<tx:annotation-driven/> では <tx:annotation-driven proxy-target-class="true"/> に変更できます。

6.0 以降、インターフェースプロキシを使用すると、Spring MVC は、インターフェース上の型レベルの @RequestMapping アノテーションのみに基づいてコントローラーを検出しなくなることに注意してください。クラスベースのプロキシを有効にしてください。有効にしないと、インターフェースにも @Controller アノテーションが必要です。