Last updated
Last updated
스프링 3.0부터 스프링은 JSR-330 표준 어노테이션(의존성 주입)을 지원합니다. 이러한 어노테이션은 스프링 어노테이션과 동일한 방식으로 스캔됩니다. 그들을 사용하려면, 클래스 패스에 이것과 관련된 jar가 있어야합니다.
@Autowired
대신에 @javax.inject.Inject를
다음과 같이 사용할 수 있습니다.
@Autowired
와 마찬가지로, 필드 레벨, 메소드 레벨, 생성자 인수 레벨에서 @Inject
를 사용할 수 있습니다. 또한, 주입 지점을 Provider
로 선언하여 짧은 범위의 빈에 대한 주문형 액세스 또는 Provider.get()
호출을 통해 다른 빈에 대한 게으른 액세스를 허용할 수 있습니다. 다음 예제는 앞의 예제의 변형을 제공합니다:
JSR-330의 Provider
ObjectFactory와 같은 개념. 미리 지정된 단순한 팩토리 API를 이용하는 것.
ObjectFactory : 스프링이 미리 정의해둔 팩토리 인터페이스로 XML에 빈으로 등록하거나 @Bean으로 생성한다.
ObjectFactory보다 나은 점은 팩토리 빈을 따로 등록할 필요가 없다는 점. 어노테이션에 의해 Di할 때 Provider를 보고 스프링이 Provider를 구현한 팩토리 오브젝트를 자동으로 만들어서 주입시켜준다.
좁은 범위의 객체를 광범위하게 범위가 지정된 빈에 주입할 때 사용.
삽입해야만 하는 의존성에 대해 정규화된 이름을 사용하려면 다음 예제와 같이 @Named
어노테이션을 사용해야 합니다.
@Autowired
와 마찬가지로 @Inject
는 java.util.Optional
또는 @Nullable
과 함께 사용할 수도 있습니다. @Inject
에는 required
속성이 없으므로 여기에 더 많이 적용됩니다. 다음 예제는@Inject
와 @Nullable
을 사용하는 방법을 보여줍니다:
다음 예제처럼 @Component
대신에 @javax.inject.Named
또는 javax.annotation.ManagedBean
를 사용할 수 있습니다:
@Component(“...”)
XML의 빈으로 등록해달라는 표시. Id는 기본적으로 클래스 명의 첫 글자를 소문자로 해서 지정한다.
구성 요소의 이름을 지정하지 않고 @Component
를 사용하는 것은 매우 일반적입니다. @Named
는 다음 예제와 같이 비슷한 방식으로 사용할 수 있습니다:
@Named
또는 @ManagedBean
을 사용하면, 다음 예제와 같이 스프링 어노테이션을 사용할 때와 완전히 동일한 방식으로 구성 요소 검색을 사용할 수 있습니다:
표준 어노테이션으로 작업할 때 다음 표와 같이 몇 가지 중요한 기능을 사용할 수 없음을 알아야 합니다:
@Component
와 달리, JSR-330 @Named
및 JSR-250 ManagedBean
어노테이션은 조합할 수 없습니다. 커스텀 컴포넌트 어노테이션을 작성하기 위해서는 스프링의 스테레오 타입 모델을 사용해야 합니다.
Spring
javax.inject.*
javax.inject 제한사항 및 코멘트
@Autowired
@Inject
@Inject
에는 ‘required’ 속성이 없습니다. 대신 Java 8의 Optional
과 함께 사용할 수 있습니다.
@Component
@Named / @ManagedBean
JSR-330은 구성 가능한 모델을 제공하지 않으며 명명된 구성 요소를 식별하는 유일한 방법입니다.
@Scope("singleton")
@Singleton
JSR-330 기본 범위는 스프링의 prototype
과 같습니다. 그러나 스프링의 일반적인 기본 값과 일관성을 유지하기 위해 스프링 컨테이너에 선언된 JSR-330 빈은 기본적으로 singleton
입니다. singleton
이 아닌 다른 스코프를 사용하려면 스프링의 @Scope
어노테이션을 사용해야 합니다. javax.inject
는 @Scope
어노테이션도 제공합니다. 그럼에도 불구하고, 이것은 사용자 자신의 어노테이션을 작성하는 용도로만 사용됩니다.
@Qualifier
@Qualifier / @Named
javax.inject.Qualifier
는 사용자 정의 한정자를 작성하기 위한 메타 – 어노테이션입니다. 구체적인 String
한정 자(예: 스프링의 @Qualifier
와 값)는javax.inject.Named
를 통해 연결할 수 있습니다.
@Value
-
no equivalent
@Required
-
no equivalent
@Lazy
-
no equivalent
ObjectFactory
Provider
javax.inject.Provider
는 스프링의 ObjectFactory
에 대한 직접적인 대안이며, 더 짧은 get() 메소드 이름으로만 가능합니다. 스프링의 @Autowired
와 함께 사용하거나 어노테이션이 없는 생성자 및 설정 메소드와 함께 사용할 수도 있습니다.
메이븐을 사용하는 경우, javax.inject
artifact는 표준 메이븐 저장소(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)에서 사용할 수 있습니다. pom.xml 파일에 다음 종속성을 추가할 수 있습니다.