21.04.06 00:03 작성
·
258
2
1.@Configuration @bean , @component 는
스프링 컨테이너에 빈을 등록하고 구성
2.Autowired 는 컨테이너안에 빈들을
자동으로 생성자 세터 메서드 등을 이용해서
서로 주입해주는 수단
3. ComponentScan 은
@Component , @Service, @Repository, @Controller. 어노테이션이 붙어있는 클래스들을
스캔하여 빈으로등록
4.new AnnocationConfigApplicationContext(class); 는
스프링 컨테이너 Bean을 객체생성 하는시점이며 인자값으로 명시한 클래스 들을
getBean 으로 꺼내서 사용할수있다. 이게맞나요?.
5. 질문
public class AllBeanTest {
@Test
void findAllMap(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L,"woojin",Grade.VIP);
int discountPrice = discountService.discount(member,10000,"rateDiscount");
Assertions.assertThat(discountPrice).isEqualTo(1000);
}
static class DiscountService{
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
@Autowired
DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discounts(member,price);
}
}
}
1)임의로 만드신 static class DiscountService 인데요
스프링컨테이너에 빈으로등록된 값들을 @Autowired로 주입 받고있는데용
DiscountService 클래스는 스프링컨테이너에 빈으로 등록되지않아서
@Autowired 을 주입받을수없고
new AnnotationConfigApplicationContext(DiscountService.class); 한시점부터 빈으로 등록이되고
@Autowired로 선언된 생성자 부분에 값들을 주입받을수 있기 시작한건가요?
여기서 혼동이와서요
2) 1)번과 같은 혼동이 온이유는
static DiscountService 는 컨테이너에 등록되지 않은 일반클래스로 보이는데..
@Autowired로 빈에 등록된 값을 주입 을 받으려하고 있어서요.
1)번과 같이 주입 받기위해 new AnnotationConfigApplicationContext(DiscountService.class); 로
빈으로 등록이되고 주입을 받기 시작하는건가요?
답변 1
7
2021. 04. 06. 22:53
안녕하세요. woojin126님!
앞에서 문의하신 내용들은 맞습니다.
그런데 여기에서 정말 중요한 사실이 있습니다.
스프링 빈들은 스프링 컨테이너에 등록됩니다.
그러면 스프링 컨테이너는 뭘까요?
바로 new AnnotationConfigApplicationContext() 이것이 스프링 컨테이너 입니다!
지금 테스트 코드에서는 스프링 부트를 전혀 사용하지 않습니다. 순수하게 자바 환경에서 마치 main 메서드를 처음 실행하듯이 테스트 코드를 실행합니다. 따라서 방금 만드신 ApplicationContext 객체 자체가 바로 스프링 컨테이너 그 자체입니다.
다음 코드를 실행하면
new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
스프링이 스프링 컨테이너를 내부에 만들면서, 처음에 AutoAppConfig, DiscountService를 스프링 빈으로 자동 등록하면서 시작합니다.
감사합니다.
2021. 04. 07. 13:02
정말 감사합니다 바쁘신와중에도.. 좋은강의 감사합니다.