스프링빈에 등록할때 지금까지는 자바코드로 등록을 했다. 이렇게 등록해야할 빈이 많이지면 설정정보도 커지고 누락하는 문제도 생긴다.
그래서 클레스를 만들면서 파일이 있으면 그냥 빈으로 등록해주는 방법이 있다 그것이 컴포넌트 스캔이다.
@Component
클레스에 붙여주면된다.
컴포넌트 스캔을 이용해서 클레스에서 기본적으로 빈등록을 하게해주면 따로 의존관계를 적을 곳이 없다 그래서 그 클레스 내부에서 생성자를 만들면서 @Autowired
를 써주면 그 클레스 이름으로 생성된 빈이 주입되게 된다.
@ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다.
이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.
빈 이름 기본 전략: MemberServiceImpl 클래스 memberServiceImpl
빈 이름 직접 지정: 만약 스프링 빈의 이름을 직접 지정하고 싶으면
@Component("memberService2") 이런식으로 이름을 부여하면 된다
생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
이때 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.
getBean(MemberRepository.class) 와 동일하다고 이해하면 된다.
탐색할 패키지의 시작 위치 지정
모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작
위치를 지정할 수 있다.
@ComponentScan(
basePackages = "hello.core",
자동 빈 등록 vs 자동 빈 등록
컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다.
ConflictingBeanDefinitionException 예외 발생
최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을
바꾸었다.
수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러
Consider renaming one of the beans or enabling overriding by setting
spring.main.allow-bean-definition-overriding=true
스프링 부트인 CoreApplication 을 실행해보면 오류를 볼 수 있다.