POJO에 @bean 메서드를 넣으면 bean이 만들어질까?

jinwook han·2020년 8월 27일
0

POJO에 @bean 메서드를 넣으면 bean이 만들어질까?
-> 만들어질 수 있다. 하지만 @ComponentScan 설정을 바꿔야 한다.

bean lite mode

spring bean 문서에 보면, 일반 클래스(POJO)에도 @Bean 메서드를 선언하여 Bean을 만들 수 있다고 한다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html
@Bean methods may also be declared within classes that are not annotated with @Configuration. For example, bean methods may be declared in a @Component class or even in a plain old class. In such cases, a @Bean method will get processed in a so-called 'lite' mode.

나는 어노테이션을(ex @Configuration) 클래스에 붙여서, 그 안에 @Bean들을 추가하는 방식을 많이 사용했다.
위 문서에 따르면, 어노테이션 없는 클래스에도 @Bean 메서드들을 넣을 수 있다.

실제로 POJO에 빈 메서드를 넣을 때 빈이 만들어지는지 실험했다.
하지만, 빈이 생성되지 않는다.

public class Bye {

    @Bean("helloBean")
    Hello hello() {
        return new Hello();
    }
}

그림1. 위 코드를 넣어도, Hello Bean이 만들어지지 않는다.
흠.. 왜지?

ComponentScan 기본 설정

ComponentScan은 기본 설정이 있다.
기본 설정은 @Component, @Repository, @Controller, @Service 어노테이션을 가진 클래스만 스캔해서 bean으로 만든다.

기본 설정으로는, POJO 안의 @Bean 메서드를 찾을 수 없는 것이다.

수정 방법

ComponentScan의 useDefaultFilters=false를 적용한다.
그리고 본인이 커스텀하게 @Bean 메서드가 있는 클래스를 스캔할 대상으로 지정하면 된다.

예시:

@ComponentScan(
        useDefaultFilters = false,
		includeFilters = {@ComponentScan.Filter(
				type = FilterType.ASSIGNABLE_TYPE, classes = {Bye.class})})

위 코드를 넣으면 Bye.class 안의 Hello bean이 만들어진다.

더 간단한 방법

더 간단한 방법은, POJO에 bean 메서드를 넣는 방법을 포기하는 것이다.
클래스 위에 @Service, @Component 등의 어노테이션을 추가한다.

업무에서 POJO에 bean 설정을 추가하는 코드를 만드는 일은 없을 것 같다.

0개의 댓글