1.11 JSR 330 표준 어노테이션 사용하기 by sh

1.11. JSR 330 표준 어노테이션 사용

스프링 3.0부터 스프링은 JSR-330 표준 어노테이션(의존성 주입)을 지원합니다. 이러한 어노테이션은 스프링 어노테이션과 동일한 방식으로 스캔됩니다. 그들을 사용하려면, 클래스 패스에 이것과 관련된 jar가 있어야합니다.

메이븐을 사용하는 경우, javax.injectartifact는 표준 메이븐 저장소(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)에서 사용할 수 있습니다. pom.xml 파일에 다음 종속성을 추가할 수 있습니다.

1.11.1. @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를 사용할 수 있습니다. 또한, 주입 지점을 Provider로 선언하여 짧은 범위의 빈에 대한 주문형 액세스 또는 Provider.get()호출을 통해 다른 빈에 대한 게으른 액세스를 허용할 수 있습니다. 다음 예제는 앞의 예제의 변형을 제공합니다:

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(...);
        ...
    }
}

JSR-330의 Provider

  • ObjectFactory와 같은 개념. 미리 지정된 단순한 팩토리 API를 이용하는 것.

    • ObjectFactory : 스프링이 미리 정의해둔 팩토리 인터페이스로 XML에 빈으로 등록하거나 @Bean으로 생성한다.

  • ObjectFactory보다 나은 점은 팩토리 빈을 따로 등록할 필요가 없다는 점. 어노테이션에 의해 Di할 때 Provider를 보고 스프링이 Provider를 구현한 팩토리 오브젝트를 자동으로 만들어서 주입시켜준다.

  • 좁은 범위의 객체를 광범위하게 범위가 지정된 빈에 주입할 때 사용.

삽입해야만 하는 의존성에 대해 정규화된 이름을 사용하려면 다음 예제와 같이 @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와 마찬가지로 @Injectjava.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) {
        ...
    }
}

1.11.2. @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(“...”)

  • XML의 빈으로 등록해달라는 표시. Id는 기본적으로 클래스 명의 첫 글자를 소문자로 해서 지정한다.

구성 요소의 이름을 지정하지 않고 @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을 사용하면, 다음 예제와 같이 스프링 어노테이션을 사용할 때와 완전히 동일한 방식으로 구성 요소 검색을 사용할 수 있습니다:

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
    ...
}

@Component와 달리, JSR-330 @Named 및 JSR-250 ManagedBean어노테이션은 조합할 수 없습니다. 커스텀 컴포넌트 어노테이션을 작성하기 위해서는 스프링의 스테레오 타입 모델을 사용해야 합니다.

1.11.3. JSR-330 표준 어노테이션의 제한 사항

표준 어노테이션으로 작업할 때 다음 표와 같이 몇 가지 중요한 기능을 사용할 수 없음을 알아야 합니다:

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와 함께 사용하거나 어노테이션이 없는 생성자 및 설정 메소드와 함께 사용할 수도 있습니다.

Last updated