•
클래스, 인터페이스, 열거형 또는 레코드 선언에 사용되며 하나 이상의 @Bean 메소드를 포함하여 빈을 등록할 수 있게 해주는 어노테이션이다.
◦
스프링 컨테이너는 @Bean이 붙은 메소드를 통해 빈을 생성한다.
◦
다른 빈들과 생명주기가 같은가?라는 궁금증이 생겼는데, 얘네만 따로 관리하는 건 논리적으로 안 맞지 않을까? 같을듯
•
ApplicationContext는 @Configuration 어노테이션이 붙은 클래스 내부에서 @Bean이 붙은 메소드를 찾아 빈으로 등록한다.
◦
@Bean이 붙은 메소드들은 자바 객체를 반환하는 메소드다.
◦
이렇게 반환된 자바 객체는 스프링 컨테이너에 빈으로 등록된다. 이때 빈의 이름은 메소드 명이다.
Configuration의 속성
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(
annotation = Component.class
)
String value() default "";
boolean proxyBeanMethods() default true;
boolean enforceUniqueMethods() default true;
}
Java
복사
•
value
◦
생성된 Configuration 객체가 빈으로 등록될 때의 이름을 지정한다.
•
proxyBeanMethods
◦
빈의 프록시 객체를 생성 여부를 결정한다. 기본 값은 true로 따라서 빈에 대한 프록시 객체가 기본적으로 생성된다.
◦
Configuration 클래스을 상속한 프록시 객체가 생성되어 사용되는데, 이때 내부적으로 인스턴스 호출 시, 메소드를 가로채서 객체 생성 메소드를 한번만 호출하고 싱글톤으로 관리하기 위함이다.
◦
이를 false로 지정하면 @Bean 메소드는 서로 다른 인스턴스를 제공한다.
•
enforceUniqueMethods
◦
@Bean 메소드 이름이 고유한 값을 가져야하는지를 강제하는 함수다. 기본값은 true로 중복이 불가능하게 한다.
◦
false로 선언하는 경우, 동일한 @Bean 메소드 정의를 오버로드된 팩토리 메소드로 해석한다.