• Home
  • About
    • Junseok photo

      Junseok

      개발자 블로그

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Java
    • java-basic
    • java-solid
    • java-pattern
    • java-logging
  • Javascript
  • Angular
  • spring
    • spring-framework
    • spring-boot
    • spring-test
  • server
    • jeus
    • webtob
    • tomcat
  • test
    • junit
    • assertj
    • hamcrest
    • dbunit
    • spring
  • docker
  • unix
  • maven
  • db
  • network
  • eclipse
  • intellij
  • microservices
  • etc

JSR330 표준 주석

23 Apr 2018

Reading time ~3 minutes

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와 함께 사용하거나 비 주석으로 된 생성자 및 설정 메소드와 함께 사용할 수도 있습니다.


springframeworkjsr330 Share Tweet +1