여기 BookRepository 객체와, BookRepository 객체를 사용하는 BookService 객체가 있다고 가정해보자.
그리고 이 BookService 객체에서 BookRepository 객체를 주입받아야 하는 상황에서
BookService는 Bean으로 등록을 해주고, BookRepository 는 Bean으로 등록을 하지 않았다고 해보자.
// #1. BookService
@Service
public class BookService {
BookRepository bookrepository;
@Autowired
public void BookService(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
}
// #2. BookRepository
public class BookRepository {
}
이런식으로 의존관계를 설정해주고 프로젝트를 실행해보면
이런 에러가 뜬다. BookRepository는 빈이 아닌데 왜 Autowired를 쓰냐는거다.
이는 Autowired의 옵션을 @Autowired(required=false)로 설정해두면 해결할 수 있다. (defult는 required=true)
만약, BookRepository가 인터페이스고, 그 구현체가 여러개일 경우는 Spring에서 Bean을 어떻게 찾아올까?
BookRepository를 구현한 gayoungRepository와 nayoungRepository가 있다고 가정해보자.
Spring에서는
- @Primary 애노테이션이 등록된 하나의 구현체를 가져오던지
- BookRepository를 List로 받아서 등록된 모든 구현체를 가져오던지
- @Autowire BookRepository gayoungRepository 이런식으로 이름으로 하나의 구현체를 찾아온다.
이러한 @Autowired를 통한 빈의 주입 작업은 AutowiredAnnotationBeanPostProcessor 클래스에 의해 이루어진다.
이 프로세서의 동작 방식을 Bean의 LifeCycle과 함께 이해해보자. Bean의 라이프사이클은 다음과 같다.
- BeanNameAware's setBeanName
- BeanClassLoaderAware's setBeanClassLoader
- BeanFactoryAware's setBeanFactory
- EnvironmentAware's setEnvironment
- EmbeddedValueResolverAware's setEmbeddedValueResolver
- ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
- ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
- MessageSourceAware's setMessageSource (only applicable when running in an application context)
- ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
- ServletContextAware's setServletContext (only applicable when running in a web application context)
- postProcessBeforeInitialization methods of BeanPostProcessors
- InitializingBean's afterPropertiesSet
- a custom init-method definition
- postProcessAfterInitialization methods of BeanPostProcessors
이런식으로 Spring에서는 Bean의 초기화 전 후로 처리할 수 있는 콜백 메소드를 제공하는데, 저 11번째 단계인 postProcessBeforeInitialization에서 AutowiredAnnotationBeanPostProcessor 가 Autowired 표시된 빈들을 주입해준다.
'Study > Spring' 카테고리의 다른 글
스프링 핵심기술 05. 추상화 (0) | 2022.02.13 |
---|---|
스프링 핵심기술 04. ApplicationContext가 상속받는 인터페이스들 (0) | 2022.02.06 |
스프링 핵심기술 03. 스프링 IoC 컨테이너 - Bean의 Scope (0) | 2022.02.03 |
스프링 핵심기술 01. 스프링 IoC 컨테이너 - ApplicationContext와 Bean 설정 방법 (0) | 2022.02.02 |
토비의 스프링 01. 오브젝트와 의존 관계 (0) | 2021.12.15 |