@Configuration
AnnotationConfigApplicationContext에 파라미터로 넘긴 값은 모두 스프링빈으로 등록
이때 AppConfig자체도 스프링빈이되어야 하므로 getBean을 통해 조회해보면
class hello.core.AppConfig
처럼 순수한 클래스가 출력되어야함
하지만, AppConfig를 출력 조회해보면
appConfig = hello.core.AppConfig$$ EnhancerBySpringCGLIB$$55f12504@125290e5
처럼 클래스명에 ...CGLIB가 붙으며 복잡해진것을 볼 수 있음
이는 CGLIB라이브러리에 의한 조작임
@Configuration이 붙으면 스프링은 자동으로 CGLIB라이브러리에 의해 내가만든 AppConfig자바 코드를 상속받은 임의의 클래스를 새로 만들어 그 클래스를 스프링빈에 등록시킴 따라서 실제로 등록된 스프링빈은 조작된 클래스이다
AppConfig@CGLIB는 AppConfig의 자식 타입이므로, AppConfig 타입으로 조회 할 수 있다.
이 조작된 클래스의 역활
실제로 이 조작된 클래스가 있을 때 스프링컨테이너에 등록된 모든 빈들은 어떤 코드에서도 싱글톤방식을 유지한체 각 빈들은 단 한번씩만 호출된다 즉, 한개의 인스턴스만 갖는 셈
아마 조작된 클래스에 이미 등록되어 있는 빈을 판별하는 역활을하는 코드가 있을것으로 예상
@Bean
public SpringBeanRegister springBeanRegister() {
if (springBeanRegister 이미 스프링 컨테이너에 등록되어 있으면?) {
return 스프링 컨테이너에서 찾아서 반환;
} else {
//스프링 컨테이너에 없으면
//기존 로직을 호출해서 상속 또는 의존관계에 있는 다른 class를 생성하고 스프링 컨테이너에 등록
return 반환
}
@Configuration 애노테이션은 싱글톤방식과 직접적인 관련 X
@Bean만으로 스프링빈을 등록해도 싱글톤방식을 보장할 수 있음
다만, @Bean으로 빈을 수동 등록할때 내부의 의존관계 DI를 직접 메서드 호출방식으로
주입할때만 문제가 발생
@Configuration을 사용하지 않았을 때 직접메서드방식으로 호출한 클래스는 호출할때마다 인스턴스가 생성됨 이를 해결하기 위해 @Configuration을 사용
+++) @ComponentScan은 빈을 자동으로 싱글톤방식으로 등록함
승환씨
열공하셨
네요
ㅋ