Using JSR 330 Standard Annotations(JSR 330 표준 주석 사용)
Spring 3.0부터 Spring은 JSR-330 표준 주석 (Dependency Injection)을 지원한다.
이러한 주석은 Spring 주석과 동일한 방식으로 스캔됩니다. 클래스 패스에 관련 항아리(jar)가 있어야합니다.
Maven을 사용하는 경우,
javax.inject
이슈는 표준 Maven 저장소 (http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)
에서 사용할 수 있습니다. pom.xml 파일에 다음 종속성을 추가 할 수 있습니다.
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Dependency Injection with @Inject and @Named(@Inject 및 @Named를 사용한 종속성 삽입)
@Autowired
대신 @javax.inject.Inject
를 다음과 같이 사용할 수 있습니다.
import javax.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
를 사용할 수 있습니다.
또한 주입 지점(injection point)을 제공자(Provider)로 선언하여
짧은 범위의 bean에 대한 주문형 액세스(on-demand access) 또는 Provider.get()
호출을 통해
다른 bean에 대한 지연 액세스(lazy access)를 허용 할 수 있습니다.
위 예의 변형 :
import javax.inject.Inject;
import javax.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 javax.inject.Inject;
import javax.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
에는 필수 속성이 없으므로 여기에 더 많이 적용됩니다.
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(@Named 및 @ManagedBean : @Component 주석에 대한 표준 동등 물)
@Component
대신에 @javax.inject.Named
또는 javax.annotation.ManagedBean
을 다음과 같이 사용할 수 있습니다.
import javax.inject.Inject;
import javax.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 javax.inject.Inject;
import javax.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의 스테레오 타입 모델을 사용하십시오.
1.11.3. Limitations of JSR-330 standard annotations(표준 JSR-330 주석의 한계)
표준 주석을 사용하여 작업 할 때, 아래 표와 같이 몇 가지 중요한 기능을 사용할 수 없는지 확인하는 것이 중요합니다.
- 표 6. 스프링 구성 요소 모델 요소 JSR-330 변형
Spring | javax.inject.* | javax.inject restrictions(제한) / comments |
---|---|---|
@Autowired | @Inject | @Inject에는 ‘required’속성이 없습니다. 대신 Java 8의 Optional과 함께 사용할 수 있습니다. |
@Component | @Named / @ManagedBean | JSR-330은 명명 된 구성 요소를 식별 할 수있는 구성 가능한 모델을 제공하지 않습니다. |
@Scope(“singleton”) | @Singleton | JSR-330 기본 범위는 Spring의 프로토 타입과 같습니다. 그러나 Spring의 일반적인 기본값과 일관성을 유지하기 위해 Spring 컨테이너에 선언 된 JSR-330 bean은 기본적으로 싱글 톤입니다. 싱글 톤이 아닌 다른 스코프를 사용하려면 Spring의 @Scope 주석을 사용해야 합니다. javax.inject는 또한 @Scope 어노테이션을 제공합니다. 그럼에도 불구하고, 이것은 사용자 자신의 주석을 작성하는 용도로만 사용됩니다. |
@Qualifier | @Qualifier / @Named | javax.inject.Qualifier는 사용자 지정 한정자를 작성하기위한 메타 - 어노테이션입니다. Concrete String 한정자 (예 : Spring의 @Qualifier와 값)는 javax.inject.Named를 통해 연결할 수 있습니다. |
@Value | - | no equivalent(해당하지 않습니다.) |
@Required | - | no equivalent(해당하지 않습니다.) |
@Lazy | - | no equivalent(해당하지 않습니다.) |
ObjectFactory | Provider | javax.inject.Provider는 Spring의 ObjectFactory에 대한 직접적인 대안이며, get () 메소드 이름이 더 짧습니다. 또한 Spring의 @Autowired와 함께 사용하거나 비 주석으로 된 생성자 및 설정 메소드와 함께 사용할 수도 있습니다. |