@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 |
댓글