1. 개요

Spring 5는 애플리케이션 컨텍스트에서 기능 빈 등록을 지원합니다.

간단히 말해서 이것은 GenericApplicationContext 클래스 에 정의된 새로운 registerBean() 메소드 의 오버로드된 버전을 통해 수행될 수 있습니다 .

이 기능이 작동하는 몇 가지 예를 살펴보겠습니다.

2. 메이븐 의존성

Spring 5 프로젝트 를 설정하는 가장 빠른 방법 은 pom.xml 에 spring-boot-starter-parent 의존성을 추가하여 Spring Boot 를 사용하는 것입니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.2</version>
</parent>

JUnit 테스트 에서 웹 애플리케이션 컨텍스트를 사용하려면 예제에 spring-boot-starter-webspring-boot-starter-test 도 필요합니다 .

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

물론 빈을 등록하는 새로운 기능적 방법을 사용하기 위해 Spring Boot 가 필요하지는 않습니다. 스프링 코어 의존성을 직접 추가할 수도 있습니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.3.3</version>
</dependency>

3. 기능성 빈 등록

registerBean() API 는 두 가지 유형의 기능 인터페이스를 매개변수로 수신할 수 있습니다 .

  • 개체를 만드는 데 사용 되는 Provider 인수
  • BeanDefinition 을 사용자 정의하기 위해 하나 이상의 람다 표현식을 제공하는 데 사용할 수 있는 BeanDefinitionCustomizer vararg 이 인터페이스에는 단일 customize() 메서드 가 있습니다.

먼저 빈을 생성하는 데 사용할 매우 간단한 클래스 정의를 생성해 보겠습니다.

public class MyService {
    public int getRandomNumber() {
        return new Random().nextInt(10);
    }
}

JUnit 테스트 를 실행하는 데 사용할 수 있는 @SpringBootApplication 클래스 도 추가해 보겠습니다 .

@SpringBootApplication
public class Spring5Application {
    public static void main(String[] args) {
        SpringApplication.run(Spring5Application.class, args);
    }
}

다음으로 @SpringBootTest 어노테이션을 사용하여 테스트 클래스를 설정하여 GenericWebApplicationContext 인스턴스를 생성할 수 있습니다.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Spring5Application.class)
public class BeanRegistrationIntegrationTest {
    @Autowired
    private GenericWebApplicationContext context;
   
    //...
}

예제에서는 GenericWebApplicationContext 유형을 사용하고 있지만 모든 유형의 애플리케이션 컨텍스트를 동일한 방식으로 사용하여 빈을 등록할 수 있습니다.

인스턴스를 생성하기 위해 람다 표현식을 사용하여 빈을 등록하는 방법을 살펴보겠습니다 .

context.registerBean(MyService.class, () -> new MyService());

이제 빈을 검색하고 사용할 수 있는지 확인합시다.

MyService myService = (MyService) context.getBean("com.baeldung.functional.MyService"); 
 
assertTrue(myService.getRandomNumber() < 10);

이 예제에서 bean 이름이 명시적으로 정의되지 않은 경우 클래스의 소문자 이름에서 결정되는 것을 볼 수 있습니다. 위의 동일한 방법을 명시적인 bean 이름과 함께 사용할 수도 있습니다.

context.registerBean("mySecondService", MyService.class, () -> new MyService());

다음 으로 람다 식을 추가하여 빈을 사용자 지정하여 빈을 등록하는 방법을 살펴보겠습니다 .

context.registerBean("myCallbackService", MyService.class, 
  () -> new MyService(), bd -> bd.setAutowireCandidate(false));

이 인수는 autowire-candidate 플래그 또는 기본 플래그 와 같은 빈 속성을 설정하는 데 사용할 수 있는 콜백입니다 .

4. 결론

이 빠른 사용방법(예제)에서 우리는 빈을 등록하는 기능적 방법을 사용하는 방법을 살펴보았습니다.

예제의 소스 코드는 GitHub 에서 찾을 수 있습니다 .

Generic footer banner