작성
·
133
0
public class AllBeanTest {
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice).isEqualTo(1000);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
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);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
System.out.println("discountCode = " + discountCode);
System.out.println("discountPolicy = " + discountPolicy);
return discountPolicy.discount(member, price);
}
}
}
이것들을 스프링빈으로 등록하면, 정확히 어떤 것들이 스프링 빈으로 등록되는건가요?
모든 필드, 메소드들이 다 등록되는건가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
제공하신 코드를 바탕으로 설명드리자면, 스프링 빈 등록에 관련된 내용은 주로 스프링 컨테이너가 관리하는 객체들의 등록과 관련이 있습니다. @Bean
어노테이션이 붙은 메소드가 반환하는 객체 혹은 @Component
및 이를 포함하는 어노테이션(@Service
, @Repository
, @Controller
등)이 붙은 클래스는 스프링 빈으로 등록됩니다.
제시하신 코드에서는 @Test
를 통해 DiscountService
클래스의 인스턴스를 생성하고 있으며, DiscountService
클래스가 직접적으로 스프링 빈으로 등록된 어노테이션을 포함하고 있지 않습니다. 따라서, 이 코드만으로는 DiscountService
가 스프링 빈으로 자동 등록되지 않습니다. 스프링 빈으로 등록하기 위해서는 @Configuration
클래스 내부에 @Bean
어노테이션을 사용하여 DiscountService
를 반환하는 메소드를 정의해주거나, DiscountService
클래스에 @Component
계열의 어노테이션을 추가해주어야 합니다.
또한, 스프링에서는 객체(빈)의 인스턴스 자체를 관리합니다. 이는 해당 객체의 모든 필드와 메소드들이 스프링에 의해 “등록”된다는 뜻이 아닙니다. 즉, 스프링 빈으로 등록된다는 것은 그 객체의 인스턴스가 스프링 컨테이너에 의해 관리된다는 의미이며, 컨테이너가 해당 객체를 생성, 생명주기를 관리하고, 필요한 곳에 주입할 수 있게 됩니다.
따라서, 정리하자면 제시하신 코드의 경우, DiscountService
객체를 스프링 빈으로 명시적으로 등록하는 추가적인 구현이 필요합니다. 그리고 스프링 빈으로 등록되는 것은 해당 클래스의 인스턴스이며, 모든 필드와 메소드가 자동으로 스프링 빈으로 등록되는 것은 아닙니다.