Home [Spring] 1.12.1. Basic Concepts: @Bean and @Configuration
Post
Cancel

[Spring] 1.12.1. Basic Concepts: @Bean and @Configuration

1.12.1. Basic Concepts: @Bean and @Configuration

The central artifacts in Spring’s new Java-configuration support are @Configuration-annotated classes and @Bean-annotated methods.

  • Spring의 새로운 Java-configuration support의 중심 특징은 @Configuration-Annotative classes와 @Bean-Anotative methods이다.

The @Bean annotation is used to indicate that a method instantiates, configures, and initializes a new object to be managed by the Spring IoC container. For those familiar with Spring’s <beans/> XML configuration, the @Bean annotation plays the same role as the <bean/> element. You can use @Bean-annotated methods with any Spring @Component. However, they are most often used with @Configuration beans.

  • @Bean annotation은 Spring IoC 컨테이너에 의해 관리될 새 객체를 인스턴스화, 구성 및 초기화방법을 나타내기 위해 사용된다.
  • 스프링의 <beans/> XML 구성에 익숙한 사람들에게 @Bean annotation은 <bean/> 요소와 같은 역할을 한다.
  • @Bean-annotated 메소드를 어떤 스프링 @Component와 함께 사용할 수 있다.
  • 그러나 그것들은 @Configuration beans과 함께 가장 많이 사용된다.

Annotating a class with @Configuration indicates that its primary purpose is as a source of bean definitions. Furthermore, @Configuration classes let inter-bean dependencies be defined by calling other @Bean methods in the same class. The simplest possible @Configuration class reads as follows:

  • @Configuration으로 클래스에 annotation을 달면 주요 목적이 bean definitions의 source임을 알 수 있다.
  • 또한 @Configuration 클래스들은 동일한 클래스의 다른 @Bean 메서드를 호출하여 bean 사이의 종속성(inter-bean dependencies)을 정의할 수 있다.
  • 가능한 가장 간단한 @Configuration 클래스는 다음과 같이 읽는다.
1
2
3
4
5
6
7
8
@Configuration
class AppConfig {

    @Bean
    fun myService(): MyService {
        return MyServiceImpl()
    }
}

The preceding AppConfig class is equivalent to the following Spring <beans/> XML:

1
2
3
<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>

Full @Configuration vs “lite” @Bean mode?

When @Bean methods are declared within classes that are not annotated with @Configuration, they are referred to as being processed in a “lite” mode. Bean methods declared in a @Component or even in a plain old class are considered to be “lite”, with a different primary purpose of the containing class and a @Bean method being a sort of bonus there. For example, service components may expose management views to the container through an additional @Bean method on each applicable component class. In such scenarios, @Bean methods are a general-purpose factory method mechanism.

Unlike full @Configuration, lite @Bean methods cannot declare inter-bean dependencies. Instead, they operate on their containing component’s internal state and, optionally, on arguments that they may declare. Such a @Bean method should therefore not invoke other @Bean methods. Each such method is literally only a factory method for a particular bean reference, without any special runtime semantics. The positive side-effect here is that no CGLIB subclassing has to be applied at runtime, so there are no limitations in terms of class design (that is, the containing class may be final and so forth).

In common scenarios, @Bean methods are to be declared within @Configuration classes, ensuring that “full” mode is always used and that cross-method references therefore get redirected to the container’s lifecycle management. This prevents the same @Bean method from accidentally being invoked through a regular Java call, which helps to reduce subtle bugs that can be hard to track down when operating in “lite” mode.

Full @Configuration vs “lite” @Bean mode?

  • @Configuration으로 주석을 달지 않은 클래스 내에서 @Bean 메서드가 선언되면, “lite” 모드로 처리되는 것을 일컫는다.
  • @Component 또는 심지어 평이한(plain) old class에서 선언된 Bean methods는 “lite”로 간주되며, 포함하는 클래스(containing class)의 다른 1차적 목적(primary purpose)과 @Bean method는 거기서 일종의 보너스로 간주된다.
    • plain old class = POJO
  • 예를 들어, 서비스 components는 각 해당 component class에 대한 추가적인(additional) @Bean method을 통해 컨테이너(container)에 management views를 노출할 수 있다.
  • 그러한 시나리오에서 @Bean methods는 general-purpose factory method 메커니즘이다.

  • full @Configuration과 달리 lite @Bean 방법은 bean 사이의 종속성(inter-bean dependencies)을 선언할 수 없다.
  • 대신, 그들은 포함하는 구성요소의 내부 상태(internal state)와 선택적으로 그들이 선언할 수 있는 arguments으로 작동한다.
  • 따라서 이러한 @Bean method는 다른 @Bean methods를 호출해서는 안 된다.
  • 각각의 그러한 방법은 special runtime semantics 없이 말 그대로 특정 bean reference를 위한 factory method일 뿐이다.
  • 여기서 긍정적인 side-effect는 런타임에 CGLIB subclassing을 적용할 필요가 없기 때문에 클래스 설계 측면에서는 제한이 없다(즉, the containing class가 final일 수도 있다 등).

  • 일반적인 시나리오에서 @Bean methods는 “full” 모드가 항상 사용되며 cross-method references가 따라서 컨테이너의 라이프사이클 관리(container’s lifecycle management)로 리디렉션되도록 보장하면서 @Configuration 클래스 내에 선언되어야 한다.
  • 이것은 regular Java call을 통해 같은 @Bean method가 우연히 호출되는 것을 방지해, “lite” 모드로 운용할 때 추적하기 어려울 수 있는 미묘한 버그(subtle bugs)를 줄이는 데 도움이 된다.

The @Bean and @Configuration annotations are discussed in depth in the following sections. First, however, we cover the various ways of creating a spring container using by Java-based configuration.

  • @Bean@Configuration annotations는 다음 절에서 자세히 설명된다.
  • 그러나 먼저, 우리는 Java-based configuration에 의해 스프링 컨테이너(spring container)를 만드는 다양한 방법을 다룬다.

References

This post is licensed under CC BY 4.0 by the author.

[Spring] 1.12. Java-based Container Configuration

[Spring] 1.12.2. Instantiating the Spring Container by Using AnnotationConfigApplicationContext