본문 바로가기

Spring/Spring Web MVC

@Autowired

반응형

생성자 주입 방식

Annotation Bean 등록 되지 않은 BookRepository
BookService 에서 사용하는 생성자 주입 방식
에러 코드

위와 같이 BookService에서 생성자 주입은 Bean을 만들다가 그 Bean에 필요한 다른 의존성이었던, BookRepository를 못찾아서, 그 해당하는 빈이 없어서 빌드에 실패합니다.

그리고 에러 코드를 확인하면, BookRepository를 Bean으로 등록하라는 Action을 확인 할 수 있습니다.

BookRepository에 추가 해준 @Repository Annotation

Setter 주입 방식

Setter 주입 방식으로 선언한 BookRepository

위의 상황과 동일하게 Annotation Bean을 등록하지 않은 BookRepository가 있을 경우, BookService에서 Setter로 BookRepository를 등록 해주었을 때 동일하게 에러가 발생합니다.

그런데 생각을 해봤을 때, 위의 생성자 주입 방식은 사실 Bean을 만들다가 해당하는 Bean을 못찾아서 에러가 났다는 것을 유추할 수 있습니다. 하지만, Setter 주입 방식은 Setter를 사용하기 때문에 적어도 해당하는 Bean을 만들 수 있는 것이 아닌가? 라는 의문이 들게 됩니다. 왜냐면 Setter를 사용하면 BookService 자체의 instance를 만들 수 있기 때문입니다.

그렇지만, @Autowired Annotation 때문에 BookRepository Bean을 주입하려고 합니다. 그래서 에러가 나타나게 됩니다.

@Autowired required Option

그래서 위와 같이 Optional하게끔 required를 false로 선언하면 필수적이지 않게 빈으로 등록 안 할 수 있습니다. (Field Injection에도 사용할 수 있음) 하지만 생성자 주입 방식은 사용이 불가능합니다. 이유는 생성자를 생성할 때, 들어가는 인스턴스의 Bean을 받아와야 하기 때문에 무조건 필요하기 때문입니다.

같은 타입의 Bean이 여러개 일 때

  • @Primary
  • 해당 타입의 Bean 모두 주입 받기
    • List 방식으로 사용
  • @Qualifier (빈 이름으로 주입)

동작원리

  • Bean LifeCycle

  • BeanPostProcessor > Bean Initialization Life Cycle Before & After Callback

    • postProcessBeforeInitialization - BeanPostProcessors

    • postProcessAfterInitialization - BeanPostProcessors

    • 새로 만든 Bean 인스턴스를 수정 할 수 있는 라이프사이클 인터페이스

    • @PostConstruct: After setUp Bean: Bean이 만들어지고 난 후에

  • AutowiredAnnotationBeanPostProcessor​ extends BeanPostProcessor

    • 스프링이 제공하는 @Autowired와 @Value 애노테이션 그리고 JSR-330의 @Inject 애노테이션을 지원하는 애노테이션 처리기.

https://docs.spring.io/spring-framework/docs/5.0.8.RELEASE/javadoc-api/org/springframework/beans/factory/BeanFactory.html

Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:

  1. BeanNameAware'ssetBeanName
  2. BeanClassLoaderAware'ssetBeanClassLoader
  3. BeanFactoryAware'ssetBeanFactory
  4. EnvironmentAware'ssetEnvironment
  5. EmbeddedValueResolverAware'ssetEmbeddedValueResolver
  6. ResourceLoaderAware'ssetResourceLoader(only applicable when running in an application context)
  7. ApplicationEventPublisherAware'ssetApplicationEventPublisher(only applicable when running in an application context)
  8. MessageSourceAware'ssetMessageSource(only applicable when running in an application context)
  9. ApplicationContextAware'ssetApplicationContext(only applicable when running in an application context)
  10. ServletContextAware'ssetServletContext(only applicable when running in a web application context)
  11. postProcessBeforeInitializationmethods of BeanPostProcessors
  12. InitializingBean'safterPropertiesSet
  13. a custom init-method definition
  14. postProcessAfterInitializationmethods of BeanPostProcessors
반응형

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

Environment - 프로파일  (2) 2020.11.24
@Component와 @ComponentScan  (2) 2020.11.20
ApplicationContext와 다양한 빈 설정 방법  (0) 2020.11.19
스프링 IoC 컨테이너와 빈  (0) 2020.11.19
Dispatcher-servlet.xml  (0) 2020.10.14