Using JSR 330 Standard Annotations

2024. 11. 14. 19:43Spring 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

표준 애노테이션을 사용할 때, 몇 가지 중요한 기능이 제공되지 않는다는 점을 알아두어야 합니다. 다음 테이블은 이러한 기능들을 보여줍니다:

Table 1. Spring component model elements versus JSR-330 variants
  
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