μμ‘΄κ΄κ³ μλ μ£Όμ
1. λ€μν μμ‘΄κ΄κ³ μ£Όμ λ°©λ²
- μμ±μ μ£Όμ (constructor) β
- μμ μ μ£Όμ (setter)
- νλ μ£Όμ
- μΌλ° λ©μλ μ£Όμ
1. μμ±μ μ£Όμ
μμ±μ νΈμΆ μμ μ λ± 1λ²λ§ νΈμΆλλ κ² λ³΄μ₯
β λΆλ³, νμ μμ‘΄κ΄κ³μ μ¬μ©
// OrderServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService{
// final -> λ°λμ κ°μ ν λΉν΄μ€μΌνλ€.(νμ, λΆλ³)
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired // μμ±μκ° ν κ°λ§ μμ κ²½μ° μλ΅ν΄λ λλ€.
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
// System.out.println("memberRepository = " + memberRepository);
// System.out.println("discountPolicy = " + discountPolicy);
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
μμ±μκ° ν κ°λ§ μμ κ²½μ° `@Autowired μλ΅ κ°λ₯
2. μμ μ μ£Όμ (Setter μ£Όμ )
νλμ κ°μ λ³κ²½νλ μμ μ λ©μλμΈ setterλ₯Ό ν΅ν΄μ μμ‘΄ κ΄κ³ μ£Όμ
μ ν, λ³κ²½ κ°λ₯μ±μ΄ μλ μμ‘΄κ΄κ³μ μ¬μ©
μλ°λΉ νλ‘νΌν° κ·μ½μ μμ μ λ©μλ μ¬μ©
// OrderServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
...
}
β» μλ°λΉ νλ‘νΌν° κ·μ½: νλμ κ°μ μ§μ λ³κ²½νμ§ μκ³ setterλ getter λ©μλλ₯Ό νμ©ν΄ κ°μ μ½κ±°λ μμ νλ κ·μΉ
3. νλ μ£Όμ
μ½λκ° λ§€μ° κ°κ²°νλ μΈλΆμμ λ³κ²½μ΄ λΆκ°λ₯ν΄ ν μ€νΈνκΈ° νλ€λ€!
κ°κΈμ μ¬μ© μμ !!
ν
μ€νΈμ½λλ μ€νλ§ μ€μ λͺ©μ μΌλ‘ νλ @Configuration
κ°μ κ³³μμλ§ νΉλ³ν μ©λλ‘ μ¬μ©
// OrederServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
4.μΌλ° λ©μλ μ£Όμ
νλ²μ μ¬λ¬ νλλ₯Ό μ£Όμ λ°μ μ μμΌλ μ μ¬μ©νμ§λ μλλ€!
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
2. μ΅μ μ²λ¦¬
μ£Όμ ν μ€νλ§ λΉμ΄ μμ΄λ λ©μλλ₯Ό λμνκ² νκ³ μΆμ κ²½μ° μ΅μ μ²λ¦¬λ₯Ό ν΄μΌνλ€.
μ΅μ μ²λ¦¬ λ°©λ²
@Autowired(required=false)
: μλ μ£Όμ ν λμμ΄ μμΌλ©΄ μμ μ λ©μλ μμ²΄κ° νΈμΆ μλ¨org.springframework.lang.@Nullable
: μλ μ£Όμ ν λμμ΄ μμΌλ©΄ nullμ΄ μ λ ₯λλ€.Optional<>
: μλ μ£Όμ ν λμμ΄ μμΌλ©΄Optional.empty
κ° μ λ ₯λλ€
// AutowiredTest.java
public class AutowiredTest {
@Test
void AutowiredOption() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean {
// μ€νλ§ λΉμ λ±λ‘λμ§ μμ λμ μ£Όμ
ν΄λ³΄κΈ° (Member)
// 1. μμ‘΄ κ΄κ³κ° μμΌλ©΄ μμ νΈμΆμ΄ μλλ€
@Autowired(required = false)
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
// 2. nullλ‘ νΈμΆ
@Autowired
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2);
}
// 3. Optional.empty νΈμΆ
@Autowired
public void setNoBean3(Optional<Member> noBean3) {
System.out.println("noBean3 = " + noBean3);
}
}
}
// ν
μ€νΈ κ²°κ³Ό
// 1. μ νΈμΆμ΄ μλλ€
noBean2 = null
noBean3 = Optional.empty
3. μμ±μ μ£Όμ μ μ ννλΌ
μ΅κ·Όμλ μμ±μ μ£Όμ μ΄ κΆμ₯λλ€
λΆλ³
β λλΆλΆ μμ‘΄ κ΄κ³ μ£Όμ μ νλ² μΌμ΄λλ©΄ μ ν리μΌμ΄μ μ’ λ£μμ κΉμ§ λ³κ²½ν μΌμ΄ μμΌλ©° κΆμ₯λμ§ μλλ€
μμ μ μ£Όμ μ μ¬μ©νλ©΄ setter λ©μλλ₯Ό publicμΌλ‘ μ΄μ¬λμ΄μΌ νλ€
- λκ΅°κ° μ€μλ‘ λ³κ²½ κ°λ₯
- λ³κ²½ μλλ λ©μλλ₯Ό μ΄μ΄λλ κ²μ μ§μ
μμ±μ μ£Όμ μ κ°μ²΄ μμ± μμλ§ 1λ² νΈμΆλκ³ μ΄νμ νΈμΆλμ§ μλλ€ -> λΆλ³ μ€κ³
λλ½**
νλ μμν¬ μμ΄ μμν μλ° μ½λ λ¨μλ‘ μ€ν μ(@Autowired
λμ x)
- μμ μ μ£Όμ μμλ μ€νμ λλ NPEλ°μ
- μμ±μ λ©μλμμλ μ»΄νμΌ μ€λ₯ λ°μ -> λλ²κΉ μ©μ΄
final
μμ±μ μ£Όμ
μ¬μ© μ νλμ final
ν€μλλ₯Ό μ¬μ©ν μ μλ€ -> μμ±μμμ κ°μ΄ μ€μ λμ§ μλ μ€λ₯λ₯Ό μ»΄νμΌ μμ μ μ‘μμ€λ€
μμ μ½λ
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
// discountPolicy λλ½
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
}
//...
}
μ»΄νμΌ μ€λ₯: java: variable discountPolicy might not have been initialized
β» μ°Έκ³ : μμ μ μ£Όμ μ ν¬ν¨ν λλ¨Έμ§ μ£Όμ λ°©μμ λͺ¨λ μμ±μ μ΄νμ νΈμΆλλ―λ‘, νλμ final ν€μλλ₯Ό μ¬μ©ν μ μλ€. μ€μ§ μμ±μ μ£Όμ λ°©μλ§ final ν€μλλ₯Ό μ¬μ© κ°λ₯
4. 둬볡과 μ΅μ νΈλ λ
λ§€λ² μμ±μ μ£Όμ μ½λ μμ±νκΈ° λ²κ±°λ‘λ€! -> 둬볡 λΌμ΄λΈλ¬λ¦¬ νμ©
둬볡 λΌμ΄λΈλ¬λ¦¬ μ€μΉ λ°©λ²
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.7'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
//lombok μ€μ μΆκ° μμ
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
//lombok μ€μ μΆκ° λ
dependencies {
//lombok λΌμ΄λΈλ¬λ¦¬ μΆκ° μμ
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
//lombok λΌμ΄λΈλ¬λ¦¬ μΆκ° λ
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
- Preferences(μλμ° File Settings) plugin lombok κ²μ μ€μΉ μ€ν (μ¬μμ)
- Preferences Annotation Processors κ²μ Enable annotation processing μ²΄ν¬ (μ¬μμ)
- μμμ ν μ€νΈ ν΄λμ€λ₯Ό λ§λ€κ³ @Getter, @Setter νμΈ
둬볡μ νμ©ν μμ‘΄κ΄κ³ μ£Όμ
κΈ°λ³Έ μ½λ
// OrderServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
둬볡 μ μ©
// OrderServiceImpl.java
@Component
@RequiredArgsConstructor // finalμ΄ λΆμ μΈμ€ν΄μ€μ λν μμ±μλ₯Ό λ§λ€μ΄ μ€λ€
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
...
}
β @RequiredArgsConstructor
: finalμ΄ λΆμ νλλ₯Ό λͺ¨μμ μμ±μλ₯Ό μλμΌλ‘ λ§λ€μ΄μ€λ€
μ΅κ·Όμλ μμ±μλ₯Ό 1κ° λκ³ @Autowired
λ₯Ό μλ΅νλ λ°©λ²μ μ£Όλ‘ μ¬μ©νλ©΄μ, LombokλΌμ΄λΈλ¬λ¦¬μ @RequiredArgsConstructor
λ₯Ό ν¨κ» μ¬μ©νλ€
5. μ‘°ν λΉμ΄ 2κ° μ΄μμΌ λ
@Autowired
λ νμ
μΌλ‘ μ‘°ννλ€ (ac.getBean(DiscountPolicy.class)
μ μ μ¬) -> κ°μ νμ
μ λΉμ΄ 2κ° μ΄μμ΄λ©΄ λ¬Έμ λ°μ!
μμ
// FixDiscountPolicy.java
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
// RateDiscountPolicy.java
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
// μμ‘΄κ΄κ² μλ μ£Όμ
μ€ν
@Autowired
private DiscountPolicy discountPolicy
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available:
expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
NoUniqueBeanDefinitionException
μ€λ₯ λ°μ
κ·Έλ λ€κ³ νμ νμ μΌλ‘ μ§μ νλ©΄ DIP μλ°° λ° μ μ°μ± κ°μ! κ·Έλ¦¬κ³ νμ νμ λ κ°μΌλ©΄ λ¬Έμ λ°μ κ°λ₯
κ·Έλ λ€λ©΄...?
6. @Autowired νλ λͺ
, @Qualifier
, @Primary
μ‘°ν λμ λΉμ΄ 2κ° μ΄μμΌ λ ν΄κ²° λ°©λ²
@Autowired
νλ λͺ 맀μΉ@Qualifier
->@Qualifier
λΌλ¦¬ λ§€μΉ -> λΉ μ΄λ¦ 맀μΉ@Primary
μ¬μ©
1. @Autowired
νλ λͺ
맀μΉ
β @Autowired
λ νμ
맀μΉμ μλνκ³ , μ΄λ μ¬λ¬ λΉμ΄ μμΌλ©΄ νλ μ΄λ¦, νλΌλ―Έν° μ΄λ¦μΌλ‘ λΉ μ΄λ¦μ μΆκ° 맀μΉνλ€.
@Autowired
// κΈ°μ‘΄ μ½λ
// private DiscountPolicy discountPolicy
// νλ λͺ
μ λΉ μ΄λ¦μΌλ‘ λ³κ²½
private DiscountPolicy rateDiscountPolicy
2. @Qualifier
μ¬μ©
β @Qualifier
λ₯Ό ν΅ν΄ μΆκ°κ΅¬λΆμλ₯Ό λΆμ¬μ€λ€ (λΉ μ΄λ¦ λ³κ²½ x)
λΉ λ±λ‘μ @Qualifier
λΆμ¬μ£ΌκΈ°
// RateDiscountPolicy.java
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
// FixDiscountPolicy.java
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
μ£Όμ
μμ @Qualifier
λ₯Ό λΆμ¬μ£Όκ³ λ±λ‘ν μ΄λ¦μ μ μ΄μ£ΌκΈ°
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
ν΄λΉ qualifierλ₯Ό λͺ» μ°ΎμΌλ©΄ λ€μ λΉ μ΄λ¦μΌλ‘ 맀μΉμ νμ§λ§ qulifierλ κ°κΈμ qualifierλΌλ¦¬ 맀μΉνλ κ² κΆμ₯!
3. @Primary
μ¬μ©
β @Primary
: μ°μ μμ μ§μ
@Autowired
μμ μ¬λ¬ λΉμ΄ 맀μΉλλ©΄@Primary
κ° μ°μ κΆμ κ°μ§λ€
// rateDiscountPolicy κ° μ°μ κΆμ κ°μ§λ€
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
Primary vs Qualifier
@Qualifier
μ λ¨μ μ μ£Όμ
λ°μ λ λͺ¨λ μ½λμ @Qualifier
λ₯Ό λΆμ¬μ€μΌ νλ€λ κ²
λ©μΈ 컀λ₯μ
μ @Primary
λ₯Ό νμ©ν΄ @Qualifier
μ§μ μμ΄ νΈνκ² μ‘°ν
μλΈ μ»€λ₯μ
μ @Qualifier
λ₯Ό μ§μ ν΄ λͺ
μμ μΌλ‘ 컀λ₯μ
λΉ νλ
μ°μ μμ
μ’μ λ²μμ @Qualifier
κ° μ°μ κΆμ κ°μ§λ€
7. Annotation μ§μ λ§λ€κΈ°
@Qualifier("mainDiscountPolicy")
μ κ°μ΄ λ¬Έμλ₯Ό μ μΌλ©΄ μ»΄νμΌμ νμ
체ν¬κ° μλλ€
μ λ Έν μ΄μ μ λ§λ€μ΄μ λ¬Έμ ν΄κ²°
package hello.core.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
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
annotation μ μ©
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {}
// OrderServiceImpl.java
//μμ±μ μλ μ£Όμ
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
annotationμλ μμ κΈ°λ₯μ΄ μλ€
μμ κ°μ΄ μ¬λ¬ anntotationμ λͺ¨μμ μ¬μ©νλ κΈ°λ₯μ javaκ° μλλΌ μ€νλ§μμ μ§μν΄μ£Όλ κΈ°λ₯
λ€λ₯Έ annotationλ μ‘°ν© / μ¬μ μν μ μμΌλ κ°κΈμ μ§μ
8. List, Map : μ‘°νν λΉμ΄ λͺ¨λ νμν λ
β μλμ μΌλ‘ ν΄λΉ νμ μ μ€νλ§ λΉμ΄ λͺ¨λ νμν κ²½μ° -> List, Map νμ©ν΄ μ λ΅ν¨ν΄ ꡬν
ex) ν μΈ μλΉμ€λ₯Ό μ 곡νλλ° ν΄λΌμ΄μΈνΈκ° μ§μ ν μΈμ μ’ λ₯(rate, fix) μ ν κ°λ₯
μμ μ½λ
package hello.core.autowired;
import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.scan.AutoAppConfigTest;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
public class allBeanTest {
@Test
void findAllBean() {
AnnotationConfigApplicationContext 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");
Assertions.assertThat(discountService).isInstanceOf(DiscountService.class);
Assertions.assertThat(discountPrice).isEqualTo(1000);
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
Assertions.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);
}
}
}
λ‘μ§
DiscountServiceλ MapμΌλ‘ λͺ¨λ DiscoutPolicy
μ£Όμ
λ°λλ€ (fixDiscountPolicy
& rateDiscountPolicy
)
λ©μλ discount()
λ doscountCodeλ‘ λμ΄μ¨ discountPolicyμ λ§λ μ€νλ§ λΉμ μ°Ύμμ μ€ννλ€
μ£Όμ
Map<String, DiscountPolicy>
: ν€μ μ€νλ§ λΉμ μ΄λ¦μ, κ°μΌλ‘ DiscountPolicy νμ
μΌλ‘ μ‘°νν λͺ¨λ μ€νλ§ λΉμ λ΄μμ€λ€.
List<DiscountPolicy>
: DiscountPolicy νμ
μΌλ‘ μ‘°νν λͺ¨λ μ€νλ§ λΉμ λ΄μμ€λ€.
λ§μ½ ν΄λΉνλ νμ μ μ€νλ§ λΉμ΄ μμΌλ©΄, λΉ μ»¬λ μ μ΄λ Mapμ μ£Όμ
9. μλ, μλμ μ¬λ°λ₯Έ μ€λ¬΄ μ΄μ κΈ°μ€
κΈ°λ³ΈμΌλ‘λ νΈλ¦¬ν μλ κΈ°λ₯ μ¬μ©
μ€νλ§μ΄ λμ€κ³ μκ°μ΄ μ§λ μλ‘ μλ μ νΈ μΆμΈ
@Component
λΏλ§ μλλΌ @Controller
, @Service
, @Repository
μ²λΌ κ³μΈ΅μ λ§μΆμ΄ μΌλ°μ μΈ μ ν리μΌμ΄μ
λ‘μ§μ μλμΌλ‘ μ€μΊν μ μλλ‘ μ§μ
μ€νλ§λΆνΈλ μ»΄ν¬λνΈ μ€μΊμ κΈ°λ³ΈμΌλ‘ μ¬μ©νκ³ λ€λ₯Έ μ€νλ§ λΉλ€λ μ‘°κ±΄μ΄ λ§μΌλ©΄ μλμΌλ‘ λλ₯΅λλλ‘ μ€κ³
μλ λΉ λ±λ‘μ λ‘μ§μ λ°λΌ μ¬μ©
β μ 무 λ‘μ§ λΉ
- μΉμ μ§μνλ 컨νΈλ‘€λ¬, ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ΄ μλ μλΉμ€, λ°μ΄ν° κ³μΈ΅μ λ‘μ§μ μ²λ¦¬νλ 리ν¬μ§ν 리 λ±
- λ³΄ν΅ λΉμ¦λμ€ μꡬμ¬νμ κ°λ°ν λ μΆκ°λκ±°λ λ³κ²½
β κΈ°μ μ§μ λΉ
- κΈ°μ μ μΈ λ¬Έμ λ κ³΅ν΅ κ΄μ¬μ¬(AOP)λ₯Ό μ²λ¦¬ν λ μ£Όλ‘ μ¬μ©
- λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ΄λ,κ³΅ν΅ λ‘κ·Έ μ²λ¦¬μ²λΌ μ 무 λ‘μ§μ μ§μνκΈ° μν νλΆ κΈ°μ μ΄λ κ³΅ν΅ κΈ°μ λ±
μ
무 λ‘μ§μ μ«μλ λ§€μ° λ§κ³ νλ² κ°λ°νλ©΄ 컨νΈλ‘€λ¬, μλΉμ€, 리ν¬μ§ν 리 λ± μ μ¬ν ν¨ν΄ μ‘΄μ¬
-> μλ κΈ°λ₯ μ¬μ©
κΈ°μ μ§μ λ‘μ§μ μκ° μλμ μΌλ‘ μ κ³ , μ ν리μΌμ΄μ
μ λ°μ κ±Έμ³ κ΄λ²μνκ² μν₯μ λ―ΈμΉκ³ , λ¬Έμ λ°μ μ λλ²κΉ
μ΄λ €μ
-> μλ λΉ λ±λ‘ μ¬μ©
β μ ν리μΌμ΄μ μ κ΄λ²μνκ² μν₯μ λ―ΈμΉλ κΈ°μ μ§μ κ°μ²΄λ μλ λΉμΌλ‘ λ±λ‘ν΄μ μ€μ μ 보μ λ°λ‘ λνλκ² νλ κ²μ΄ μ μ§λ³΄μ νκΈ° μ’λ€
λΉμ¦λμ€ λ‘μ§ μ€μμ λ€νμ±μ μ κ·Ή νμ©ν λ
μμ List, Mapκ³Ό κ°μ΄ λ€νμ±μ μ κ·Ή νμ©νλ κ²½μ° νμ μμ λ€λ₯Έ κ°λ°μκ° μ½λλ₯Ό νμ νκΈ° μ΄λ ΅λ€
β μλ λΉμΌλ‘ λ±λ‘νκ±°λ μλμΌλ‘ νλ©΄ νΉμ ν¨ν€μ§μ κ°μ΄ λ¬Άμ΄λκΈ°
μμ μ½λ
@Configuration
public class DiscountPolicyConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
μ€μ μ 보μ μμ‘΄κ΄κ³ μ£Όμ μ λ³΄κ° ν λμ νμ λλ€
'β Personal_Study > Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Page κ°μ²΄μ Collections λ©μλλ₯Ό μ μ©νμ λ UnsupportedOperationException λ°μ μλ¬ (0) | 2023.03.30 |
---|---|
λΉ μλͺ μ£ΌκΈ° μ½λ°± (0) | 2023.01.10 |
ComponentScan (0) | 2023.01.07 |
Singleton Container (0) | 2023.01.06 |
μ€νλ§ μ»¨ν μ΄λ & Bean μ‘°ν (0) | 2023.01.05 |
λκΈ