Springboot 개발을 하다보면 @Configuration
을 사용하는 클래스들을 볼 수 있다. 빈 주입이라면 @Bean
을 사용하면 되지 않나? 라는 생각에 이점을 알아보게 되었다.
@Configuration
을 추가하고, @Bean
을 사용해 수동으로 bean을 등록할 수 있다.@Configuration
을 사용한다.@Configuration
public class ExampleConfig {
@Bean
public ExampleBean exam() {
return new ExampleBean();
}
@Bean
public ExampleService exampleService() {
return new ExampleService(exam());
}
}
@Configuration
이 붙어있는 클래스를 자동으로 bean으로 등록한다.@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
...
}
@Component
가 추가되어 있다. @Configuration
이 붙은 class 또한 bean으로 등록된다.@Bean
이 붙어있는 메소드를 찾아 bean을 생성해준다.그러면 @Configuration은 Bean을 수동 등록하기 위한 어노테이션인가?
@Configuration
public class ExampleConfig {
@Bean
public ExampleBean exam() {
return new ExampleBean();
}
@Bean
public ExampleService exampleService() {
return new ExampleService(exam());
}
@Bean
public Example2Service exampleService2() {
return new Example2Service(exam());
}
}
exam()
메서드는 exampleService()와 exampleService2()에서 각각 new 키워드로 새로운 키워드를 생성하니까 싱글톤 패턴이 깨지는 것처럼 보인다.@Configuration
설정 시 CGLIB라는 바이트코드 조작 라이브러리를 사용한다.ExampleConfig
클래스를 스프링 빈에 등록하는 것이 아니라 해당 클래스를 상속받은 임의의 클래스(proxy ExampleConfig)를 만들고, 그 클래스를 스프링 빈으로 등록한다. @Bean
이 붙은 메서드마다 스프링 컨테이너에 이미 존재하면 해당 스프링 빈을 반환하고, 없으면 새로 생성해 스프링 빈으로 등록하고 반환하는 방식으로 동작하기 때문이라는 것.@Configuration
어노테이션을 제거한다면 exam()
호출마다 새로운 instance가 생성될 것이다. @Bean
만 사용해도 스프링 빈은 등록되지만 싱글톤은 유지되지 않는다.싱글톤에 대하여 더 자세하게 알고싶다면?
[Spring] 싱글톤 패턴 (singleton pattern)
ref
싱글톤 패턴(Singleton Pattern)과 @Configuration 역할
[Spring] 핵심 원리 5 싱글톤 컨테이너
[Spring]@Configuration이란?