Bean
- 스프링은 Java 객체를 자신만의 형태로 바꾸는데, 그것을 Bean이라고 한다.
- 즉 스프링 안에서는 "Bean = 객체"라고 생각하면 된다.
BeanFactory
- 해당 인터페이스로 Bean의 각종 설정을 하거나 Bean을 가져올 수 있다.
Spring Container에 Bean을 등록하는 방법?
1. XML 방식
- Bean 설정파일은 XML과 Java 설정 파일로 작성할 수 있는데 최근 추세는 자바 설정파일을 좀 더 많이 사용한다.
/* Bean 객체 */
<bean id="teamA" class="Team"/>
<bean id="user" class="User">
<constructor-arg>
<value="1"/>
<value="개발자"/>
<ref="teamA"/>
</bean>
2. Component Scanning
@ComponentScan
- 스프링 3.1부터 도입된 Annotation이다.
- Component 스캔 위치를 설정할 수 있다.
- 어떤 Annotation을 스캔할지 또는 하지 않을지 결정하는 Filter 기능을 포함한다.
@Component
- @Component가 스캔 기준이 되는 어노테이션이다
- @Component를 포함하고 있는 클래스들이 스캐닝되고 Bean으로 등록된다.
대표적인 @Component
- @Contoller
- @Repositor
- @Service
- @Configuration
@ComponentScan 동작 원리
- BeanFactoryPostProcessor를 구현한 ConfigurationClassPostProcessor에 의해 동작
- BeanFactoryPostProcessor는 다른 모든 Bean들을 만들기 전에 BeanFactoryPostProcessor의 구현체들을 모두 적용
- 다른 Bean들을 등록하기 전에 Component 스캔을 해서 Bean으로 등록
- @ComponentScan은 다른 Bean들을 찾아 BeanFactoryPostProcessor의 구현체를 적용하여 Bean으로 등록해주는 과정
@ComponentScan 범위
1. BasePackages
- 스캔 위치를 설정하는 방법 중 하나
- String으로 입력된 패키지의 경로를 스캔하는 방법
- TypeSafe하지 않기 때문에 BasePackagesClasses 사용이 더 안전
2. BasePackageClasses
- 스캔 위치를 설정하는 방법
- 전달된 클래스의 위치를 기준으로 스캔
BasePackageClasses 적용 예시
- SpringBoot 프로젝트에서는 @SpringBootApplication에 이미 @Configuration과 @ComponentScan이 붙어있음
- @SpringBootApplication 기준으로 Component 스캔이 진행
- 위와 같은 패키지 구조일 때 Application이 속해 있는 패키지는 스캔이 적용
- 이 패키 밖에 있는 out 패키지 내부 클래스는 스캔이 적용되지 않음
@ComponentScan과 @Autowired의 차이점
- @ComponentScan은 다른 Bean들을 찾아 BeanFactoryPostProcessor의 구현체를 적용하여 Bean으로 등록해주는 과정이다.
- @Autowired는 등록된 다른 Bean을 찾아 BeanPostProcessor의 구현체를 적용하여 의존성 주입을 적용하는 역할
참조
https://jjingho.tistory.com/9
https://baek.dev/post/21/#field-based-dependency-injection
https://velog.io/@seculoper235/Spring-Core-Bean%EC%9D%B4%EB%9E%80