Study/Spring

스프링 핵심기술 02. 스프링 IoC 컨테이너 - @Autowire

going.yoon 2022. 2. 2. 17:32

여기 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의 라이프사이클은 다음과 같다.

 

  1. BeanNameAware's setBeanName
  2. BeanClassLoaderAware's setBeanClassLoader
  3. BeanFactoryAware's setBeanFactory
  4. EnvironmentAware's setEnvironment
  5. EmbeddedValueResolverAware's setEmbeddedValueResolver
  6. ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
  7. ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
  8. MessageSourceAware's setMessageSource (only applicable when running in an application context)
  9. ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
  10. ServletContextAware's setServletContext (only applicable when running in a web application context)
  11. postProcessBeforeInitialization methods of BeanPostProcessors
  12. InitializingBean's afterPropertiesSet
  13. a custom init-method definition
  14. postProcessAfterInitialization methods of BeanPostProcessors

 

이런식으로 Spring에서는 Bean의 초기화 전 후로 처리할 수 있는 콜백 메소드를 제공하는데, 저 11번째 단계인 postProcessBeforeInitialization에서 AutowiredAnnotationBeanPostProcessor 가 Autowired 표시된 빈들을 주입해준다.