κΈ°μ‘΄μ μ½λλ₯Ό μ€νλ§μΌλ‘ μ ννλ€.
@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 FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = new MemberServiceImpl();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
.
.
.
κΈ°μ‘΄μ μ¬μ©νλ `AppConfig`μ μ λν μ΄μ μ μΆκ°ν΄μ μ€νλ§μΌλ‘ μ¬μ©ν μ μλλ‘ λ³κ²½νλ€.
`ApplicationContext`λ μ€νλ§ μ»¨ν μ΄λλΌκ³ νλ€. `@Bean`μ λͺ¨λ κ΄λ¦¬ν΄μ€λ€.
κΈ°μ‘΄μλ κ°λ°μκ° `AppConfig`λ‘ μ§μ κ΄λ¦¬νμ§λ§ μ΄μ μ λν μ΄μ μ μμ±νμ¬ μ€νλ§ μ»¨ν μ΄λλ₯Ό ν΅ν΄ μ¬μ©ν μ μλλ‘ νλ€.
μ€νλ§ λΉ(`@Bean` μ λν μ΄μ μ΄ λΆμ λ©μλλ₯Ό νΈμΆν΄μ λ°νλ κ°μ²΄)μ `applicationContext.getBean("λ©μλμ΄λ¦", ν΄λμ€μ΄λ¦.class)` λ©μλ ν΅ν΄ μ°Ύμ μ μλ€.
`AppConfig`λ `@Configuration` μ λν μ΄μ μ΄ λΆμ ν΄λμ€. μ€νλ§ μ»¨ν μ΄λκ° DIλ₯Ό ν μ μλλ‘ ν΄μ€λ€.
μ€νλ§ μ»¨ν μ΄λκ° μμ±λλ κ³Όμ
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
`ApplicationContext`λ μΈν°νμ΄μ€. `AnnotationConfigApplicationContext`λ `ApplicationContext`μ ꡬν체μ΄λ€.
μ€νλ§ μ»¨ν μ΄λλ xmlλ‘ λ§λ€ μλ μκ³ , μ λν μ΄μ κΈ°λ°μ μλ° ν΄λμ€ μ€μ μΌλ‘ λ§λ€ μ μλ€.(νμκ° νΈλ¦¬ν΄μ λ λ§μ΄ μ¬μ©νλ€.)
μ€νλ§ μ»¨ν μ΄λλ₯Ό μμ±ν λλ κ΅¬μ± μ 보λ₯Ό μ§μ ν΄μ£Όμ΄μΌ νλ€. μ¬κΈ°μλ `AppConfig`λ₯Ό μ¬μ©νλ€.
μ€νλ§ λΉ λ±λ‘
`@Bean` μ λν μ΄μ μ΄ λΆμ λ©μλλ₯Ό νΈμΆνμ¬ λ°νλ°μ κ°μ²΄λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νλ€. μ΄λ¦μ `getBean()`μμ μΈμλ‘ μ λ¬ λ°μ StringμΌλ‘, κ°μΌλ‘λ ν΄λΉ κ°μ²΄λ₯Ό κ°μ§λ€.
μ€νλ§ μ»¨ν μ΄λλ μ€μ μ 보λ₯Ό μ°Έκ³ ν΄μ μμ‘΄ κ΄κ³λ₯Ό μ£Όμ (DI)νλ€. `@Configuration` μ λν μ΄μ μ λ¬κ³ μλ `AppConfig`μμ `memberService`κ° `memberRepository`λ₯Ό μμ‘΄νκ³ , `orderService`κ° `memberRepository`μ `discountPolicy`λ₯Ό μμ‘΄νκ³ μκΈ° λλ¬Έμ μ΄λ₯Ό μ°Έκ³ νμ¬ μμ‘΄ κ΄κ³λ₯Ό μ£Όμ ν΄μ€λ€.
μ€νλ§ μ»¨ν μ΄λμ λ±λ‘λ λͺ¨λ λΉ μ‘°ν
String[] beanNames = getBeanDefinitionNames();
iter + tab (ν₯μλ forλ¬Έ μλ μμ±)
soutv System.out.println("name" + name); μλ μμ±
@Test
@DisplayName("λͺ¨λ λΉ μΆλ ₯νκΈ°")
void findApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
// μ€νλ§μ΄ μ¬μ©νλ λ΄λΆ λΉ λ§κ³ λ΄κ° λ±λ‘ν μ€νλ§ λΉ
// BeanDefinition.ROLE_APPLICATION
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name " + beanDefinitionName + " bean = " + bean);
}
}
}
// name = appConfig object = hello.core.order.AppConfig$$SpringCGLIB$$0@46b61c56
// name = memberService object = hello.core.member.MemberServiceImpl@2e48362c
// name = memberRepository object = hello.core.member.MemoryMemberRepository@1efe439d
// name = orderService object = hello.core.order.OrderServiceImpl@be68757
// name = discountPolicy object = hello.core.discount.RateDiscountPolicy@7d446ed1
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.getClass() = " + 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.getClass() = " + memberService.getClass());
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("ꡬ체 νμ
μΌλ‘ μ‘°ν")
void findBeanByType2() {
// μ’μ μ½λλ μλλ€.
// μν (μΆμν)μ μμ‘΄ν΄μΌμ§ ꡬ체 ν΄λμ€μ μμ‘΄ν΄μλ μ λλ€.
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
// System.out.println("memberService = " + memberService);
// System.out.println("memberService.getClass() = " + memberService.getClass());
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("λΉ μ΄λ¦μΌλ‘ μ‘°ν X")
void findBeanByNameX(){
MemberService X = ac.getBean("X", MemberService.class);
// μ€λ₯Έμͺ½μ μλ λλ€μμ μ€ννλ©΄ μΌμͺ½μ μλ μμΈκ° ν°μ ΈμΌν¨
org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("X", MemberService.class));
}
}
Testμμ κ²μ¦μ νμ assertThatμΌλ‘ νλ€!
public class ApplicationContextSameBeanFindTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("νμ
μΌλ‘ μ‘°ν μ κ°μ νμ
μ΄ λ μ΄μ μμΌλ©΄ μ€λ³΅ μ€λ₯κ° λ°μνλ€.")
void findBeanByTypeDuplicate() {
// NoUniqueBeanDefinitionException
// available: expected single matching bean but found 2: memberRepository,memberRepository2
// λΉμ΄ λ κ°μ
Assertions.assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));
}
@Test
@DisplayName("νμ
μΌλ‘ μ‘°ν μ κ°μ νμ
μ΄ λ μ΄μ μμΌλ©΄ λΉ μ΄λ¦μ μ§μ νλ©΄ λλ€")
void findBeanByName() {
MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
org.assertj.core.api.Assertions.assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}
@Test
@DisplayName("νΉμ νμ
μ λͺ¨λ μ‘°ννκΈ°")
void findAllBeanByName() {
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);
org.assertj.core.api.Assertions.assertThat(beansOfType.size()).isEqualTo(2);
}
@Configuration
static class SameBeanConfig {
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
}
μ€νλ§ λΉ μ‘°ν- μμ κ΄κ³
λΉμ λΆλͺ¨ νμ μΌλ‘ μ‘°ννλ©΄ μμ νμ λ ν¨κ» μ‘°ννλ€. μ΅κ³ μ‘°μμΈ `Object`λ‘ μ‘°νν κ²½μ° λͺ¨λ μ€νλ§ λΉμ μ‘°ννλ€.
@Test
@DisplayName("λΆλͺ¨ νμ
μΌλ‘ λͺ¨λ μ‘°ννκΈ°")
void findAllBeanByParentType() {
Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
for (String key : beansOfType.keySet()) {
System.out.println("key= " + key + " bean = " + beansOfType.get(key));
}
}
@Test
@DisplayName("λΆλͺ¨ νμ
μΌλ‘ λͺ¨λ μ‘°ννκΈ° - μ΅κ³ μ‘°μ Object")
void findAllBeanByObjectType() {
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " bean = " + beansOfType.get(key));
}
}
iter (ν₯μλ forλ¬Έ)
soutv (forλ¬Έμ μμ String + μμ)λ‘ μΆλ ₯λ¬Έ λ§λ€μ΄μ€
`BeanFactory`
μ€νλ§ μ»¨ν μ΄λμ μ΅κ³ μ‘°μ μΈν°νμ΄μ€
μ€νλ§ λΉμ κ΄λ¦¬νκ³ μ‘°ννλ μν . `getBean()`μ μ 곡νλ€. (μ‘°ν, κ΄λ¦¬. μ°λ¦¬κ° μ¬μ©νλ λλΆλΆμ κΈ°λ₯μ `BeanFactory`κ° μ 곡νλ κΈ°λ₯μ΄λ€. μ§μ μ¬μ©ν μΌμ κ±°μ μλ€. λΆκ° κΈ°λ₯μ΄ ν¬ν¨λ `ApplicationContext`λ₯Ό μ¬μ©νλ€.
`ApplicationContext`
`BeanFactory`λ₯Ό μμ λ°λλ€. μ‘°ννκ³ κ΄λ¦¬νλ κΈ°λ₯ μΈμ λ§μ λΆκ° κΈ°λ₯μ μ 곡νλ€.
1. λ©μμ§ μμ€λ₯Ό νμ©ν κ΅μ ν κΈ°λ₯. ex) νκ΅μμ λ€μ΄μ€λ©΄ νκ΅μ΄λ‘, μμ΄κΆμμ λ€μ΄μ€λ©΄ μμ΄λ‘ μΆλ ₯
2. νκ²½ λ³μ. λ‘컬 κ°λ°(λ΄ pcμμ κ°λ°) ν μ€νΈ μλ²μμ κ°λ°, μ€μ ꡬλλλ μ΄μ νκ²½μ ꡬλΆν΄μ μ²λ¦¬ν΄μ€λ€.
3. μ ν리μΌμ΄μ μ΄λ²€νΈ μ²λ¦¬
4. 리μμ€ μ‘°ν. νμΌ, ν΄λμ€ν¨μ€, μΈλΆ λ±μμ 리μμ€λ₯Ό μΆμνν΄μ νΈλ¦¬νκ² μ‘°νν μ μλ κΈ°λ₯μ μ 곡νλ€.
μ€νλ§ μ»¨ν μ΄λλ λ€μν νμμ μ€μ μ 보λ₯Ό λ°μλ€μΌ μ μλλ‘ μ€κ³λμ΄ μλ€.
μλ° μ½λ, XML, Groovy λ±
1. μ λν μ΄μ κΈ°λ° μλ° μ½λ μ€μ μ¬μ©
`AnnotationConfigApplicationContext(AppConfig.class)` λ₯Ό μ¬μ©νλ©΄μ μλ° μ½λλ‘ λ μ€μ μ 보λ₯Ό λκΈ°λ©΄ λλ€.
2. XML μ€μ μ¬μ©
μ€νλ§λΆνΈμμλ XMLμ μ°μ§ μμΌλ λ κ±°μ νλ‘μ νΈμμλ μμ§ XMLμ λ§μ΄ μ¬μ©νλ€. μ»΄νμΌ μμ΄ λΉ μ€μ μ 보λ₯Ό λκΈΈ μ μλ€.
μλ° μ½λκ° μλ κ²μ μ λΆ resources
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="memberService" class="hello.core.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository"/>
</bean>
<bean id="memberRepository" class="hello.core.member.MemoryMemberRepository"/>
<bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository"/>
<constructor-arg name="discountPolicy" ref="discountPolicy"/>
</bean>
<bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy"/>
</beans>
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);
}
}
@Configuration
public class AppConfig {
/* <bean id="memberService" class="hello.core.member.MemberServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository"/>
</bean>
*/
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
// <bean id="memberRepository" class="hello.core.member.MemoryMemberRepository"/>
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
/* <bean id="orderService" class="hello.core.order.OrderServiceImpl">
<constructor-arg name="memberRepository" ref="memberRepository"/>
<constructor-arg name="discountPolicy" ref="discountPolicy"/>
</bean>
*/
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
// <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy"/>
@Bean
public DiscountPolicy discountPolicy(){
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
μ λν μ΄μ μΌλ‘ λΉμ λ±λ‘νλ κ²κ³Ό μ€μ μ λ³΄κ° μΌμΉνλ€.
μ€νλ§ λΉ μ€μ λ©ν μ 보 `BeanDefinition` μΈν°νμ΄μ€
μν κ³Ό ꡬνμ κ°λ μ μΌλ‘ λλ κ².
μ€νλ§ μ»¨ν μ΄λλ μλ° μ½λ `AppConfig.class` μΈμ§ xml `appConfig.xml`μΈμ§ λͺ°λΌλ λλ€. `BeanDefinition`λ§ μλ©΄ λλ€! (μΆμνμ μμ‘΄)
'Java > Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] μ€νλ§μ μ μ (3) - Spring MVC (0) | 2024.01.01 |
---|---|
[Spring] μ€νλ§μ μ μ (2) - μμ²κ³Ό μλ΅ (0) | 2023.12.31 |
[Spring] μ€νλ§μ μ μ (1) μ΄κΈ° μ€μ (0) | 2023.12.30 |
[Spring] μ€νλ§ ν΅μ¬ μ리 κΈ°λ³ΈνΈ (3) (0) | 2023.12.28 |
[Spring] μ€νλ§ ν΅μ¬ μ리 κΈ°λ³ΈνΈ (1) (0) | 2023.12.27 |