컴포넌트 스캔과 의존관계 자동 주입 시작하기
- 직접 @Bean을 통해 스프링 빈을 지정하다 보면 프로젝트가 커졌을때 귀찮고, 누락되는 정보도 있을것이다. 따라서 설정정보가 없어도 자동으로 스프링 빈을 등록해주는 컴포넌트 스캔이라는 기능을 제공
- 또한 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공
더보기
스프링 컨테이너와 빈을 사용하는이유
서로 연관되어있는 객체(인스턴스 , 메서드)를 직접가져다 쓰면 ocr을 위반하고 유지보수면에서 불편함이 있기때문 기억하기
AutoAppConfig.java
@Configuration 어노테이션은 그대로 -> 설정정보이기 때문
@ComponentScan 어노테이션을 이용하면 자동으로 @Component가 붙은 클래스를 스프링 컨테이너에 빈으로 등록
@Configuration
@ComponentScan(
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
Configuration.class))
public class AutoAppConfig {
}
MemoryMemberRepository @Component 추가
@Component
public class MemoryMemberRepository implements MemberRepository {}
RateDiscountPolicy @Component 추가
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
MemberServiceImpl @Component, @Autowired 추가
- @Autowired가 자동으로 의존관계 주입
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
컴포넌트 스캔과 자동 의존관계 주입
1. @ComponentScan
- @ComponentScan이 @Component가 붙은 모든 클래스를 스프링 빈으로 등록
- 이때 스프링 빈의 기본 이름은 클래스명을 사용하지만 첫글자가 소문자(카멜 기법)
- 직접 이름을 지정하고 싶다면 @Component("memberService2") 과 같이 지정 가능
2. @Autowired의존관계 자동주입
- 생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입
- 기본적으로 같은 타입의 빈을 찾아 주입(부모타입도 같은 타입)
- getBean(MemberRepository.class) 와 동일하다고 이해하면 된다.
탐색 위치와 기본 스캔 대상
탐색할 패키지의 시작 위치 지정
- 모든 자바 클래스를 스캔하려면 너무 많은 시간이 걸리기 때문에 스캔 시작 위치(시작 위치에서 최하단 폴더까지)를 정할수 있다.
@ComponentScan(
basePackages = "hello.core",
}
- basePackages = {"hello.core", "hello.service"} 이렇게 여러 시작 위치를 지정할 수도 있다.
- 만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다
권장하는 방법
- 최상단에 놓자
컴포넌트 스캔 기본 대상
다음 어노테이션들도 컴포넌트 스캔의 기본대상으로 지정
- @Component : 컴포넌트 스캔의 대상으로 사용
- @Controlller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
필터
- includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
- excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.
FilterType 옵션
- ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
- ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
- ASPECTJ: AspectJ 패턴 사용
- REGEX: 정규 표현식
- CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
중복 등록과 충돌
두가지 상황이 있다.
- 자동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록 vs 자동 빈 등록
자동 빈 등록 vs 자동 빈 등록
- ConflictingBeanDefinitionException 오류 발생
수동 빈 등록 vs 자동 빈 등록
- 수동빈이 우선권을 가짐
- 최근 스프링부트에서는 그냥 오류를 내버림
참고강의
728x90
'Spring' 카테고리의 다른 글
JPA Auditing기능이란? (0) | 2022.12.29 |
---|---|
스프링 핵심 원리[기본편] - 의존관계 자동 주입 (0) | 2022.12.28 |
스프링 핵심 원리[기본편] - 싱글톤 컨테이너 (0) | 2022.12.27 |
스프링 핵심 원리[기본편] - 스프링 컨테이너와 스프링 빈 (0) | 2022.12.27 |
스프링 핵심 원리[기본편] - 예제만들기 , 객체 지향 원리 적용 (0) | 2022.12.27 |