์คํ๋ง ์ปจํ ์ด๋ & ๋น ์กฐํํ๊ธฐ
์คํ๋ง ์ปจํ ์ด๋
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
๋ฅผ ์คํ๋ง ์ปจํ
์ด๋๋ผ ํ๋ค.
ApplicationContext
๋ ์ธํฐํ์ด์ค์ด๋ค.
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ ๊ณผ์
1. ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
![](https://blog.kakaocdn.net/dn/eysp3u/btrU1OwVjB7/CFm4g5Yc6gM53a9J0qXX70/img.png)
์คํ๋ง ์ปจํ
์ด๋๋ฅผ ์์ฑํ ๋๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.(AppConfig)
2. ์คํ๋ง ๋น ๋ฑ๋ก
![](https://blog.kakaocdn.net/dn/b1x6S4/btrU131NQQS/ryOHM4GZC6XFGqbnhIZfw1/img.png)
๋น ์ด๋ฆ์ ๋ฉ์๋ ์ด๋ฆ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฑฐ๋ ์ง์ ๋ถ์ฌํ ์ ์๋ค.
์ฃผ์: ๋น ์ด๋ฆ์ ํญ์ ๋ค๋ฅธ ์ด๋ฆ์ ๋ถ์ฌ ํด์ผ ํ๋ค.
3. ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์ - ์ค๋น
![](https://blog.kakaocdn.net/dn/qXtBs/btrU2LzXiZH/Le5ZR1JOA7rCufLeQP2FD0/img.png)
4. ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์ - ์๋ฃ
![](https://blog.kakaocdn.net/dn/OXuKB/btrUWa2br7d/gYR3noxV5oorYkwCYuI9y1/img.png)
์คํ๋ง ์ปจํ ์ด๋๋ ์ค์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ค.
๋น ์กฐํํ๊ธฐ
AppConfig.java
// Appconfig.java
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import 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(), new FixDiscountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
๋ชจ๋ ๋น ์กฐํ
// ApplicationContextInfoTest.java
package hello.core.beanfind;
import hello.core.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;
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(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);
}
}
@Test
@DisplayName("์ ํ๋ฆฌ์ผ์ด์
๋น ์ถ๋ ฅ")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + "object = " + bean);
}
}
}
}
ac.getBeanDefinitionNames()
: ์คํ๋ง์ ๋ฑ๋ก๋ ๋ชจ๋ ๋น ์ด๋ฆ์ ์กฐํํ๋ค.
ac.getBean()
: ๋น ์ด๋ฆ์ผ๋ก ๋น ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์กฐํํ๋ค.
์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น์ getRole() ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
ROLE_APPLICATION
: ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ์ํ ๋นROLE_INFRASTRUCTURE
: ์คํ๋ง์ด ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋น
์คํ๋ง ๋น ์กฐํ - ๊ธฐ๋ณธ
// ApplicationContextBasicFindTest.java
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.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.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
public class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("๋น ์ด๋ฆ์ผ๋ก ์กฐํ")
void findBeanByName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
// System.out.println("memberService = " + memberService);
// System.out.println("memberService = " + memberService.getClass());
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("์ด๋ฆ ์์ด ํ์
์ผ๋ก๋ง ์กฐํ")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
// System.out.println("memberService = " + memberService);
// System.out.println("memberService = " + memberService.getClass());
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("๊ตฌ์ฒด ํ์
์ผ๋ก ์กฐํ")
void findBeanByName2() {
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
// System.out.println("memberService = " + memberService);
// System.out.println("memberService = " + memberService.getClass());
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("๋น ์ด๋ฆ ์กฐํ ์คํจ")
void findBeanByNameX(){
// MemberService xxxx = ac.getBean("xxxx", MemberService.class);
assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx", MemberService.class));
}
}
๊ตฌ์ฒด ํ์ ์ผ๋ก ์กฐํํ๋ ๊ฒ์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ฏ๋ก ๊ฐ๊ธ์ ์ง์ํ๋ค
์คํ๋ง ๋น ์กฐํ - ๋์ผํ ํ์ ์ด ๋ ์ด์
// ApplicationContextSameBeanFindTest.java
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemoryMemberRepository;
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.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class ApplicationContextSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.")
void findBeanByTypeDuplicate() {
// MemberRepository bean = ac.getBean(MemberRepository.class);
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(MemberRepository.class));
}
@Test
@DisplayName("ํ์
์ผ๋ก ์กฐํ ์ ๊ฐ์ ํ์
์ด ๋ ์ด์ ์์ผ๋ฉด, ๋น ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค.")
void findBeanByName() {
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();
}
}
}
ํ์ ์ผ๋ก ์กฐํ์ ๊ฐ์ ํ์ ์ ์คํ๋ง ๋น์ด ๋ ์ด์์ด๋ฉด ์ค๋ฅ ๋ฐ์ -> ๋น ์ด๋ฆ์ ์ง์ !
ac.getBeansOfType()
:ํด๋น ํ์
์ ๋ชจ๋ ๋น์ ์กฐํํ ์ ์๋ค.
์คํ๋ง ๋น ์กฐํ - ์์ ๊ด๊ณ
// ApplicationContextExtendsFindTest.java
package hello.core.beanfind;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
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.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด ์ค๋ณต ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค")
void findBeanByParentTypeDuplicate() {
// DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
assertThrows(NoUniqueBeanDefinitionException.class,
() -> ac.getBean(DiscountPolicy.class));
}
@Test
@DisplayName("๋ถ๋ชจ ํ์
์ผ๋ก ์กฐํ ์, ์์์ด ๋ ์ด์ ์์ผ๋ฉด ๋น ์ด๋ฆ์ ์ง์ ํ๋ฉด ๋๋ค.")
void findBeanByParentTypeBeanName() {
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 findAllBeanByParentType() {
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 findAllBeanByObjectType() {
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
// assertThat(beansOfType.size()).isEqualTo(2);
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();
}
}
}
Object ํ์ ์ผ๋ก ์กฐํํ๋ฉด ๋ชจ๋ ์คํ๋ง ๋น์ ์กฐํํ๋ค
'โญ Personal_Study > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์กด๊ด๊ณ ์๋ ์ฃผ์ (1) | 2023.01.09 |
---|---|
ComponentScan (0) | 2023.01.07 |
Singleton Container (0) | 2023.01.06 |
์ ์ด์ ์ญ์ (IoC) & ์์กด์ฑ ์ฃผ์ (DI) (1) | 2023.01.01 |
SOLID (์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น) (1) | 2022.12.31 |
๋๊ธ