spring core : find spring bean
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package com.example.basic.bean;
|
||||
|
||||
import com.example.basic.AppConfig;
|
||||
import com.example.basic.member.MemberService;
|
||||
import com.example.basic.member.MemberServiceImpl;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class ApplicationContextBasicFindTest {
|
||||
|
||||
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
|
||||
|
||||
@Test
|
||||
@DisplayName("빈 이름으로 조회")
|
||||
void findBeanByName() {
|
||||
MemberService memberService = ac.getBean("memberService", MemberService.class);
|
||||
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("이름 없이 타입으로만 조회")
|
||||
void findBeanByType() {
|
||||
MemberService memberService = ac.getBean(MemberService.class);
|
||||
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("구체 타입으로 조회")
|
||||
void findBeanByName2() {
|
||||
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
|
||||
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("빈 이름으로 조회 실패")
|
||||
void findBeanByNameFail() {
|
||||
// ac.getBean("test", MemberService.class);
|
||||
assertThrows(NoSuchBeanDefinitionException.class,
|
||||
() -> ac.getBean("test", MemberService.class));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package com.example.basic.bean;
|
||||
|
||||
import com.example.basic.AppConfig;
|
||||
import com.example.basic.discount.DiscountPolicy;
|
||||
import com.example.basic.discount.FixDiscountPolicy;
|
||||
import com.example.basic.discount.RateDiscountPolicy;
|
||||
import com.example.basic.member.MemberService;
|
||||
import com.example.basic.member.MemberServiceImpl;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
class ApplicationContextExtendsFindTest {
|
||||
|
||||
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
|
||||
|
||||
@Test
|
||||
@DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.")
|
||||
void findBeanByParentTypeDuplicateFail() {
|
||||
assertThrows(NoUniqueBeanDefinitionException.class,
|
||||
() -> ac.getBean(DiscountPolicy.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 빈 이름을 지정한다.")
|
||||
void findBeanByParentTypeDuplicateSuccess() {
|
||||
DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
|
||||
assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 특정 하위 타입으로 조회")
|
||||
void findBeanBySubType() {
|
||||
RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
|
||||
assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("부모 타입으로 모두 조회하기")
|
||||
void findAllBeansByParentType() {
|
||||
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
|
||||
assertThat(beansOfType.size()).isEqualTo(2);
|
||||
for (String key : beansOfType.keySet()) {
|
||||
System.out.println("key = " + key + " value = " + beansOfType.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("부모 타입으로 모두 조회하기 - Object")
|
||||
void findAllBeansByObjectType() {
|
||||
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
|
||||
for (String key : beansOfType.keySet()) {
|
||||
System.out.println("key = " + key + " value = " + beansOfType.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class TestConfig {
|
||||
@Bean
|
||||
public DiscountPolicy rateDiscountPolicy() {
|
||||
return new RateDiscountPolicy();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DiscountPolicy fixDiscountPolicy() {
|
||||
return new FixDiscountPolicy();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.example.basic.bean;
|
||||
|
||||
import com.example.basic.AppConfig;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
|
||||
class ApplicationContextInfoTest {
|
||||
|
||||
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
|
||||
|
||||
@Test
|
||||
@DisplayName("모든 빈 출력하기")
|
||||
void findAllBeans() {
|
||||
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
|
||||
for (String beanDefinitionName : beanDefinitionNames) {
|
||||
Object bean = ac.getBean(beanDefinitionName);
|
||||
System.out.println("name = " + beanDefinitionName + " object = " + bean);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("애플리케이션 빈 출력하기")
|
||||
void findApplicationBeans() {
|
||||
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
|
||||
for (String beanDefinitionName : beanDefinitionNames) {
|
||||
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
|
||||
|
||||
// Role ROLE_APPLICATION : 직접 등록한 애플리케이션 빈
|
||||
// Role ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
|
||||
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
|
||||
Object bean = ac.getBean(beanDefinitionName);
|
||||
System.out.println("name = " + beanDefinitionName + " object = " + bean);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.example.basic.bean;
|
||||
|
||||
import com.example.basic.member.MemberRepository;
|
||||
import com.example.basic.member.MemoryMemberRepository;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.DisplayName;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class ApplicationContextSameBeanFindTest {
|
||||
|
||||
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
|
||||
|
||||
@Test
|
||||
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
|
||||
void findBeanByTypeDuplicateFail() {
|
||||
assertThrows(NoUniqueBeanDefinitionException.class,
|
||||
() -> ac.getBean(MemberRepository.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 빈 이름을 지정한다.")
|
||||
void findBeanByTypeDuplicateSuccess() {
|
||||
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
|
||||
|
||||
assertThat(memberRepository).isInstanceOf(MemberRepository.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("특정 타입을 모두 조회하기")
|
||||
void findAllBeanByType() {
|
||||
|
||||
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
|
||||
for (String key : beansOfType.keySet()) {
|
||||
System.out.println("key = " + key + " value = " + beansOfType.get(key));
|
||||
}
|
||||
System.out.println("beansOfType = " + beansOfType);
|
||||
|
||||
assertThat(beansOfType.size()).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class SameBeanConfig {
|
||||
@Bean
|
||||
public MemberRepository memberRepository1() {
|
||||
return new MemoryMemberRepository();
|
||||
}
|
||||
@Bean
|
||||
public MemberRepository memberRepository2() {
|
||||
return new MemoryMemberRepository();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user