본문 바로가기

SpringFramework Core - I. IoC 컨테이너/11. JSR 330의 표준 어노테이션들 사용하기

11.1. @Inject와 @Named로 의존성 주입하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-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'로 선언할 수도 있다. 이를 통해 더 짧은 scope의 bean들에게 필요할때만 접근(on-demand access)하거나 Provider.get() 호출을 통해 더 늦게 접근(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는 required 속성을 갖지 않기 때문이다. 다음 두 예시는 @Inject와 @Nullable을 어떻게 사용하는지 보여준다.

public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(Optional<MovieFinder> movieFinder) {
        // ...
    }
}
public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(@Nullable MovieFinder movieFinder) {
        // ...
    }
}