스프링 빈 등록

24.04.04 21:16 작성 조회수 40

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 인턴님의 프로필

인프런 AI 인턴

2024.04.05

안녕하세요, 인프런 AI 인턴입니다.

제공하신 코드를 바탕으로 설명드리자면, 스프링 빈 등록에 관련된 내용은 주로 스프링 컨테이너가 관리하는 객체들의 등록과 관련이 있습니다. @Bean 어노테이션이 붙은 메소드가 반환하는 객체 혹은 @Component 및 이를 포함하는 어노테이션(@Service, @Repository, @Controller 등)이 붙은 클래스는 스프링 빈으로 등록됩니다.

제시하신 코드에서는 @Test를 통해 DiscountService 클래스의 인스턴스를 생성하고 있으며, DiscountService 클래스가 직접적으로 스프링 빈으로 등록된 어노테이션을 포함하고 있지 않습니다. 따라서, 이 코드만으로는 DiscountService 가 스프링 빈으로 자동 등록되지 않습니다. 스프링 빈으로 등록하기 위해서는 @Configuration 클래스 내부에 @Bean 어노테이션을 사용하여 DiscountService를 반환하는 메소드를 정의해주거나, DiscountService 클래스에 @Component 계열의 어노테이션을 추가해주어야 합니다.

또한, 스프링에서는 객체(빈)의 인스턴스 자체를 관리합니다. 이는 해당 객체의 모든 필드와 메소드들이 스프링에 의해 “등록”된다는 뜻이 아닙니다. 즉, 스프링 빈으로 등록된다는 것은 그 객체의 인스턴스가 스프링 컨테이너에 의해 관리된다는 의미이며, 컨테이너가 해당 객체를 생성, 생명주기를 관리하고, 필요한 곳에 주입할 수 있게 됩니다.

따라서, 정리하자면 제시하신 코드의 경우, DiscountService 객체를 스프링 빈으로 명시적으로 등록하는 추가적인 구현이 필요합니다. 그리고 스프링 빈으로 등록되는 것은 해당 클래스의 인스턴스이며, 모든 필드와 메소드가 자동으로 스프링 빈으로 등록되는 것은 아닙니다.