POJO에 @bean 메서드를 넣으면 bean이 만들어질까?
-> 만들어질 수 있다. 하지만 @ComponentScan 설정을 바꿔야 한다.
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은 기본 설정이 있다.
기본 설정은 @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 설정을 추가하는 코드를 만드는 일은 없을 것 같다.