Using JSR 330 Standard Annotations

Dev.Hammy·2024년 2월 11일
0

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>

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로 선언하여 더 짧은 범위의 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와 마찬가지로 @Injectjava.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의 스테레오타입 모델을 사용해야 합니다.

Limitations of JSR-330 Standard Annotations

표준 어노테이션으로 작업할 때 다음 표에 표시된 것처럼 일부 중요한 기능을 사용할 수 없다는 점을 알아야 합니다.

표 1. Spring 컴포넌트 모델 요소 대 JSR-330 변형
Spring jakarta.inject.* jakarta.inject 제한 사항 / 설명

@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는 사용자 정의 한정자를 작성하기 위한 메타 주석입니다. 구체적인 String 한정자(값이 있는 Spring의 @Qualifier와 같은)는 jakarta.inject.Named를 통해 연관시킬 수 있습니다.

@Value

-

해당 없음

@Lazy

-

해당 없음

ObjectFactory

Provider

jakarta.inject.Provider는 Spring의 ObjectFactory와 직접적인 대체품입니다. 단지 더 짧은 get() 메서드 이름을 가지고 있습니다. 또한 Spring의 @Autowired나 주석이 없는 생성자 및 setter 메서드와 함께 사용할 수 있습니다.

0개의 댓글

관련 채용 정보