最新の安定バージョンについては、Spring Framework 6.2.10 を使用してください!

アノテーションベースのコンテナー構成

Spring を構成するためのアノテーションは XML よりも優れていますか?

アノテーションベースの構成の導入により、このアプローチが XML よりも「優れている」かどうかという疑問が生じました。短い答えは「それは依存します」です。長い答えは、各アプローチには長所と短所があり、通常、どの戦略がより適しているかを決定するのは開発者次第です。それらが定義される方法のために、アノテーションは宣言で多くのコンテキストを提供し、より短くより簡潔な構成につながります。ただし、XML は、ソースコードに触れたり、再コンパイルしたりすることなく、コンポーネントの接続に優れています。ソースに近い接続を好む開発者もいれば、アノテーション付きクラスはもはや POJO ではなく、さらに構成が分散化され制御が難しくなると主張する開発者もいます。

どのような選択をしても、Spring は両方のスタイルに対応でき、さらに組み合わせることもできます。Spring では、JavaConfig オプションを使用することで、ターゲットコンポーネントのソースコードに触れることなく、非侵襲的な方法でアノテーションを使用できること、およびツールの観点から、すべての構成スタイルが Visual Studio Code、Theia、Pleiades All in One (JDK, STS, Lombok 付属) または Spring Tools (英語) によってサポートされていることを指摘する価値があります。

XML セットアップに代わるものとして、XML 宣言の代わりにバイトコードメタデータを使用してコンポーネントを接続するアノテーションベースの構成が提供されます。XML を使用して Bean 接続を記述する代わりに、開発者は、関連するクラス、メソッド、フィールド宣言でアノテーションを使用して、構成をコンポーネントクラス自体に移動します。サンプル: AutowiredAnnotationBeanPostProcessor で記述されていたように、BeanPostProcessor をアノテーションと組み合わせて使用することは、Spring IoC コンテナーを継承する一般的な手段です。例: @Autowired アノテーションは、オートワイヤーのコラボレーターで説明されているのと同じ機能を提供しますが、よりきめ細かな制御とより広い適用性を備えています。さらに、Spring は @PostConstruct や @PreDestroy などの JSR-250 アノテーションのサポートと、@Inject や @Named などの jakarta.inject パッケージに含まれる JSR-330 (Java の依存性注入) アノテーションのサポートを提供します。これらのアノテーションの詳細については、関連するセクションを参照してください。

アノテーション注入は、XML 注入の前に実行されます。XML 構成は、両方のアプローチで接続されたプロパティのアノテーションをオーバーライドします。

通常どおり、ポストプロセッサーを個別の Bean 定義として登録できますが、XML ベースの Spring 構成に次のタグを含めることで暗黙的に登録することもできます(context 名前空間が含まれていることに注意してください)。

<?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: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:annotation-config/>

</beans>

<context:annotation-config/> 要素は、次のポストプロセッサーを暗黙的に登録します。

<context:annotation-config/> は、定義されているのと同じアプリケーションコンテキストで Bean のアノテーションのみを検索します。つまり、<context:annotation-config/> を DispatcherServlet の WebApplicationContext に配置すると、コントローラーでは @Autowired Bean のみがチェックされ、サービスはチェックされません。詳細については、DispatcherServlet を参照してください。