Basic Concepts: @Bean and @Configuration
2024. 11. 14. 14:07ㆍSpring Framework/Spring IoC
Spring의 Java 구성 지원에서 핵심 아티팩트는 @Configuration 어노테이션이 달린 클래스와 @Bean 어노테이션이 달린 메서드입니다.
@Bean 어노테이션은 메서드가 Spring IoC 컨테이너에서 관리할 새 객체를 인스턴스화하고, 구성하고, 초기화한다는 것을 나타내는 데 사용됩니다. Spring의 <beans/> XML 구성에 익숙한 사람들에게 @Bean 어노테이션은 <bean/> 엘리먼트와 동일한 역할을 합니다. @Bean 어노테이션이 달린 메서드는 모든 Spring @Component와 함께 사용할 수 있습니다. 그러나 @Configuration 빈과 함께 가장 많이 사용됩니다.
클래스에 @Configuration 어노테이션을 달면 해당 클래스의 주요 목적이 빈 정의의 소스라는 것을 나타냅니다. 또한 @Configuration 클래스는 동일한 클래스에서 다른 @Bean 메서드를 호출하여 빈 간 종속성을 정의할 수 있습니다. 가능한 가장 간단한 @Configuration 클래스는 다음과 같습니다.
@Configuration
public class AppConfig {
@Bean
public MyServiceImpl myService() {
return new MyServiceImpl();
}
}
앞의 AppConfig 클래스는 <beans/> XML과 동일합니다.
@Configuration 클래스 내에서 @Bean 메소드들 간의 로컬 호출 여부
일반적인 시나리오에서, @Bean 메소드는 @Configuration 클래스로 선언되어야 하며, 이를 통해 전체 구성 클래스 처리가 적용되고 메소드 간 참조가 컨테이너의 라이프사이클 관리로 리디렉션됩니다. 이렇게 하면 동일한 @Bean 메소드가 일반 자바 메소드 호출을 통해 실수로 호출되는 것을 방지할 수 있으며, 추적하기 어려운 미묘한 버그를 줄이는 데 도움이 됩니다.
@Configuration으로 어노테이션 처리되지 않은 클래스 내에서 @Bean 메소드가 선언되거나 @Configuration(proxyBeanMethods=false)로 선언된 경우, 이러한 메소드들은 "라이트" 모드로 처리된다고 합니다. 이러한 시나리오에서는 @Bean 메소드가 특별한 런타임 처리가 없는 일반적인 팩토리 메소드 메커니즘으로 동작합니다(즉, CGLIB 서브클래스를 생성하지 않음). 따라서 이러한 메소드에 대한 커스텀 자바 호출은 컨테이너에 의해 인터셉트되지 않으며, 주어진 빈에 대해 기존의 싱글톤(또는 스코프된) 인스턴스를 재사용하는 대신 매번 새로운 인스턴스를 생성하게 됩니다.
결과적으로, 런타임 프록시가 없는 클래스에서의 @Bean 메소드는 빈 간의 의존성을 선언하는 데 사용되지 않습니다. 대신, 이들은 주로 자신이 속한 컴포넌트의 필드와 팩토리 메소드에서 선언할 수 있는 아규먼트를 통해 주입된 협력자에 의존하도록 기대됩니다. 이러한 @Bean 메소드는 다른 @Bean 메소드를 호출할 필요가 없으며, 모든 호출은 팩토리 메소드의 아규먼트를 통해 표현될 수 있습니다. 여기서 긍정적인 부수 효과는 런타임 시 CGLIB 서브클래싱이 적용될 필요가 없기 때문에 오버헤드와 메모리 사용량이 감소한다는 것입니다.
@Bean 및 @Configuration 어노테이션은 다음 섹션에서 자세히 설명합니다. 그러나 먼저 Java 기반 구성을 사용하여 Spring 컨테이너를 만드는 다양한 방법을 다룹니다.
'Spring Framework > Spring IoC' 카테고리의 다른 글
Using the @Bean Annotation (0) | 2024.11.14 |
---|---|
Instantiating the Spring Container by Using AnnotationConfigApplicationContext (0) | 2024.11.14 |
Java-based Container Configuration (1) | 2024.11.14 |
Fine-tuning Annotation-based Autowiring with Qualifiers (0) | 2024.11.14 |
Annotation-based Container Configuration (0) | 2024.11.14 |