JSR 330 標準アノテーションの使用
Spring は、JSR-330 標準アノテーション (依存性注入) のサポートを提供します。これらのアノテーションは、Spring アノテーションと同じ方法でスキャンされます。使用するには、クラスパスに関連する jar が必要です。
Maven を使用する場合、
|
@Inject
および @Named
による依存性注入
@Autowired
の代わりに、次のように @jakarta.inject.Inject
を使用できます。
Java
Kotlin
import jakarta.inject.Inject;
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
public void listMovies() {
this.movieFinder.findMovies(...);
// ...
}
}
import jakarta.inject.Inject
class SimpleMovieLister {
@Inject
lateinit var movieFinder: MovieFinder
fun listMovies() {
movieFinder.findMovies(...)
// ...
}
}
@Autowired
と同様に、フィールドレベル、メソッドレベル、コンストラクター引数レベルで @Inject
を使用できます。さらに、インジェクションポイントを Provider
として宣言して、Provider.get()
呼び出しを介して、より短いスコープの Bean へのオンデマンドアクセスまたは他の Bean への遅延アクセスを許可することができます。次の例は、前述の例の変形を示しています。
Java
Kotlin
import jakarta.inject.Inject;
import jakarta.inject.Provider;
public class SimpleMovieLister {
private Provider<MovieFinder> movieFinder;
@Inject
public void setMovieFinder(Provider<MovieFinder> movieFinder) {
this.movieFinder = movieFinder;
}
public void listMovies() {
this.movieFinder.get().findMovies(...);
// ...
}
}
import jakarta.inject.Inject
class SimpleMovieLister {
@Inject
lateinit var movieFinder: Provider<MovieFinder>
fun listMovies() {
movieFinder.get().findMovies(...)
// ...
}
}
挿入する依存関係に修飾名を使用する場合は、次の例に示すように、@Named
アノテーションを使用する必要があります。
Java
Kotlin
import jakarta.inject.Inject;
import jakarta.inject.Named;
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
import jakarta.inject.Inject
import jakarta.inject.Named
class SimpleMovieLister {
private lateinit var movieFinder: MovieFinder
@Inject
fun setMovieFinder(@Named("main") movieFinder: MovieFinder) {
this.movieFinder = movieFinder
}
// ...
}
@Autowired
と同様に、@Inject
は java.util.Optional
または @Nullable
でも使用できます。@Inject
には required
属性がないため、これはさらに適切です。次の例のペアは、@Inject
と @Nullable
の使用方法を示しています。
public class SimpleMovieLister {
@Inject
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
// ...
}
}
Java
Kotlin
public class SimpleMovieLister {
@Inject
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
// ...
}
}
class SimpleMovieLister {
@Inject
var movieFinder: MovieFinder? = null
}
@Named
および @ManagedBean
: @Component
アノテーションの標準的な同等物
@Component
の代わりに、次の例に示すように、@jakarta.inject.Named
または jakarta.annotation.ManagedBean
を使用できます。
Java
Kotlin
import jakarta.inject.Inject;
import jakarta.inject.Named;
@Named("movieListener") // @ManagedBean("movieListener") could be used as well
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
import jakarta.inject.Inject
import jakarta.inject.Named
@Named("movieListener") // @ManagedBean("movieListener") could be used as well
class SimpleMovieLister {
@Inject
lateinit var movieFinder: MovieFinder
// ...
}
コンポーネントの名前を指定せずに @Component
を使用することは非常に一般的です。@Named
は、次の例に示すように、同様の方法で使用できます。
Java
Kotlin
import jakarta.inject.Inject;
import jakarta.inject.Named;
@Named
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
import jakarta.inject.Inject
import jakarta.inject.Named
@Named
class SimpleMovieLister {
@Inject
lateinit var movieFinder: MovieFinder
// ...
}
@Named
または @ManagedBean
を使用する場合、次の例に示すように、Spring アノテーションを使用する場合とまったく同じ方法でコンポーネントスキャンを使用できます。
Java
Kotlin
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
// ...
}
@Configuration
@ComponentScan(basePackages = ["org.example"])
class AppConfig {
// ...
}
@Component とは対照的に、JSR-330 @Named および JSR-250 @ManagedBean アノテーションは作成できません。カスタムコンポーネントアノテーションを作成するには、Spring のステレオタイプモデルを使用する必要があります。 |
JSR-330 標準アノテーションの制限
標準のアノテーションを使用する場合、次の表に示すように、いくつかの重要な機能が利用できないことを知っておく必要があります。
Spring | jakarta.inject.* | jakarta.inject 制限 / コメント |
---|---|---|
@Autowired | @Inject |
|
@Component | @Named/@ManagedBean | JSR-330 は構成可能なモデルを提供せず、名前付きコンポーネントを識別する方法のみを提供します。 |
@Scope("singleton" ) | @Singleton | JSR-330 のデフォルトのスコープは、Spring の |
@Qualifier | @Qualifier/@Named |
|
@Value | - | 同等のものはありません |
@Lazy | - | 同等のものはありません |
ObjectFactory | プロバイダー |
|