IoC Container는 의존성을 주입할 때
필요한 의존 객체의 "타입"에 해당하는 빈을 찾아서 주입해줍니다.
생성자를 이용하기
@Service
public class BookService {
BookRepository bookRepository;
@Autowired
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
다음과 같이 생성자를 정의한 후 @Autowired 어노테이션을 명시하여 사용합니다.
Setter를 이용하기
@Service
public class BookService {
BookRepository bookRepository;
@Autowired
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
다음과 같이 Setter를 이용해서 주입을 할 수 있습니다.
@Service
public class BookService {
BookRepository bookRepository;
@Autowired(required = false)
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
만약 없을 때 주입이 필요 없다, 그러면 @Autowired(required = false) 를 이용해서
꼭 주입이 되지 않아도 됨을 명시해줍니다.
이렇게 하면 의존성 주입이 안 된 채로 Bean이 생성됩니다.
@Service
public class BookService {
BookRepository bookRepository;
@Autowired(required = false)
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
대신 생성자를 사용한 의존성 주입은 @Autowired(required = false) 를 수행해도
Bean을 생성할 수 없습니다.
만약 인터페이스의 구현체가 여러개인데
인터페이스를 아무런 명시 없이 주입하려고 하면
어떤 Bean을 주입해야 하는지 모르기 때문에 이 경우엔 Bean이 생성되지 않습니다.
이런 경우엔
@Primary
@Repository
public class KwanHunBookRepository implements BookRepository {
1. @Primary 어노테이션으로 Bean에 우선순위를 부여하거나 (굳이 추천하자면 이거)
2. 모든 Bean을 다 받거나 (배열로 선언하고 @Autowired 걸면 다 받음)
@Service
public class BookService {
@Autowired
@Qualifier("kwanHunBookRepository")
BookRepository bookRepository;
}
3. @Qualifier 어노테이션으로 원하는 Bean을 명시합니다.
@Service
public class BookService {
@Autowired
BookRepository kwanHunBookRepository;
}
4. @Autowired 의 2번쨰 기능인 이름을 이용하여 주입합니다 (좋은 방법은 아님)
필드 이름과 동일한 Bean을 주입받아서 사용합니다.
이러한 의존성 주입은
BeanPostProcessor 라는 Bean의 라이프사이클 인터페이스 내의 구현체에 의해 수행됩니다.
BeanPostProcessor
- 새로 만든 Bean 인스턴스를 수정할 수 있는 라이프사이클 인터페이스
- 정의된 Bean이 Initialized 된 이후의 작업을 수행해줍니다
AutowiredAnnotationBeanPostProcessor extends BeanPotProcessor
- 스프링이 제공하는 @Autowired와 @Value 어노테이션, JSR-330의 @Inject 어노테이션을 지원
'Java > Spring' 카테고리의 다른 글
[7] 스프링 프레임워크 핵심 - Environment, Profile, Property (0) | 2020.12.05 |
---|---|
[6] 스프링 프레임워크 핵심 - Component Scan, Bean Scope (0) | 2020.12.05 |
[4] 스프링 프레임워크 핵심 - IOC 컨테이너와 Bean (0) | 2020.11.30 |
[3] 간략한 스프링 개요 - PSA (0) | 2020.11.30 |
[2] 간략한 스프링 개요 - AOP (0) | 2020.11.28 |
댓글