기존에 공부했던 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

+ Recent posts