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-web 및 spring-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 에서 찾을 수 있습니다 .