기존에 공부했던 AutoAppConfig 는 @ComponentScan 어노테이션이 붙어있어서 @Component 가 붙은 클래스를 모두 스캔한다.
@Configuration
@ComponentScan(
basePackages = "hello.core.member", //member 패키지를 포함한 하위 패키지까지 컴포넌트 스캔 대상이 됨
basePackageClasses = AutoAppConfig.class, //지정한 클래스의 패키지만 컴포넌트 스캔 대상이 됨
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
@Component가 붙은 FixDiscountPolicy,RateDiscountPolicy
@Component public class FixDiscountPolicy implements DiscountPolicy{ ~~ }
@Component public class RateDiscountPolicy implements DiscountPolicy{ ~~ }
[AllBeanTest]
public class AllBeanTest {
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
}
static class DiscountService{
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
//생성자
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap,
List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = "+ policyMap);
System.out.println("policies = "+ policies);
}
}
}
빈 등록과 함께 의존성 주입이 이루어지는데
먼저 빈등록 코드 설명을 하자면
- ApplicationContext ac = new AnnotationConfigApplicationContext(DiscountService.class);
이렇게 하면 DiscountService 클래스만 스프링빈에 등록이 되니까 AutoAppConfig.class 도 추가해주기
- ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
첫번째 파라미터 AutoAppConfig 클래스는 컴포넌트 스캔을 통해 @Component 어노테이션이 붙은 클래스들을 스프링 빈으로 등록하고
두번째 파라미터 DiscountService 클래스는 직접 스프링 빈으로 등록하는 역할을 한다.
- public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies)
DiscountService 클래스의 생성자에서 DiscountPolicy 를 의존성 주입이 이루어졌다
그리고 Map , List 형태로 담는데
DiscountPolicy 인터페이스를 구현한 여러 클래스( FixDiscountPolicy,RateDiscountPolicy ) 를 Map , List 형태로 담는다.
Map , List 형태란??
- Map : policyMap 은 각 구현 클래스의 이름을 key 값으로 하고, 구현 객체를 value로 가진다. ex) {키 = 값, 키 = 값}
- List : policies 는 모든 객체를 리스트 형태로 가져온다. ex) [ ]
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
[결과]
반응형
LIST
'공부' 카테고리의 다른 글
Spring | 관심사의 분리 (AppConfig)와 의존성 주입 , AppConfig 리팩터링 (0) | 2023.12.19 |
---|---|
Spring | 빈 생명주기 콜백이란?, 초기화 콜백과 소멸 전 콜백 (0) | 2023.12.02 |
Spring | 다양한 의존관계 주입 방법 (0) | 2023.11.30 |
Spring | @ComponentScan , @Autowired 의존관계 자동주입 (0) | 2023.11.29 |
Spring | BeanFactory , ApplicationContext , 스프링의 다양한 설정 형식 (자바코드, XML) (0) | 2023.11.28 |