@Configuration

SeungHwanLee·2021년 2월 18일
1

@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은 빈을 자동으로 싱글톤방식으로 등록함

profile
Hongik CE

2개의 댓글

comment-user-thumbnail
2021년 4월 20일

승환씨
열공하셨
네요

답글 달기
comment-user-thumbnail
2021년 5월 26일

더 올려주세요^~^

답글 달기