본문 바로가기
  • 주니어 개발자의
    RESTful 성장기
Web/Spring

@Annotation을 이용한 의존성 주입!

by 돌건 2021. 3. 25.

@Autowired

- 생성자, 필드, 메서드에 적용이 가능하다.

- 타입을 기준으로 Bean 객체를 선택한다.

- setter 메서드뿐만 아니라 임의의 메서드에 적용해도 의존 객체를 자동으로 연결해준다.

public class SampleService {
    // Bean으로 등록되어 있는 객체
    private AClientFactory aClientFactory;
    private BClientFactory bClientFactory;
    
    @Autowired // 타입을 기반으로 자동으로 의존성을 주입한다.
    public void init(AClientFactory aClientFactory, BClientFactory bClientFactory) {
    	this.aClientFactory = aClientFactory;
        this.bClientFactory = bClientFactory;
    }
}

 

- 해당하는 타입의 Bean 객체가 존재하지 않으면 스프링은 컨테이너를 초기화하는 과정에서 예외를 발생시킨다.

- Bean이 존재하지 않은 경우에 예외를 발생시키지 않고 null 값을 유지하고자 하는 경우에는 required속성을 false로 설정하면 된다.

- 동일한 타입의 Bean이 여러 개 존재하는 경우, @Qualifier를 사용해 한정자를 지정한다. (❗️Bean의 이름이 아님)

@Configuration
public class ConfigShop {
    @Bean
    @Qualifier("order")
    public SearchClientFactoryBean orderSearchClientFactory() {
    	SearchClientFactoryBean searchClientFactoryBean = new SearchClientFactoryBean();
        ...
        return searchClientFactoryBean;
    }
}

// --------------------------------------------

public class OrderService {
    @Autowired
    @Qualifier("order")
    private SearchClientFactory searchClientFactory;
}

- @Autowired가 적용된 메서드나 생성자가 두 개 이상의 파라미터를 갖는 경우에는 파라미터에 @Qualifier를 적용하면 된다.

 

 

@Resource

- 필드, setter 메서드에 적용 가능하다.

- 이름을 기준으로 Bean 객체를 선택한다.

- name 속성에 사용할 스프링 Bean 객체의 이름을 기재해 사용할 수 있다.

- name 속성의 값을 지정하지 않을 경우, 필드 이름이나 setter의 이름을 사용한다.

- name 속성을 지정하지 않은 상태에서 필드 이름이나 setter 이름에 해당하는 Bean이 존재하지 않는다면 @Autowired와 비슷하게 일치하는 타입의 Bean을 선택한다. 하지만 일치하는 것이 없거나 두 개 이상 존재하면 예외를 발생시킨다.

 

@Inject

- 필드, 메서드, 생성자에 적용할 수 있다.

- 반드시 사용할 Bean이 존재해야 한다.

public class OrderService {
    ...
    @Inject
    public void setAClientFactory(AClientFactory aClientFactory) {
    	this.aClientFactory = aClientFactory;
    }
    
    @Inject
    public void setBClientFactory(
    	@Named("orderBClientFactory") BClientFactory bClientFactory) {
    	    this.bClientFactory = bClientFactory;    
    }
}

- @Named는 자동 설정 대상이 두 개 이상일 경우에 특정 Bean을 선택하기 위해 사용된다는 점에서 @Qualifier와 비슷하다. 하지만 @Named의 경우 사용할 Bean의 이름을 지정한다.

'Web > Spring' 카테고리의 다른 글

[Spring 설정] DispatcherServlet  (0) 2021.05.09
시작 페이지 설정하기!  (0) 2021.04.28
Spring MVC의 동작 원리  (0) 2021.04.19
AOP 시리즈 1편 - AOP가 뭔데?  (0) 2021.03.31
Web programming에 봄이 왔다! Spring이란?  (1) 2021.03.23

댓글