스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan
****이라는 기능을 제공한다.
@Autowired
라는 기능도 제공한다.컴포넌트 스캔을 사용하면 스프링 빈이 자동으로 등록되는데, 의존관계를 설정할 수 있는 방법(수동으로 등록할 장소)이 없으므로 생성자 위에 @Autowired
를 추가해줌으로써 의존관계를 자동으로 주입한다.
@ComponentScan
@Component
가 붙은 모든 클래스를 스프링 빈으로 등록@Component("memberService2")
@ComponentScan
을 붙인 클래스의 패키지를 시작으로 하위 패키지를 탐색컴포넌트 스캔 기본 대상
@Component
: 컴포넌트 스캔에서 사용@Controller
: 스프링 MVC 컨트롤러에서 사용@Service
: 스프링 비지니스 로직에서 사용@Repository
: 스프링 데이터 접근 계층에서 사용@Configuration
: 스프링 설정 정보에서 사용@Autowired
@Autowired
를 지정 → 스프링 컨테이너가 해당 스프링 빈을 찾아 자동으로 주입getBean(MemberRepository.class)
와 동일필터
includeFilters
: 컴포넌트 스캔 대상을 추가로 지정excludeFilters
: 컴포넌트 스캔에서 제외할 대상 지정excludeFilters
로 예를 들어보면,
package scan.filter;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}
@MyExcludeComponent
어노테이션을 붙인 BeanBpackage scan.filter;
@MyExcludeComponent
public class BeanB {
}
excludeFilters
에 FilterType을 ANNOTATION(기본값)으로 하여 MyExcludeComponent
추가@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
⇒ BeanB는 스프링 빈으로 등록되지 않음
FilterType 옵션
→ 옵션을 변경하기 보다는 스프링의 기본 설정에 맞추어 사용하는 것을 권장!
스프링 빈 중복 등록과 충돌
ConflictingBeanDefinitionException 예외 발생
최근 스프링 부트에서는 수동 빈 등록 vs 자동 빈 등록에서 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.
spring.main.allow-bean-definition-overriding=false
부트가 기본 값으로 false를 가짐spring.main.allow-bean-definition-overriding=true
로 바꾸면 수동 빈이 오버라이딩