spring core : Dependency Injection
This commit is contained in:
@@ -14,9 +14,19 @@ repositories {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'org.springframework.boot:spring-boot-starter'
|
implementation 'org.springframework.boot:spring-boot-starter'
|
||||||
|
|
||||||
|
compileOnly 'org.projectlombok:lombok'
|
||||||
|
annotationProcessor 'org.projectlombok:lombok'
|
||||||
|
|
||||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||||
}
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
compileOnly {
|
||||||
|
extendsFrom annotationProcessor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ import org.springframework.context.annotation.FilterType;
|
|||||||
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
|
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
|
||||||
)
|
)
|
||||||
public class AutoAppConfig {
|
public class AutoAppConfig {
|
||||||
|
/*
|
||||||
@Bean(name = "memoryMemberRepository") // 수동 빈, 자동 빈 이름 같을 경우 수동 빈이 우선순위를 가진다.( 최근 스프링 부트는 에러 )
|
@Bean(name = "memoryMemberRepository") // 수동 빈, 자동 빈 이름 같을 경우 수동 빈이 우선순위를 가진다.( 최근 스프링 부트는 에러 )
|
||||||
MemberRepository memberRepository() {
|
MemberRepository memberRepository() {
|
||||||
return new MemoryMemberRepository();
|
return new MemoryMemberRepository();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.example.basic.annotation;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Inherited
|
||||||
|
@Documented
|
||||||
|
@Qualifier("mainDiscountPolicy")
|
||||||
|
public @interface MainDiscountPolicy {
|
||||||
|
}
|
||||||
@@ -2,7 +2,11 @@ package com.example.basic.discount;
|
|||||||
|
|
||||||
import com.example.basic.member.Grade;
|
import com.example.basic.member.Grade;
|
||||||
import com.example.basic.member.Member;
|
import com.example.basic.member.Member;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Qualifier("fixDiscountPolicy")
|
||||||
public class FixDiscountPolicy implements DiscountPolicy {
|
public class FixDiscountPolicy implements DiscountPolicy {
|
||||||
|
|
||||||
private final int discountFixAmount = 1000;
|
private final int discountFixAmount = 1000;
|
||||||
|
|||||||
@@ -1,10 +1,16 @@
|
|||||||
package com.example.basic.discount;
|
package com.example.basic.discount;
|
||||||
|
|
||||||
|
import com.example.basic.annotation.MainDiscountPolicy;
|
||||||
import com.example.basic.member.Grade;
|
import com.example.basic.member.Grade;
|
||||||
import com.example.basic.member.Member;
|
import com.example.basic.member.Member;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.context.annotation.Primary;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
@MainDiscountPolicy
|
||||||
|
//@Qualifier("mainDiscountPolicy") // @Primary 보다 우선순위가 높다.
|
||||||
|
//@Primary
|
||||||
public class RateDiscountPolicy implements DiscountPolicy {
|
public class RateDiscountPolicy implements DiscountPolicy {
|
||||||
|
|
||||||
private final int discountPercent = 10;
|
private final int discountPercent = 10;
|
||||||
|
|||||||
@@ -1,19 +1,23 @@
|
|||||||
package com.example.basic.order;
|
package com.example.basic.order;
|
||||||
|
|
||||||
|
import com.example.basic.annotation.MainDiscountPolicy;
|
||||||
import com.example.basic.discount.DiscountPolicy;
|
import com.example.basic.discount.DiscountPolicy;
|
||||||
import com.example.basic.member.Member;
|
import com.example.basic.member.Member;
|
||||||
import com.example.basic.member.MemberRepository;
|
import com.example.basic.member.MemberRepository;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
//@RequiredArgsConstructor
|
||||||
public class OrderServiceImpl implements OrderService {
|
public class OrderServiceImpl implements OrderService {
|
||||||
|
|
||||||
private final MemberRepository memberRepository;
|
private final MemberRepository memberRepository;
|
||||||
private final DiscountPolicy discountPolicy;
|
private final DiscountPolicy discountPolicy;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
|
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
|
||||||
this.memberRepository = memberRepository;
|
this.memberRepository = memberRepository;
|
||||||
this.discountPolicy = discountPolicy;
|
this.discountPolicy = discountPolicy;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package com.example.basic.autowired;
|
||||||
|
|
||||||
|
import com.example.basic.AutoAppConfig;
|
||||||
|
import com.example.basic.discount.DiscountPolicy;
|
||||||
|
import com.example.basic.member.Grade;
|
||||||
|
import com.example.basic.member.Member;
|
||||||
|
import org.assertj.core.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.*;
|
||||||
|
|
||||||
|
class AllBeanTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void findAllBean() {
|
||||||
|
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
|
||||||
|
|
||||||
|
DiscountService discountService = ac.getBean(DiscountService.class);
|
||||||
|
Member member = new Member(1L, "userA", Grade.VIP);
|
||||||
|
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
|
||||||
|
|
||||||
|
assertThat(discountService).isInstanceOf(DiscountService.class);
|
||||||
|
assertThat(discountPrice).isEqualTo(1000);
|
||||||
|
|
||||||
|
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
|
||||||
|
assertThat(rateDiscountPrice).isEqualTo(2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class DiscountService {
|
||||||
|
private final Map<String, DiscountPolicy> policyMap;
|
||||||
|
private final List<DiscountPolicy> policies;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
|
||||||
|
this.policyMap = policyMap;
|
||||||
|
this.policies = policies;
|
||||||
|
System.out.println("policyMap = " + policyMap);
|
||||||
|
System.out.println("policies = " + policies);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int discount(Member member, int price, String discountCode) {
|
||||||
|
DiscountPolicy discountPolicy = policyMap.get(discountCode);
|
||||||
|
return discountPolicy.discount(member, price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.example.basic.autowired;
|
||||||
|
|
||||||
|
import com.example.basic.member.Member;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class AutowiredTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void autowiredOption() {
|
||||||
|
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class TestBean {
|
||||||
|
|
||||||
|
@Autowired(required = false)
|
||||||
|
public void setNoBean1(Member noBean1) {
|
||||||
|
System.out.println("noBean1 = " + noBean1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setNoBean2(@Nullable Member noBean2) {
|
||||||
|
System.out.println("noBean2 = " + noBean2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setNoBean3(Optional<Member> noBean3) {
|
||||||
|
System.out.println("noBean3 = " + noBean3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.example.basic.order;
|
||||||
|
|
||||||
|
import com.example.basic.discount.FixDiscountPolicy;
|
||||||
|
import com.example.basic.member.Grade;
|
||||||
|
import com.example.basic.member.Member;
|
||||||
|
import com.example.basic.member.MemoryMemberRepository;
|
||||||
|
import org.assertj.core.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.*;
|
||||||
|
|
||||||
|
class OrderServiceImplTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void createOrder() {
|
||||||
|
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
|
||||||
|
memberRepository.save(new Member(1L, "name", Grade.VIP));
|
||||||
|
|
||||||
|
OrderServiceImpl orderService = new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
|
||||||
|
Order order = orderService.createOrder(1L, "itemA", 10000);
|
||||||
|
|
||||||
|
assertThat(order.getDiscountPrice()).isEqualTo(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
package com.example.basic.scan;
|
package com.example.basic.scan;
|
||||||
|
|
||||||
import com.example.basic.AutoAppConfig;
|
import com.example.basic.AutoAppConfig;
|
||||||
|
import com.example.basic.member.MemberRepository;
|
||||||
import com.example.basic.member.MemberService;
|
import com.example.basic.member.MemberService;
|
||||||
import org.assertj.core.api.Assertions;
|
import com.example.basic.order.OrderServiceImpl;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.*;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
class AutoAppConfigTest {
|
class AutoAppConfigTest {
|
||||||
|
|
||||||
@@ -16,5 +17,9 @@ class AutoAppConfigTest {
|
|||||||
|
|
||||||
MemberService memberService = ac.getBean(MemberService.class);
|
MemberService memberService = ac.getBean(MemberService.class);
|
||||||
assertThat(memberService).isInstanceOf(MemberService.class);
|
assertThat(memberService).isInstanceOf(MemberService.class);
|
||||||
|
|
||||||
|
OrderServiceImpl bean = ac.getBean(OrderServiceImpl.class);
|
||||||
|
MemberRepository memberRepository = bean.getMemberRepository();
|
||||||
|
System.out.println("memberRepository = " + memberRepository);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user