스프링/1. 스프링 핵심 원리 47

32강. 충돌, 중복등록

자동 빈 등록으로, 같은 이름으로 등록을 시도할 경우 오류를 뱉는다. BeanDefinitionStoreException @Component public class MemoryMemberRepository implements MemberRepository{ private static Map store = new HashMap(); //Map, id랑 Member 객체 간이적으로 메모리에 저장 @Override public void save(Member member) { store.put(member.getId(), member); } @Override public Member findById(Long memberId) { return store.get(memberId); } } 자동 등록 public c..

31강. 필터

@Configuration @ComponentScan( basePackageClasses = AppConfig.class, excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = Configuration.class) ) public class AutoAppConfig { } 필터는 이미 쓴 적 있다. 타입은 Annotation이 기본이므로, 빼도 괜찮다. @Configuration @ComponentScan( basePackageClasses = AppConfig.class, excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = Config..

29강. 컴포넌트 스캔

각 구현체클래스에 @Component 붙여두면 @Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = Configuration.class) ) public class AutoAppConfig { } 이렇게 @ComponentScan 달아두면 저 @Component 붙여둔거 다 찾아서 빈으로 등록시켜 줌.. @ComponentScan에 저거는 필터인데, 저거 빼고 등록시켜준다는 거임. 참고로 각 구현체의 생성자에 @Autowired 달아야 자동 의존관계 주입해줌. Bean Container에서 찾아서 넣어줌. 실무에서는 저렇게 필터는 안하는데, @Configuration..

28강. @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 Rat..

27강. 스프링 컨테이너와 싱글톤

public class SingletonTest { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("싱글톤") public void springContainer(){ MemberService memberService1 = ac.getBean("memberService", MemberService.class); MemberService memberService2 = ac.getBean("memberService", MemberService.class); assertThat(memberService1).isSameAs(memberService2); } } 스프링 빈은 기본 설정..

26강. BeanDefinition

BeanDefinition 저거 인터페이스임. 그래서 여러 곳에서 저렇게 불러들일 수 있는거 @Bean 하나당 메타정보 하나 우리가 AppConfig 저거 쓴거가지고 저걸 만듦 public class BeanDefinitionTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("BeanDefinition 출력") public void findApplicationBean(){ String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : ..

25강. XML로 스프링

다양한 걸로 Bean 가능 public class XmlAppContext { @Test void XmlAppContext(){ ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); MemberService memberService = ac.getBean("memberService", MemberService.class); Assertions.assertThat(memberService).isInstanceOf(MemberService.class); } } 비슷함. xml에서 가져옴. new file 할 때 xml 보면 spring xml 있고, bean만 내가 써줌. id는 bean 이름, class는 실제 구현체

23강. 빈 조회 시 빈들이 상속관계에 있다면?

일단 걍 부모 조회시 자식들 다 끌려나옴. 그래서 Object타입으로 조회 시 모든 Bean 다 끌려나옴. public class ApplicationContextExtendsFindTest { ApplicationContext ac = new AnnotationConfigApplicationContext(ExtendsConfig.class); @Test @DisplayName("부모타입 조회시 자식 여러개면 오류") public void findBeanByParentTypeDuplicate(){ ac.getBean(DiscountPolicy.class); } @Configuration static class ExtendsConfig{ @Bean public DiscountPolicy rateDiscou..

22강. 빈 조회 시 동일한 타입이 둘 이상일 경우

이럴 땐 빈 이름을 정해주면 됨. 일단 테스트 public class ApplicationContextSameBeanFindTest { ApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회 시 같은 타입일 경우") public void findBeanByType(){ ac.getBean(MemberRepository.class); } @Configuration static class SameBeanConfig { @Bean public MemberRepository memberRepository1(){ return new MemoryMemberReposit..