@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 ではなくプライマリ型の一致を検出し、よく知られている解決可能な依存関係である BeanFactory
、ApplicationContext
、ResourceLoader
、ApplicationEventPublisher
、MessageSource
インターフェースを解決します。
次の例では、customerPreferenceDao
フィールドは最初に "customerPreferenceDao" という名前の Bean を検索し、次に型 CustomerPreferenceDao
のプライマリ型 マッチにフォールバックします。
Java
Kotlin
public class MovieRecommender {
@Resource
private CustomerPreferenceDao customerPreferenceDao;
@Resource
private ApplicationContext context; (1)
public MovieRecommender() {
}
// ...
}
1 | context フィールドは、既知の解決可能な依存関係型 ApplicationContext に基づいて挿入されます。 |
class MovieRecommender {
@Resource
private lateinit var customerPreferenceDao: CustomerPreferenceDao
@Resource
private lateinit var context: ApplicationContext (1)
// ...
}
1 | context フィールドは、既知の解決可能な依存関係型 ApplicationContext に基づいて挿入されます。 |