프로젝트의 규모가 커짐에 따라 .xml 파일 내부에서 리소스들을 등록하는 것들이 복잡해짐으로 인해, 이를 보완하기 위해 어노테이션을 활용한 Bean 등록 방법이 탄생하였다.
@Test
void proxyMyConfiguration(){
MyConfigProxy myConfigProxy = new MyConfigProxy();
Bean1 bean1 = myConfigProxy.bean1();
Bean2 bean2 = myConfigProxy.bean2();
Assertions.assertThat(bean1.item).isSameAs(bean2.item); //-> error!
}
static class MyConfigProxy extends MyConfig{
private Item item;
@Override
Item item(){
if(this.item == null) this.item = super.item();
return this.item;
}
}
CGILB(Code Generator Library) : 코드 생성 라이브러리로 런타임에 동적으로 자바클래스의 프록시를 생성해주는 기능을 한다. 타겟에 대한 정보를 직접적으로 제공 받아서 바이트 코드로 조작하여 프록시를 생성
스프링 부트 3.x 기준으로 특정 클래스에서 해당 옵션을 false로 default 설정 중인데, 이러한 빈 등록 방식은 프록시 클래스를 생성하는 비용을 없애면서, @Bean 메서드를 호출 시 새로운 빈 오브젝트를 계속 생성할 수 있게 만드는 것이다.
하지만 이러한 상황보다 싱글톤을 보장받는 경우가 대부분이기 때문에, default 는 true로 설정되어 있다.
요약
스프링에서 관리되어지는 빈 오브젝트를 생성하려면 @Configuration이 붙은 클래스 내부에서 @Bean 메서드를 직접 등록하자.