1. JSR-330 표준 어노테이션 사용
- Spring은 JSR-330 표준 어노테이션(의존성 주입)을 지원합니다.
- Spring은 이 어노테이션들을 Spring 어노테이션과 동일한 방식으로 스캔하여 사용합니다.
- 이를 사용하려면 관련된 JAR 파일이 클래스패스에 있어야 합니다.
의존성 추가 (Maven)
<dependency>
<groupId>jakarta.inject</groupId>
<artifactId>jakarta.inject-api</artifactId>
<version>2.0.0</version>
</dependency>
2. @Inject와 @Named를 사용한 의존성 주입
어노테이션 | 용도 | 설명 |
@Inject | 의존성 주입 |
- @Autowired와 동일한 기능
- required 속성이 없고, Optional 또는 @Nullable과 함께 사용 가능. - Provider와 함께 사용하면 지연 로딩 및 짧은 범위의 빈을 처리할 수 있음. |
@Named | 빈의 이름을 지정하는 데 사용 | - @Component의 표준 대안. - 빈의 이름을 명시적으로 지정할 수 있음. - 이름을 지정하지 않으면 Spring에서 자동으로 생성된 이름이 사용됨. |
@Inject + @Named | 의존성 주입 시 이름을 지정 |
- @Inject와 함께 @Named를 사용하면 특정 이름을 가진 빈을 주입할 수 있음.
|
예시
더보기
// @Inject 예시
@Inject
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// @Named 예시
@Inject
public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
3. @Named와 @ManagedBean: @Component의 표준 대안
어노테이션 | 용도 | 설명 |
@Named | 빈의 이름을 명시적으로 지정 | - @Component의 표준 대안. - 빈의 이름을 명시적으로 지정할 수 있음. - 이름을 지정하지 않으면 Spring에서 자동으로 생성된 이름이 사용됨. |
@ManagedBean | Java EE 6의 관리 빈을 정의하는 데 사용 |
- @Named와 동일한 역할
- 빈의 이름을 명시적으로 지정할 수 있음. - Spring에서는 @Named로 대체 가능. |
@Named + @ManagedBean | 둘 다 동일한 목적을 가지고 있지만, Spring에서는 @Named를 선호 |
- Spring에서는 @Named로 대체하여 사용.
|
4. 제한 사항
Spring | jakarta.inject.* | 제한사항 / 설명 |
@Autowired | @Inject |
@Inject에는 required 속성이 없음.
Optional로 사용 가능. |
@Component | @Named @ManagedBean |
JSR-330은 이름을 지정할 수 있음
컴포넌트를 조합하는 기능은 제공하지 않음. |
@Scope("singleton") | @Singleton |
JSR-330의 기본 스코프는 프로토타입과 유사
Spring에서는 기본적으로 싱글톤으로 처리됨. |
@Qualifier | @Qualifier @Named |
JSR-330에서 @Qualifier는 사용자 정의 퀄리파이어를 만들 때 사용.
Spring의 @Qualifier와 유사. 값에 대한 명시적 지정은 @Named로 처리. |
@Value | - |
JSR-330에는 @Value와 유사한 기능이 없음.
|
@Lazy | - |
JSR-330에는 @Lazy와 유사한 기능이 없음.
|
ObjectFactory | Provider |
Provider는 Spring의 ObjectFactory와 동일한 기능을 제공
get() 메서드를 사용. |
출처