์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์กฐํ
์คํ๋ง ์ปจํ ์ด๋์ ์ค์ ์คํ๋ง ๋น๋ค์ด ์ ๋ฑ๋ก ๋์๋์ง ํ์ธํด๋ณด์.
์ปจํ ์ด๋ ์์ฑ
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ ํ๋ค.
AppConfig.class ๋ฅผ ๊ตฌ์ฑ ์ ๋ณด๋ก ์ง์ ํ๋ค.
๋ชจ๋ ๋น ์ถ๋ ฅํ๊ธฐ
@Test
@DisplayName("๋ชจ๋ ๋น ์ถ๋ ฅํ๊ธฐ")
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
ac.getBeanDefinitionNames() : ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ด๋ฆ์ ์กฐํํ๋ค.
ac.getBean() : ๋น(bean) ์ด๋ฆ์ผ๋ก ๋น ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์กฐํํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๋น ์ถ๋ ฅํ๊ธฐ
์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น์ ์ ์ธํ๊ณ , ๋ด๊ฐ ๋ฑ๋กํ ๋น๋ง ์ถ๋ ฅํด๋ณด์.
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
getBeanDefinition : Bean์ ๋ํ ์ ๋ณด(BeanDefinition) ๊บผ๋ด๊ธฐ
//Role ROLE_APPLICATION: ์ง์ ๋ฑ๋กํ ์ ํ๋ฆฌ์ผ์ด์
๋น
//RolE ROLE_INFRASTRUCTURE: ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น์ getRole() ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
ROLE_APPLICATION : ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์ํ ๋น
ROLE_INFRASTRUCTURE : ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น
์ถ๋ ฅํ๊ธฐ
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " Object = " + bean);
์คํ๋ง ๋น ์กฐํ - ๊ธฐ๋ณธ
์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์กฐํ ๋ฐฉ๋ฒ
ac.getBean(๋น์ด๋ฆ, ํ์ )
ac.getBean(ํ์ )
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑ
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํ")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
InstanceOf : MemberServiceImpl.class ๊ฐ memberService ํ์ ์ผ๋ก ๋ฐ์ ์ ์๋์ง ๋ฅผ ๋ฌป๋ ๊ฒ
์กฐํ๊ฐ ์๋ ๋ (์คํจ ํ ์คํธ)
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํX")
void findBeanByNameX() {
MemberService xxxx = ac.getBean("xxxx", MemberService.class);
}
์ปจํ ์ด๋์๋ "xxxx" ์ด๋ฆ์ผ๋ก ๋ ๋น์ ์กด์ฌํ์ง ์์์ ์กฐํ๊ฐ ๋์ง ์๋๋ค
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx", MemberService.class);
assertThrows : ์ด ์์ธ๊ฐ ํฐ์ ธ์ผ ์ฑ๊ณต
() -> ์ด ๋ก์ง์ ์คํ ํ์ ๋
๋์ผํ ํ์ ์ด ๋ ์ด์ , ์ค๋ณต์ผ ๋ (์คํจ ํ ์คํธ)
์ปจํ ์ด๋์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ธ ๊ฒฝ์ฐ
@Configuration
public class AppConfig {
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy discountPolicy2() {
return new RateDiscountPolicy();
}
ํ์ ์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค")
void findBeanByTypeDuplicate() {
DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
}
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค")
void findBeanByTypeDuplicate() {
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(DiscountPolicy.class));
}
assertThrows : ์ด ์์ธ๊ฐ ํฐ์ ธ์ผ ์ฑ๊ณต
() -> ์ด ๋ก์ง์ ์คํ ํ์ ๋
ํ์ ์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
DiscountPolicy discountPlociy2 = ac.getBean("discountPlociy2", DiscountPolicy.class);
์ด๋๋ ๋น ์ด๋ฆ์ ์ง์ ํ์.
ac.getBeansOfType() ์ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๋น์ ์กฐํํ ์ ์๋ค.
Map<String, MemberService> beansOfType = ac.getBeansOfType(MemberService.class);
Map<key,value> ์ผ๋ก ๋ฐํํ๋ค
@Test
@DisplayName("ํน์ ํ์
์ ๋ชจ๋ ์กฐํํ๊ธฐ")
void findAllBeanByType() {
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.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);
}