2024. 11. 14. 19:43ㆍSpring Framework/Spring IoC
Spring은 JSR-330 표준 애노테이션(의존성 주입)을 지원합니다. 이러한 애노테이션은 Spring 애노테이션과 동일한 방식으로 스캔됩니다. 이를 사용하려면 관련 JAR 파일이 클래스패스에 포함되어 있어야 합니다.
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>
Dependency Injection with @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로 선언하여, 짧은 스코프의 빈에 대한 온디맨드 접근이나 Provider.get() 호출을 통한 다른 빈에 대한 지연 접근을 허용할 수 있습니다. 다음 예제는 앞의 예제의 변형을 제공합니다.
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는 required 속성이 없기 때문에 이러한 사용이 더 유용할 수 있습니다. 다음 두 가지 예제는 @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 {
// ...
}
@Component와 달리, JSR-330의 @Named와 JSR-250의 @ManagedBean 애노테이션은 구성 가능하지 않습니다. 사용자 정의 컴포넌트 애노테이션을 작성하려면 Spring의 stereotype 모델을 사용해야 합니다.
Limitations of JSR-330 Standard Annotations
표준 애노테이션을 사용할 때, 몇 가지 중요한 기능이 제공되지 않는다는 점을 알아두어야 합니다. 다음 테이블은 이러한 기능들을 보여줍니다:
Spring | jakarta.inject.* | jakarta.inject restrictions / comments |
@Autowired | @Inject | @Inject에는 required 속성이 없습니다. 대신 Java 8의 Optional과 함께 사용할 수 있습니다. |
@Component | @Named / @ManagedBean | JSR-330은 구성 가능한 모델을 제공하지 않고, 이름이 지정된 컴포넌트를 식별하는 방법만 제공합니다. |
@Scope("singleton") | @Singleton | JSR-330의 디폴트 스코프는 Spring의 prototype과 유사합니다. 하지만 Spring의 일반적인 디폴트 값과 일관성을 유지하기 위해 Spring 컨테이너에 선언된 JSR-330 빈은 디폴트로 singleton입니다. singleton 이외의 스코프를 사용하려면 Spring의 @Scope 애노테이션을 사용해야 합니다. jakarta.inject에서도 jakarta.inject.Scope 애노테이션을 제공하지만, 이는 사용자 정의 애노테이션을 생성할 때만 사용하도록 되어 있습니다. |
@Qualifier | @Qualifier / @Named | jakarta.inject.Qualifier는 단순히 사용자 정의 Qualifier를 생성하기 위한 메타 애노테이션입니다. 구체적인 문자열 Qualifier(Spring의 @Qualifier에 값을 지정하는 방식과 같은)는 jakarta.inject.Named를 통해 지정할 수 있습니다. |
@Value | - | 대응하는 기능이 없음 |
@Lazy | - | 대응하는 기능이 없음 |
ObjectFactory | Provider | jakarta.inject.Provider는 Spring의 ObjectFactory에 대한 직접적인 대안이며, 더 짧은 get() 메서드 이름을 갖고 있습니다. 또한 Spring의 @Autowired와 함께 사용하거나 애노테이션이 없는 생성자와 세터 메서드와도 함께 사용할 수 있습니다. |
'Spring Framework > Spring IoC' 카테고리의 다른 글
Using CustomAutowireConfigure (0) | 2024.11.14 |
---|---|
Using Generics as Autowiring Qualifiers (0) | 2024.11.14 |
Container Extension Points (3) | 2024.11.14 |
Classpath Scanning and Managed Components (1) | 2024.11.14 |
Customizing the Nature of a Bean (0) | 2024.11.14 |