일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- k번째큰수
- Class Loader
- 기본형 매개변수
- 싱글톤 패턴
- 백준 2164
- 네트워크
- 팩토리패턴
- 참조형 매개변수
- 스프링 컨테이너
- @Tranctional
- try-catch
- 자바의 면접
- 스프링
- 쇠막대기
- 리버스 프록시
- 빈 타입 조회
- 스프링 싱글톤
- removeAll
- 옵저버 패턴
- 팩토리 패턴
- mvvm패턴
- www.naver.com치면 발생하는일
- SOLID원칙
- 전략 패턴
- TCP/IP 4계층
- 후위표기식
- 백준 1935
- 참조형 반환타입
- 스프링 빈
- 포워드 프록시
- Today
- Total
스파이더 웹 개발
컴포넌트 스캔 본문
컴포넌트 스캔이란?
수동으로 스프링 빈을 등록하는 방법이 아닌 자동으로 스프링 빈을 등록하는 방법
코드를 보면서 살펴보자
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
기존에 수동으로 빈을 등록하는 방법과는 다르게 @Bean 어노테이션이 붙은 메서드가 없는것을 알 수 있다. 그러면 어떻게 빈을 등록할 수 있을까? 그 방법은 빈을 등록하고자 하는 클래스에 @Component 어노테이션을 붙여주면 된다
@Component
public class OrderServiceImpl implements OrderService{
해당 어노테이션을 붙여주면 컴포넌트 스캐은 컴포넌트 어노테이션이 붙은 클래스를 빈으로 등록하는데 의아한 점은 기존의 @Bean을 사용하였을때는 의존관계를 직접 명시하였는데, @Component 어노테이션을 사용하면 어디에도 명시하는 부분이 없다. 이때 @Autowried를 사용하면 의존관계를 자동으로 주입해주어 해당 부분도 해결되게 된다
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
Tip.
스프링 부트를 사용하면 스프링 부트의 @SpringBootApplication의 @ComponentScan이 들어있다
컴포넌트 스캔 대상은 아래와 같은데, 아래 어노테이션을 살펴보면 전부 @Component가 들어있는것을 확인할 수 있다
- @Component
- @Controller
- @Service
- @Repository
- @Configruation
중복 등록과 충돌
자동 등록 vs 자동 등록
이름이 같은 경우 스프링은 오류가 발생되는데 ConflictingBeanDefinitionException 예외가 발생된다
수동 등록 vs 자동 등록
해당 경우에는 수동 빈 등록이 우선권을 가진다
그러나 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다. 수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러 Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
'Spring' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2022.08.03 |
---|---|
의존관계 자동 주입 (0) | 2022.07.31 |
싱글톤 컨테이너 (0) | 2022.07.29 |
스프링 컨테이너와 스프링 빈 (0) | 2022.07.25 |
@Transactional 알고 쓰자 (0) | 2022.07.24 |