@Resource による注入

Spring は、フィールドまたは Bean プロパティ setter メソッドで JSR-250 @Resource アノテーション(jakarta.annotation.Resource)を使用した注入もサポートしています。これは、Jakarta EE の一般的なパターンです。たとえば、JSF 管理の Bean および JAX-WS エンドポイントです。Spring は、Spring 管理オブジェクトに対してもこのパターンをサポートしています。

@Resource は名前属性を取ります。デフォルトでは、Spring はその値を、挿入される Bean 名として解釈します。つまり、次の例に示すように、名前によるセマンティクスに従います。

  • Java

  • Kotlin

public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Resource(name="myMovieFinder") (1)
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
}
1 この行は @Resource を注入します。
class SimpleMovieLister {

	@Resource(name="myMovieFinder") (1)
	private lateinit var movieFinder:MovieFinder
}
1 この行は @Resource を注入します。

名前が明示的に指定されていない場合、デフォルト名はフィールド名または setter メソッドから派生します。フィールドの場合、フィールド名を取ります。setter メソッドの場合、Bean プロパティ名を取ります。次の例では、movieFinder という名前の Bean を setter メソッドに挿入します。

  • Java

  • Kotlin

public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Resource
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}
}
class SimpleMovieLister {

	@set:Resource
	private lateinit var movieFinder: MovieFinder

}
アノテーションで提供される名前は、CommonAnnotationBeanPostProcessor が認識している ApplicationContext によって Bean 名として解決されます。Spring の SimpleJndiBeanFactory (Javadoc) を明示的に構成すると、JNDI を介して名前を解決できます。ただし、デフォルトの動作に依存し、Spring の JNDI ルックアップ機能を使用して間接性のレベルを維持することをお勧めします。

明示的な名前が指定されていない @Resource の使用の排他的なケースでは、@Autowired と同様に、@Resource は、特定の名前の Bean ではなくプライマリ型の一致を検出し、よく知られている解決可能な依存関係である BeanFactoryApplicationContextResourceLoaderApplicationEventPublisherMessageSource インターフェースを解決します。

次の例では、customerPreferenceDao フィールドは最初に "customerPreferenceDao" という名前の Bean を探し、次に型 CustomerPreferenceDao に一致するプライマリ型にフォールバックします。

  • Java

  • Kotlin

public class MovieRecommender {

	@Resource
	private CustomerPreferenceDao customerPreferenceDao;

	@Resource
	private ApplicationContext context; (1)

	public MovieRecommender() {
	}

	// ...
}
1context フィールドは、既知の解決可能な依存関係型 ApplicationContext に基づいて挿入されます。
class MovieRecommender {

	@Resource
	private lateinit var customerPreferenceDao: CustomerPreferenceDao


	@Resource
	private lateinit var context: ApplicationContext (1)

	// ...
}
1context フィールドは、既知の解決可能な依存関係型 ApplicationContext に基づいて挿入されます。