Spring은 JSR-330 표준 어노테이션(종속성 주입)을 지원합니다. 이러한 어노테이션은 Spring 어노테이션과 동일한 방식으로 스캔됩니다. 이를 사용하려면 클래스패스에 관련 jar 파일이 있어야 합니다.
[Note]
Maven을 사용하는 경우jakarta.inject
아티팩트는 표준 Maven 저장소(https://repo.maven.apache.org/maven2/jakarta/inject/jakarta.inject-api/2.0.0/)에서 사용할 수 있습니다. pom.xml 파일에 다음 종속성을 추가할 수 있습니다.<dependency> <groupId>jakarta.inject</groupId> <artifactId>jakarta.inject-api</artifactId> <version>2.0.0</version> </dependency>
@Inject
and @Named
@Autowired
대신 다음과 같이 @jakarta.inject.Inject
를 사용할 수 있습니다.
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(...);
// ...
}
}
@Autowired
와 마찬가지로 필드 수준, 메서드 수준 및 생성자-인수 수준에서 @Inject
를 사용할 수 있습니다. 또한 주입 지점을 Provider
로 선언하여 더 짧은 범위의 Bean에 대한 on-demand 액세스를 허용하거나 Provider.get()
호출을 통해 다른 Bean에 대한 lazy 액세스를 허용할 수 있습니다. 다음 예에서는 이전 예의 변형을 제공합니다.
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(...);
// ...
}
}
주입되어야 하는 종속성에 대해 정규화된 이름을 사용하려면 다음 예제와 같이 @Named
어노테이션을 사용해야 합니다.
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;
}
// ...
}
@Autowired
와 마찬가지로 @Inject
도 java.util.Optional
또는 @Nullable
과 함께 사용할 수 있습니다. @Inject
에는 필수 속성(attribute)이 없기 때문에 이는 여기에서 훨씬 더 적용 가능합니다. 다음 예제 쌍은 @Inject
및 @Nullable
을 사용하는 방법을 보여줍니다.
public class SimpleMovieLister {
@Inject
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
// ...
}
}
public class SimpleMovieLister {
@Inject
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
// ...
}
}
@Named
and @ManagedBean
: Standard Equivalents to the @Component
Annotation@Component
대신 다음 예제와 같이 @jakarta.inject.Named
또는 jakarta.annotation.ManagedBean
을 사용할 수 있습니다.
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;
}
// ...
}
컴포넌트의 이름을 지정하지 않고 @Component
를 사용하는 것은 매우 일반적입니다. @Named
는 다음 예제와 같이 비슷한 방식으로 사용될 수 있습니다.
import jakarta.inject.Inject;
import jakarta.inject.Named;
@Named
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
@Named
또는 @ManagedBean
을 사용하면 다음 예제와 같이 Spring 어노테이션을 사용할 때와 정확히 동일한 방식으로 구성 요소 검색을 사용할 수 있습니다.
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
// ...
}
[Note]
@Component
와 달리 JSR-330@Named
및 JSR-250@ManagedBean
어노테이션은 구성 가능하지 않습니다(not composable). 사용자 정의 컴포넌트 어노테이션을 작성하려면 Spring의 스테레오타입 모델을 사용해야 합니다.
표준 어노테이션으로 작업할 때 다음 표에 표시된 것처럼 일부 중요한 기능을 사용할 수 없다는 점을 알아야 합니다.
Spring | jakarta.inject.* | jakarta.inject 제한 사항 / 설명 |
---|---|---|
@Autowired |
@Inject |
|
@Component |
@Named / @ManagedBean |
JSR-330은 구성 가능한 모델을 제공하지 않고 명명된 구성 요소를 식별하는 방법만 제공합니다. |
@Scope("singleton") |
@Singleton |
JSR-330의 기본 범위는 Spring의 |
@Qualifier |
@Qualifier / @Named |
|
@Value |
- |
해당 없음 |
@Lazy |
- |
해당 없음 |
ObjectFactory |
Provider |
|