※ 본 게시글은 인프런 스프링 핵심 원리 - 기본편 강의를 바탕으로 작성하였습니다.
강의 내용을 참고하여 개인적으로 정리한 글입니다.
지금까지의 수동 빈 등록
@Bean
이나 XML을 통해서 직접 스프링 빈을 등록했다컴포넌트 스캔 사용 방법 1(@ComponentScan
)
@Configuration //설정 정보
@ComponentScan //이거 붙여주면 됨
public class AutoAppConfig {
}
컴포넌트 스캔 사용 방법 2(@Component
)
@Component //애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록
public class MemoryMemberRepository implements MemberRepository {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
컴포넌트 스캔 사용 방법 3 - 의존관계 자동 주입(@Component
, @Autowired
)
@Component
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
@Autowired //ac.getBean(MemberRepository.class)
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
컴포넌트 스캔과 자동 의존관계 주입 동작 방식
1. @ComponentScan
@ComponentScan
은 @Component
가 붙은 모든 클래스를 스프링 빈으로 등록MemberServiceImpl
→memberServiceImpl
(맨 앞글자만 소문자)@Component("memberService2")
이런식으로 이름 부여 하면 됨탐색할 패키지의 시작 위치 지정
@ComponentScan(
basePackages = "hello.core",
)
@ComponentScan
이 붙은 설정 정보 클래스의 패키지가 시작 위치스프링 부트의 대표 시작 정보인
@SpringBootApplication
를 프로젝트 시작 루트 위치에 두는 것이 관례 / 그 안에@ComponentScan
이 들어 있음
컴포넌트 스캔 기본 대상
@Component
- 컴포넌트 스캔에서 사용@Controller
- 스프링 MVC 컨트롤러에서 사용@Service
- 스프링 비즈니스 로직에서 사용, 특별한 처리는 X @Repository
- 스프링 데이터 접근 계층에서 사용@Configuration
- 스프링 설정 정보로 인식, 스프링 빈이 싱글톤을 유지하도록 해줌includeFulters
→ 컴포넌트 스캔 대상을 추가로 지정excludeFulters
→ 컴포넌트 스캔에서 제외할 대상을 지정ConflictingbeanDefinitionException
발생@Component
public class MemoryMemberRepository implements MemberRepository
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
// 수동 빈 등록이 우선권을 가짐
// 수동 빈이 자동 빈을 오버라이딩
@Bean(name = "memoryMemberRepository")
MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}