본 게시물은 김영한 선생님의 강의를 학습하며 작성하였습니다.
@Configuation
은 singleton을 위해 존재!!
package com.hello.core.singleton; import com.hello.core.AppConfig; import com.hello.core.member.MemberRepository; import com.hello.core.member.MemberServiceImpl; import com.hello.core.order.OrderServiceImpl; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class ConfigurationSingletonTest { @Test void configurationTest() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); MemberRepository memberRepository1 = memberService.getMemberRepository(); MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberRepository = " + memberRepository); System.out.println("memberService -> memberRepository1 = " + memberRepository1); System.out.println("orderService -> memberRepository2 = " + memberRepository2); Assertions.assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); Assertions.assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); } }
package com.hello.core; import com.hello.core.discount.DiscountPolicy; import com.hello.core.discount.RateDiscountPolicy; import com.hello.core.member.MemberRepository; import com.hello.core.member.MemberService; import com.hello.core.member.MemberServiceImpl; import com.hello.core.member.MemoryMemberRepository; import com.hello.core.order.OrderService; import com.hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } }
왜 3개 다 똑같을까?
로직은 3번 실행되어야 맞는거같은데
@Configuation
과 바이트코드의 조작의 마법
'Backend > Spring' 카테고리의 다른 글
[섹션 7]의존관계 자동 주입 - 다양한 의존관계 (0) | 2024.03.18 |
---|---|
[섹션 6]컴포넌트 스캔 (0) | 2024.03.18 |
[섹션 4] 스프링 빈 설정 메타 정보 - BeanDefinition (0) | 2024.03.18 |
[섹션 4] 다양한 설정 형식 지원 - 자바 코드, XML (0) | 2024.03.18 |
[섹션 4] BeanFactory와 ApplicationContext (0) | 2024.03.18 |