의존 관계 자동 주입
- 설정정보가 없어도 자동으로 스프링 빈을 등록해 준다.
- @Autowired 기능도 제공해 준다.
사용방법
□ Config파일에 @ComponentScan Annotation 붙이기
@Configuration
@ComponentScan
public class AutoAppConfig {
}
□ 스프링 빈에 등록할 클래스들에 @Component Annotation을 붙인다.
@Component
public class MemoryMemberRepository implements MemberRepository {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
생성자에 @Autowired Annotation을 붙이면 자동으로 객체를 주입시켜 준다.
작동 순서
□ @ComponentScan
- @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
□ @Autowired 의존관계 자동 주입
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
탐색 위치와 기본 스캔 대상
모든 자바 클래스들을 스캔하면 너무 오래 걸린다. 따라서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다.
@ComponentScan(
basePackages = "hello.core",
}
- package를 "hello.core"로 시작위치를 정할 수 있다. 해당 패키지 하위 패키지를 모두 탐색한다.
- 지정하지 않은 경우 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
- 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것을 권장한다.
컴포넌트 스캔 대상
종류 | 설명 |
@Component | - 컴포넌트 스캔에서 사용 |
@Controller | - 스프링 MVC 컨트롤러에서 사용 |
@Service | - 스프링 비즈니스 로직에서 사용 |
@Repository | - 스프링 데이터 접근 계층에서 사용 - 데이터 계층의 예외를 스프링 예외로 변환 |
@Configuration | - 스프링 설정 정보에서 사용 - 스프링 빈이 싱글톤을 유지하도록 추가 처리 |
중복 등록과 충돌
□ 자동 빈 등록 vs 자동 빈 등록
- 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 이름이 같은 경우 스프링은 오류를 발생시킨다.
- ConflictingBeanDefinitionException 예외 발생
□ 수동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록이 우선권을 가지고 자동 빈을 오버라이딩 해버린다.
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true`
충돌이 나는 경우 이와 같은 에러를 스프링에서 발생시킨다.
하지만 spring.main.allow-bean-definition-overriding=true 다음과 같이 설정하는 경우 오버라이딩 된다.
# 참고한 자료
- 인프런 김영한 님 강의
'Backend > Spring' 카테고리의 다른 글
Singleton Container (0) | 2024.01.09 |
---|---|
Container와 Bean (0) | 2024.01.08 |
객체지향원칙 5가지 (0) | 2024.01.04 |
스프링 핵심 원리 이해 1, 2 (0) | 2024.01.04 |