AppConfig 를 보면
1. MemberSerivce 호출
2. MemberRepository 호출
3. MemoryMemberRepository 호출
4. OrderService 호출
5. MemberRepository 호출
discountPolicy 호출
6. MemoryMemberRepositoy 호출
7. FixDiscountPolicy 호출
-> 결과적으로 MemoryMemberRepository 가 2번 호출되는 것 처럼 보인다.
-> 하지만, 출력해보면 1번만 호출되는 것을 확인해 볼 수 있을 것이다.
-> @Configuration
스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야 한다. 그런데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 저 자바 코드를 보면 분명 3번 호출되어야 하는 것이 맞다. 그래서 스프링은 클래스의 바이트코드를 조작하는 라이브러리를 사용한다. 모든 비밀은 @Configuration 을 적용한 AppConfig 에 있다.
hello.core.AppConfig 만 출력되는 것이 아니라 뒤에 CGLIB~~~ 이 붙은걸 확인할 수 있다.
스프링이 CGLIB라는 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 임의의 다른 클래스를 만들고, 그 다른 클래스를 스프링 빈으로 등록한 것이다!
즉, AppConfig@CGLIB 을 통해서, 이미 스프링 컨테이너에 등록되어있으면 등록되어 있는 빈을 반환하고
스프링 빈이 없으면 새로 등록하고 반환하면서 싱글톤이 보장 되는 것이다.
혹시, @Configuration 에노테이션을 없애고 @Bean 만 사용하면 어떻게 될까?
- @Bean 만 사용해도 스프링 빈으로 등록되지만, 싱글톤은 보장하지 않는다. ( @Autowired 의존성 주입을 사용하면 될 수도)
- 고민할 것 없이, 스프링 설정 정보는 항상 @Configuration 을 사용하는게 좋다.
'Spring > 스프링 핵심원리 - 기본편' 카테고리의 다른 글
컴포넌트 탐색위치와 스캔 대상 (0) | 2022.03.26 |
---|---|
@ComponentScan @Component @Autowired (0) | 2022.03.26 |
싱글톤 패턴? 싱글톤 컨테이너 / 스프링 컨테이너 (0) | 2022.03.24 |
BeanFactory 와 ApplicationContext (0) | 2022.03.23 |
스프링 빈 조회 - 상속관계 (0) | 2022.03.23 |