Spring/Spring

[Spring][Core] 3-3. Container: Using JSR 330 Standard Annotations

noahkim_ 2025. 4. 6. 18:46

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() 메서드를 사용.

 


출처