생성자 주입 방식
위와 같이 BookService에서 생성자 주입은 Bean을 만들다가 그 Bean에 필요한 다른 의존성이었던, BookRepository를 못찾아서, 그 해당하는 빈이 없어서 빌드에 실패합니다.
그리고 에러 코드를 확인하면, BookRepository를 Bean으로 등록하라는 Action을 확인 할 수 있습니다.
Setter 주입 방식
위의 상황과 동일하게 Annotation Bean을 등록하지 않은 BookRepository가 있을 경우, BookService에서 Setter로 BookRepository를 등록 해주었을 때 동일하게 에러가 발생합니다.
그런데 생각을 해봤을 때, 위의 생성자 주입 방식은 사실 Bean을 만들다가 해당하는 Bean을 못찾아서 에러가 났다는 것을 유추할 수 있습니다. 하지만, Setter 주입 방식은 Setter를 사용하기 때문에 적어도 해당하는 Bean을 만들 수 있는 것이 아닌가? 라는 의문이 들게 됩니다. 왜냐면 Setter를 사용하면 BookService 자체의 instance를 만들 수 있기 때문입니다.
그렇지만, @Autowired Annotation 때문에 BookRepository Bean을 주입하려고 합니다. 그래서 에러가 나타나게 됩니다.
그래서 위와 같이 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 애노테이션을 지원하는 애노테이션 처리기.
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:
- BeanNameAware'ssetBeanName
- BeanClassLoaderAware'ssetBeanClassLoader
- BeanFactoryAware'ssetBeanFactory
- EnvironmentAware'ssetEnvironment
- EmbeddedValueResolverAware'ssetEmbeddedValueResolver
- ResourceLoaderAware'ssetResourceLoader(only applicable when running in an application context)
- ApplicationEventPublisherAware'ssetApplicationEventPublisher(only applicable when running in an application context)
- MessageSourceAware'ssetMessageSource(only applicable when running in an application context)
- ApplicationContextAware'ssetApplicationContext(only applicable when running in an application context)
- ServletContextAware'ssetServletContext(only applicable when running in a web application context)
- postProcessBeforeInitializationmethods of BeanPostProcessors
- InitializingBean'safterPropertiesSet
- a custom init-method definition
- 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 |