@Configuration
@ComponentScan
public class AutoAppConfig {
}
@ComponentScan
을 사용하면 @Component
가 사용된 클래스를 스캔하여 스프링 빈으로 등록한다.
@Configuration
도 내부에 @Component
가 사용되었기 때문에 컴포넌트 스캔의 대상이 된다.
스프링 빈으로 등록할 MemberServiceImpl 클래스
@Component
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@ComponentScan
은 @Component
가 붙은 모든 클래스를 스프링 빈으로 등록@Component("myBean")
과 같이 사용@Autowired
를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.@ComponentScan(
basePackages = "hello.core", //탐색할 패키지 지정
)
basePackages
: 탐색할 패키지의 시작 위치 지정, 해당 패키지를 포함하여 모든 하위 패키지 탐색 basePackages = {"hello.core", "hello.core2"}
@ComponentScan
이 붙은 클래스의 패키지가 시작위치basePackageClasses
: 지정한 클래스의 패키지를 시작위치로 지정참고>
- Spring Boot 를 사용하면 대표 시작 정보인
@SpringBootApplication
이 프로젝트의 시작 루트 위치에 존재한다. 그 안에@ComponentScan
이 존재하므로 프로젝트의 모든 대상을 스캔하게 된다.- Annotation은 상속 관계가 없다. Annotation이 다른 Annotation을 가지고 있는 것을 인식하는 것은 자바 언어가 아닌 스프링이 지원하는 기능이다.
@Component
: 컴포넌트 스캔에 사용@Controller
: 스프링 MVC 컨트롤러에서 사용@Service
: 스프링 비즈니스 로직에서 사용@Repository
: 스프링 데이터 접근 계층에서 사용@Configuration
: 스프링 설정 정보에서 사용@Controller
: 스프링 MVC 컨트롤러로 인식@Repository
: 스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환해준다.@Configuration
: 스프링 설정 정보로 인식, 스프링 빈이 싱글톤을 유지하도록 처리includeFilters
컴포넌트 스캔 대상을 추가로 지정excludeFilters
컴포넌트 스캔에서 제외할 대상을 지정 @ComponentScan(
includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
컴포넌트 스캔을 할 때 같은 이름의 빈을 여러개 등록하는 경우 충돌이 발생한다.
컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록될 때 같은 이름의 빈이 있는 경우 스프링은 오류를 발생시킨다. ConflictingBeanDefinitionException
@Component
로 등록된 클래스가 스프링 빈으로 등록@Bean
을 활용하여 설정정보에서 직접 팩토리 메서드를 활용하여 스프링 빈으로 등록Spring Boot를 사용하면 수동 등록 빈과 자동 등록 빈이 충돌하는 경우 오류를 발생하도록 기본 설정이 변경되었다.