<Spring> @Configuration과 @Component (feat. @Bean)
by BFine가. Bean 생성을 위한 어노테이션
a. @Component
- @Component는 클래스나 인터페이스에 대한 객체를 Bean으로 생성해서 스프링 컨테이너에서 관리해라! 선언하는 어노테이션이다.
- 자매품으로 @Controller , @Service , @Repository 가 있고 각각 코드를 확인해보면 @Component가 달려있고 세부 내용은 동일 한 것을 볼수있다.
- ClassPathBeanDefinitionScanner 를 통해 basePackage를 기준으로 auto-scanning 하여 스프링 컨테이너에 Bean으로 등록한다.
b. @Configuaration
- @Configuration도 마찬가지로 내부 코드가 위의 자매품들고 비슷하지만 다른점이 하나 있다. 바로 proxyBeanMethods가 있다. (proxy!)
- @Bean의 경우 Method나 어노테이션 위에서만 사용이 가능하다. 그래서 @Configuration 에 사용하는 것을 많이 볼수가 있다.
- 코드들을 보다 보면 이런식으로 @Bean이 설정된 메서드를 호출해서 다른 Bean 설정시 주입해서 사용하는 경우도 많이 본적이 있을 것 이다.
- 당연하게 '아 Bean을 주입하는구나' 생각하고 넘어가곤 했는데 이렇게 보니 메서드 호출했는데 왜 Bean이 나오는지 궁금해진다.
나. @Configuration과 Proxy
a. @Component에 @Bean 설정해서 메서드 호출해보기
public class ExamA {
}
@Component
public class ExamComponent {
@Bean
public ExamA examA(){
return new ExamA();
}
}
- 결과는 어떻게보면 예상대로 @Bean이 있어도 호출할때마다 새로운 객체가 생성되는 것을 볼 수 있다.
b. @Configuration에 @Bean 설정해서 메서드 호출해보기
@Configuration
public class ExamConfiguration {
@Bean
public ExamA examA(){
return new ExamA();
}
}
- 결과로 두 객체가 같다라는 것을 알 수 있다. 즉 @Configuration의 @Bean이 있는 메서드는 몇번을 호출해도 동일한 객체 Bean을 반환한다.
=> 물론 이렇게 @Configuration 설정한 Bean을 주입하여 사용하지 않는다. ( 포스팅을 위해... )
- 당연하다 생각하고 써왔는데 보니까 어떻게 처리되는지가 궁금해진다. ExamConfiguarion 객체를 출력해보자
- 로그 내용을 보니 실제 원본인 ExamConfiguration이 아니고 Proxy 객체인 것을 확인 할 수가 있다.
=> 여기서 CGLIB는 바이트코드(.class)를 조작하여 원본 객체를 상속하여 프록시 객체를 만드는 라이브러리이다.
- 즉 ExamConfiguration 상속한 Proxy 객체를 만들고 @Bean 이 있는 메서드들을 파악하여 각각에 실제 Bean이 반환하도록 주입 한 것이다.
c. proxyBeanMethods = false
- 이부분을 사용하는 경우는 없겠지만 위의 내용이 맞는지 한번 더 테스트 해보자
@Configuration(proxyBeanMethods = false)
public class ExamConfiguration {
@Bean
public ExamA examA(){
return new ExamA();
}
}
- 예상대로 Proxy 객체가 아닌 원본의 ExamConfiguration 객체를 사용했기 때문에 호출할때마다 새로운객체가 생성되는 것을 알 수 있다.
'공부 > Spring' 카테고리의 다른 글
<Spring> DeviceUtils.getCurrentDevice Null 이슈 (2) | 2021.05.06 |
---|---|
<Spring> Spring Boot의 Gradle 버전 업데이트 하기 (0) | 2021.01.18 |
블로그의 정보
57개월 BackEnd
BFine