You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
빈 생성시 의존관계 주입에 따라 달리 동작한다.
생성자 주입과 그외 주입
이때 빈 생성을 위한 AbstractAutowireCapableBeanFactory.doCreateBean()를 시작으로 살펴보면
createBeanInstance()매서드를 호출하는데
이때 생성자 주입의 경우 아래 과정을 통해 필요한 의존성을 주입 후 빈을 생성한다.
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
반면 그외 의존성 주입의 경우 의존성 주입 후 빈 생성이 아닌 빈 생성 이후 의존성을 주입.
따라서 AbstractAutowireCapableBeanFactory의 doCreateBean() 내부의 createBeanInstance()에서
instantiateBean()을 호출하는데...
AbstractAutowireCapableBeanFactory.doCreateBean()
위에서 말했듯이
생성자 주입의 경우 createBeanInstance()의 리턴값으로 의존관계가 주입된 빈이 반환된다.
반면 그외 주입의 경우 createBeanInstance()의 리턴값으로 의존성이 주입되지 않은 빈이 반환된다.
따라서 이제 의존관계를 주입해줄 차례로
아래 두 과정을 통해 진행된다.
populateBean()
initializeBean()
AbstractAutowireCapableBeanFactory.populateBean()
해당 매서드 중간에
InstantiationAwareBeanPostProcessor.postProcessProperties()를 확인할 수 있는데
먼저!!! beanPostProcessor가 뭐랬나?
- 빈 생성 후 등록전 빈으로 등록할 객체를 조작할 수 있는데
- 생성자주입또한 이 beanPostProcessor를 통해 생성자, 파라미터 정보를 가져왔다.
- 필드,세터 주입또한 빈 등록전 어떤 행위를 추가하지 않을까????
앞에서도 말했듯이 필드,세터 주입의 경우 빈을 생성한 후 의존관계를 주입한다.
여기 findAutowiringMetadata()매서드를 보자
지금 빈은 생성된 상태고 앞으로 우리가 해야할일은? 바로 의존관계 주입
그러기 위해선 의존관계 주입을 위한 정보가 필요하고 findAutowiringMetadata() 매서드로부터 시작한다
메타데이터를 얻는 과정을 살펴보기위해
AutowiredAnnotationBeanPostProcessor().findAutowiringMetadata() 중
AutowiredAnnotationBeanPostProcessor.buildAutowiringMetadata()를 호출하는걸 살펴보자
결국 위 과정을 통해
필드,매서드 주입의 경우
1. 빈을 먼저 생성
2. 해당 빈에 의존관계를 주입하기위해 AbstractAutowireCapableBeanFactory.populateBean()
- AutowiredAnnotationBeanPostProcessor.postProcessProperties()
- AutowiredAnnotationBeanPostProcessor().findAutowiringMetadata()
- AutowiredAnnotationBeanPostProcessor.buildAutowiringMetadata()
- 위 단계를 거쳐 의존관계 주입을 위한 정보를 수집
이제 inject 할 차례인데..