Loading...
Spring Framework Reference Documentation 7.0.2의 Basic Concepts: @Bean and @Configuration의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
@Bean and @ConfigurationSpring의 Java 설정 지원에서 중심이 되는 artifact는
@Configuration으로 어노테이션된 class와 @Bean으로 어노테이션된 method입니다.
@Bean 어노테이션은 해당 method가 Spring IoC 컨테이너에 의해 관리될 새로운 객체를
인스턴스화, 구성, 초기화한다는 것을 나타내는 데 사용됩니다. Spring의 <beans/>
XML 설정에 익숙한 사람들에게 @Bean 어노테이션은 <bean/> element와 동일한
역할을 합니다.
@Bean으로 어노테이션된 method는 어떤 Spring @Component와도 함께
사용할 수 있습니다. 그러나 대부분의 경우 @Configuration bean과 함께 사용됩니다.
class에 @Configuration을 어노테이션하는 것은 그 primary purpose가 bean 정의의
source라는 것을 나타냅니다. 더 나아가, @Configuration class는 동일한 class 안에서
다른 @Bean method를 호출함으로써 inter-bean 의존성이 정의되도록 합니다.
가장 단순한 형태의 @Configuration class는 다음과 같이 읽힙니다:
1@Configuration 2public class AppConfig { 3 4 @Bean 5 public MyServiceImpl myService() { 6 return new MyServiceImpl(); 7 } 8}
1@Configuration 2class AppConfig { 3 4 @Bean 5 fun myService(): MyServiceImpl { 6 return MyServiceImpl() 7 } 8}
앞의 AppConfig class는 다음 Spring <beans/> XML과 동일합니다:
1<beans> 2 <bean id="myService" class="com.acme.services.MyServiceImpl"/> 3</beans>
@Configuration classes with or without local calls between @Bean methods?일반적인 시나리오에서, @Bean method는 @Configuration class 안에 선언되어야 하며,
이를 통해 전체 설정 class 처리 과정이 적용되고 cross-method reference가
컨테이너의 라이프사이클 관리로 리다이렉트되도록 보장합니다.
이는 동일한 @Bean method가 일반적인 Java method 호출을 통해 실수로 호출되는 것을
방지하며, 추적하기 어려운 미묘한 버그를 줄이는 데 도움이 됩니다.
@Bean method가 @Configuration으로 어노테이션되지 않은 class 안에 선언되거나
@Configuration(proxyBeanMethods=false)가 선언된 경우, 이러한 method는
"lite" 모드로 처리된다고 합니다. 이러한 시나리오에서 @Bean method는
특별한 런타임 처리(즉, 이를 위해 CGLIB 서브클래스를 생성하지 않음) 없이
사실상 general-purpose 팩터리 method 메커니즘입니다.
이러한 method에 대한 custom Java 호출은 컨테이너에 의해 인터셉트되지 않으며, 따라서 주어진 bean에 대해 기존 싱글톤(또는 스코프) 인스턴스를 재사용하는 대신 매번 새로운 인스턴스를 생성하는 일반적인 method 호출처럼 동작합니다.
결과적으로, 런타임 프록시가 없는 class의 @Bean method는 inter-bean 의존성을
전혀 선언하기 위한 것이 아닙니다. 대신, 이들은 자신이 속한 컴포넌트의 field와,
선택적으로 팩터리 method가 autowired collaborator를 받기 위해 선언할 수 있는
argument에서 동작하도록 예상됩니다.
따라서 이러한 @Bean method는 다른
@Bean method를 호출할 필요가 전혀 없으며, 그러한 모든 호출은 팩터리 method
argument를 통해 표현될 수 있습니다. 여기에서의 긍정적인 side-effect는
런타임에 CGLIB 서브클래싱을 적용할 필요가 없어 오버헤드와 메모리 사용량이
줄어든다는 점입니다.
@Bean과 @Configuration 어노테이션은 다음 section에서 깊이 있게 논의됩니다.
그러나 먼저, Java 기반 설정을 사용하여 Spring 컨테이너를 생성하는
여러 가지 방법을 다룹니다.
Java-based Container Configuration
Instantiating the Spring Container by Using AnnotationConfigApplicationContext