spring core : Dependency Injection
This commit is contained in:
@@ -14,9 +14,19 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
implementation 'org.springframework.boot:spring-boot-starter'
|
||||
|
||||
compileOnly 'org.projectlombok:lombok'
|
||||
annotationProcessor 'org.projectlombok:lombok'
|
||||
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
configurations {
|
||||
compileOnly {
|
||||
extendsFrom annotationProcessor
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,10 @@ import org.springframework.context.annotation.FilterType;
|
||||
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
|
||||
)
|
||||
public class AutoAppConfig {
|
||||
|
||||
/*
|
||||
@Bean(name = "memoryMemberRepository") // 수동 빈, 자동 빈 이름 같을 경우 수동 빈이 우선순위를 가진다.( 최근 스프링 부트는 에러 )
|
||||
MemberRepository memberRepository() {
|
||||
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.Member;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Qualifier("fixDiscountPolicy")
|
||||
public class FixDiscountPolicy implements DiscountPolicy {
|
||||
|
||||
private final int discountFixAmount = 1000;
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
package com.example.basic.discount;
|
||||
|
||||
import com.example.basic.annotation.MainDiscountPolicy;
|
||||
import com.example.basic.member.Grade;
|
||||
import com.example.basic.member.Member;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@MainDiscountPolicy
|
||||
//@Qualifier("mainDiscountPolicy") // @Primary 보다 우선순위가 높다.
|
||||
//@Primary
|
||||
public class RateDiscountPolicy implements DiscountPolicy {
|
||||
|
||||
private final int discountPercent = 10;
|
||||
|
||||
@@ -1,19 +1,23 @@
|
||||
package com.example.basic.order;
|
||||
|
||||
import com.example.basic.annotation.MainDiscountPolicy;
|
||||
import com.example.basic.discount.DiscountPolicy;
|
||||
import com.example.basic.member.Member;
|
||||
import com.example.basic.member.MemberRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
//@RequiredArgsConstructor
|
||||
public class OrderServiceImpl implements OrderService {
|
||||
|
||||
private final MemberRepository memberRepository;
|
||||
private final DiscountPolicy discountPolicy;
|
||||
|
||||
@Autowired
|
||||
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
|
||||
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
|
||||
this.memberRepository = memberRepository;
|
||||
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;
|
||||
|
||||
import com.example.basic.AutoAppConfig;
|
||||
import com.example.basic.member.MemberRepository;
|
||||
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.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class AutoAppConfigTest {
|
||||
|
||||
@@ -16,5 +17,9 @@ class AutoAppConfigTest {
|
||||
|
||||
MemberService memberService = ac.getBean(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