Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- http
- Proxy
- 그리디
- db
- Exception
- java
- AOP
- 알고리즘
- 스프링
- Greedy
- QueryDSL
- jpa
- Android
- 자바
- Thymeleaf
- 스프링 핵심 원리
- transaction
- kotlin
- pointcut
- JPQL
- 스프링 핵심 기능
- SpringBoot
- spring
- springdatajpa
- Servlet
- JDBC
- 인프런
- 김영한
- Spring Boot
- 백준
Archives
- Today
- Total
개발자되기 프로젝트
Component 스캔, @Autowired 본문
- 이 전 까지는 스프링 빈을 등록하기 위해서 @Bean을 사용하여 직접 나열했다.
- 근데 너무 귀찮지 않음?????
- 스프링에서는 자동으로 등록하는 Component 스캔기능을 제공함
- 또한 의존관계를 자동으로 주입하는 @Autowired로 제공
1. @ComponentScan
- 컴포넌트 스캔을 사용하기 위해 @ComponentScan를 적용
- @Component가 붙은 클래스를 찾아서 bean으로 등록함
-
@Configuration @ComponentScan( //스캔에서 제외할 것 -->@Configuration @Component임, AppConfig나 TestConfig제외하기 위해. excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { }
- excludeFilters를 적용하면 컴포넌트 스캔 시 제외할 annotaion을 지정할 수 있다.
- 여기서는 @Configuration도 @Component이기 때문에, @Configuration이 적용된, AppConfig 등을 제외위한 목적.
- 일반적으로 @Configuration 제외하지 않는다!
- 이전에 AppConfig처럼 하나하나 나열하지 않아도 된다
- @ComponentScan은 @Component붙은 모든 클래스를 스프링 빈으로 등록
- 이 때 스프링 빈의 기본 이름은 클래스 명을 사용! 하지만 맨 앞글자는 소문자로 사용함.
ex) MemberServiceImpl --> memberServiceImpl
2.@Component 붙여주자.
@Component
public class MemberServiceImpl implements MemberService{
@Component
public class RateDiscountPolicy implements DiscountPolicy{
@Component
public class MemoryMemberRepository implements MemberRepository{
- 흠 그런데... 의존관계를 어떻게 주입하지...?
- AppConfig에는 생성자를 통해 의존관계를 주입할 수 있었다.
- ComponentScan을 사용하면 AppConfig와 같이 설정 정보 자체가 없다.
- 따라서 @Autowired를 통해 의존관계를 주입해줘야 한다.
3. @Autowired
- 생성자에 @Autowired를 붙여주면 스프링이 자동으로 의존관계 주입.
- 스프링 컨테이너가 생성자에 필요한 같은 타입의 스프링 빈을 찾아서 주입해줌.
@Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; //private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); private final DiscountPolicy discountPolicy; //이렇게하면 인터페이스에만 의존함. @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; }
4. Test
- AnnotationConfigAppplicationContext 사용하는 것은 동일
- 단 설정 정보로 AutoAppConfig를 넘겨준다.
public class AutoAppConfigTest {
@Test
void basicScan(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
}
}
4. GitHub : 210728 ComponentScan
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
컴포넌트 스캔, 필터 (0) | 2021.07.28 |
---|---|
Component Scan의 탐색 위치와 스캔 대상 (0) | 2021.07.28 |
@Configuration, 싱글톤, 바이트코드 조작 (0) | 2021.07.28 |
싱글톤, 싱글톤 컨테이너, 스프링 컨테이너 (0) | 2021.07.27 |
스프링 빈 설정 메타정보 - BeanDefinition (0) | 2021.07.26 |
Comments