@Autowired
を使用する
次の例に示すように、@Autowired
アノテーションをコンストラクターに適用できます。
Java
Kotlin
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
class MovieRecommender @Autowired constructor(
private val customerPreferenceDao: CustomerPreferenceDao)
Spring Framework 4.3 以降、ターゲット Bean が最初にコンストラクターを 1 つだけ定義している場合、そのようなコンストラクターに対する |
次の例に示すように、@Autowired
アノテーションを従来の setter メソッドに適用することもできます。
Java
Kotlin
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
class SimpleMovieLister {
@set:Autowired
lateinit var movieFinder: MovieFinder
// ...
}
次の例に示すように、任意の名前と複数の引数を持つメソッドにアノテーションを適用することもできます。
Java
Kotlin
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
class MovieRecommender {
private lateinit var movieCatalog: MovieCatalog
private lateinit var customerPreferenceDao: CustomerPreferenceDao
@Autowired
fun prepare(movieCatalog: MovieCatalog,
customerPreferenceDao: CustomerPreferenceDao) {
this.movieCatalog = movieCatalog
this.customerPreferenceDao = customerPreferenceDao
}
// ...
}
次の例に示すように、@Autowired
をフィールドにも適用し、コンストラクターと組み合わせることもできます。
Java
Kotlin
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
private MovieCatalog movieCatalog;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
class MovieRecommender @Autowired constructor(
private val customerPreferenceDao: CustomerPreferenceDao) {
@Autowired
private lateinit var movieCatalog: MovieCatalog
// ...
}
ターゲットコンポーネント(たとえば、 クラスパススキャンを介して検出された XML 定義の Bean またはコンポーネントクラスの場合、コンテナーは通常、事前に具象型を認識します。ただし、 |
4.3 以降、 |
次の例に示すように、ApplicationContext
から特定の型のすべての Bean を提供するように Spring に指示して、@Autowired
アノテーションをその型の配列を想定するフィールドまたはメソッドに追加することもできます。
Java
Kotlin
public class MovieRecommender {
@Autowired
private MovieCatalog[] movieCatalogs;
// ...
}
class MovieRecommender {
@Autowired
private lateinit var movieCatalogs: Array<MovieCatalog>
// ...
}
次の例に示すように、型付きコレクションにも同じことが当てはまります。
Java
Kotlin
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var movieCatalogs: Set<MovieCatalog>
// ...
}
配列またはリスト内の項目を特定の順序でソートする場合、ターゲット Bean は
構成クラスの 標準の |
予想されるキー型が String
である限り、型された Map
インスタンスでさえオートワイヤーできます。次の例に示すように、マップ値には予想される型のすべての Bean が含まれ、キーには対応する Bean 名が含まれます。
Java
Kotlin
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var movieCatalogs: Map<String, MovieCatalog>
// ...
}
デフォルトでは、特定のインジェクションポイントに一致する候補 Bean がない場合、オートワイヤーは失敗します。宣言された配列、コレクション、マップの場合、少なくとも 1 つの一致する要素が期待されます。
デフォルトの動作では、アノテーション付きのメソッドとフィールドを必要な依存関係を示すものとして扱います。次の例に示すように、この動作を変更して、フレームワークが不必要なものとしてマークすることで不満足なインジェクションポイントをスキップできるようにします(つまり、@Autowired
の required
属性を false
に設定することにより)。
Java
Kotlin
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired(required = false)
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
class SimpleMovieLister {
@Autowired(required = false)
var movieFinder: MovieFinder? = null
// ...
}
依存関係(または、複数の引数の場合はその依存関係の 1 つ)が利用できない場合、非必須メソッドはまったく呼び出されません。このような場合、必須ではないフィールドはまったく入力されず、デフォルト値がそのまま残ります。 つまり、 |
@Autowired
の required
属性は、複数のコンストラクターを処理する可能性のある Spring のコンストラクター解決アルゴリズムのために、注入されたコンストラクターとファクトリメソッドの引数は特別な場合があります。コンストラクターとファクトリメソッドの引数はデフォルトで効果的に必要ですが、単一のコンストラクターシナリオでは、一致する Bean が利用できない場合に空のインスタンスに解決する複数要素のインジェクションポイント(配列、コレクション、マップ)などのいくつかの特別なルールがありますこれにより、すべての依存関係を一意の複数引数コンストラクターで宣言できる共通の実装パターンが可能になります。たとえば、@Autowired
アノテーションなしで単一の public コンストラクターとして宣言できます。
特定の Bean クラスの 1 つのコンストラクターのみが、 |
または、次の例に示すように、Java 8 の java.util.Optional
を使用して、特定の依存関係の不要な性質を表現できます。
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
Spring Framework 5.0 の時点で、@Nullable
アノテーション (任意のパッケージ内の任意の種類 — たとえば、JSR-305 の javax.annotation.Nullable
) を使用するか、Kotlin 組み込みの null 安全サポートを利用することもできます。
Java
Kotlin
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
...
}
}
class SimpleMovieLister {
@Autowired
var movieFinder: MovieFinder? = null
// ...
}
よく知られている解決可能な依存関係であるインターフェースに @Autowired
を使用することもできます: BeanFactory
、ApplicationContext
、Environment
、ResourceLoader
、ApplicationEventPublisher
、MessageSource
。これらのインターフェースと、ConfigurableApplicationContext
や ResourcePatternResolver
などの拡張インターフェースは、特別な設定を必要とせずに自動的に解決されます。次の例では、ApplicationContext
オブジェクトをオートワイヤーします。
Java
Kotlin
public class MovieRecommender {
@Autowired
private ApplicationContext context;
public MovieRecommender() {
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var context: ApplicationContext
// ...
}
|