1. 컴포넌트 스캔
@ComponentScan
- @Component가 붙은 클래스를 빈으로 등록한다.
- 아래의 코드처럼, @Component가 붙어있어도 제외할 수 있다.
- Configuration 어노테이션이 붙은 것은 필터링해서 제외하라.
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
@ComponentScan + @Autowired를 통해서 빈 등록과 의존관계 주입을 쉽게할 수 있다.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
등록되는 스프링 빈의 기본 이름은
- 맨 앞글자만 소문자로 변경해서 빈으로 등록된다.
- ex) MemberServiceImpl => memberServiceImpl
2. 컴포넌트 스캔 탐색 위치, 스캔 대상
1. 패키지 대상 스캔 (basePackages)
@ComponentScan(
basePackages = "hello.core.member"
)
2. 클래스 대상 스캔 (basePackageClasses)
@ComponentScan(
basePackageClasses = AutoAppConfig.class
)
패키지를 포함해서 하위 패키지를 모두 탐색한다.
- 그냥 @ComponentScan만 있으면(default)
- 현재 ComponentScan을 붙인 프로젝트에서, 하위 패키지를 모두 탐색한다.
자바에서 Annotation 간에 상속은 없다.
- 이는 스프링에서 지원해주는 기능이다.
아래의 4가지 어노테이션은 모두 @Component 를 포함한다.
- @Controller : 스프링 MVC 컨트롤러로 인식
- @Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층 예외를 스프링 예외로 변환해준다.
- @Configuration : 스프리 설정 정보로 인식하고, 빈이 싱글톤으로 유지하도록 처리해준다.
- @Service : 별 기능은 없으나, 비즈니스 계층을 인식하는데 도움이 된다.
3. 중복 등록과 충돌
자동 빈 등록(@Component) vs 자동 빈 등록
- 같은 이름의 빈이 두 번 등록되면 ConflictingBeanDefinitionException 발생
수동 빈 등록(@Bean) vs 자동 빈 등록
- 같은 이름의 빈 (@Component, @Bean) 이 두 번 등록되면 오버라이딩된다.
- 수동 등록된 빈(@Bean) 이 우선권을 갖는다.
- 하지만 스프링부트(@SpringBootApplication)는 수동 vs 자동 빈 등록이어도, 에러가 나도록 만들었다.
- 이를 허용하게 하려면
- spring.main.allow-bean-definition-overriding=true 로 변경해야한다.
- 이를 허용하게 하려면
'강의 정리 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
7. 빈 스코프 (0) | 2020.12.24 |
---|---|
6. 빈 생명주기 콜백 (0) | 2020.12.23 |
3. 싱글톤 컨테이너 (0) | 2020.12.15 |
2. 스프링 컨테이너와 스프링 빈 (0) | 2020.12.13 |
1. 객체지향 설계와 스프링 (0) | 2020.12.12 |