μμ‘΄κ΄κ³ μλ μ£Όμ
- μμ±μ μ£Όμ
- μμ±μλ₯Ό ν΅ν΄μ μμ‘΄κ΄κ³λ₯Ό μ£Όμ λ°λ λ°©μ
- λΆλ³, νμ μμ‘΄κ΄κ³μ μ¬μ©
- μμ±μκ° λ± 1κ°λ§ μμΌλ©΄
@Autowired
λ₯Ό μλ΅ν΄λ μλ μ£Όμ λλ€.
- μμ μ μ£Όμ
- μ ν, λ³κ²½ κ°λ₯μ±μ΄ μλ μμ‘΄κ΄κ³μ μ¬μ©
- νλ μ£Όμ
- νλμ λ°λ‘ μ£Όμ νλ λ°©λ²
- μ½λκ° κ°κ²°νμ§λ§ μΆν λ³κ²½μ΄ λΆκ°λ₯ν΄ ν μ€νΈ νκΈ° μ΄λ ΅λ€λ λ¨μ μ΄ μλ€. λλλ‘μ΄λ©΄ μ¬μ©νμ§ λ§κ³ ν μ€νΈ μ½λμμλ§ μ¬μ©νλλ‘ νμ
- μΌλ° λ©μλ μ£Όμ
- μΌλ° λ©μλλ₯Ό ν΅ν΄ μ£Όμ λ°μ μ μμ§λ§ μΌλ°μ μΌλ‘ μ μ¬μ©νμ§ μλλ€
μ΅μ μ²λ¦¬
μ£Όμ ν μ€νλ§ λΉμ΄ μμ΄λ λμν΄μΌ ν λκ° μλ€. μ΄λ΄λ μ΅μ κ°μ μ΄μ©ν΄ μ²λ¦¬νλ©΄ λλ€.
@Autowired(required=false)
: μλ μ£Όμ ν λμμ΄ μμΌλ©΄ μμ μ λ©μλ μμ²΄κ° νΈμΆ μλ¨org.springframework.lang.@Nullable
: μλ μ£Όμ ν λμμ΄ μμΌλ©΄ nullμ΄ μ λ ₯λλ€.Optional<>
: μλ μ£Όμ ν λμμ΄ μμΌλ©΄ Optional.empty κ° μ λ ₯λλ€.
μμ‘΄κ΄κ³ μλ μ£Όμ - μμ±μ μ£Όμ μ μ νν΄λΌ!
1. λΆλ³
λλΆλΆμ μμ‘΄κ΄κ³ μ£Όμ μ νλ² μΌμ΄λλ©΄ μ ν리μΌμ΄μ μ’ λ£μμ κΉμ§ μμ‘΄κ΄κ³λ₯Ό λ³κ²½ν μΌμ΄ μλ€. μ€νλ € λλΆλΆμ μμ‘΄κ΄κ³λ μ ν리μΌμ΄μ μ’ λ£ μ κΉμ§ λ³νλ©΄ μλλ€.(λΆλ³ν΄μΌ νλ€.)
μμ μ μ£Όμ μ μ¬μ©νλ©΄, setXxx λ©μλλ₯Ό publicμΌλ‘ μ΄μ΄λμ΄μΌ νλ€. λκ΅°κ° μ€μλ‘ λ³κ²½ν μ λ μκ³ , λ³κ²½νλ©΄ μλλ λ©μλλ₯Ό μ΄μ΄λλ κ²μ μ’μ μ€κ³ λ°©λ²μ΄ μλλ€.
2. λλ½
μμ±μ μ£Όμ μ μ¬μ©νλ©΄ μ£Όμ λ°μ΄ν°λ₯Ό λλ½ νμ λ μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
3. final
μμ±μ μ£Όμ μ μ¬μ©νλ©΄ νλμ final ν€μλλ₯Ό μ¬μ©ν μ μλ€. κ·Έλμ μμ±μμμ νΉμλΌλ κ°μ΄ μ€μ λμ§ μλ μ€λ₯λ₯Ό μ»΄νμΌ μμ μ λ§μμ€λ€.
μ°Έκ³ : μμ μ μ£Όμ μ ν¬ν¨ν λλ¨Έμ§ μ£Όμ λ°©μμ λͺ¨λ μμ±μ μ΄νμ νΈμΆλλ―λ‘, νλμ final ν€μλλ₯Ό μ¬μ©ν μ μλ€. μ€μ§ μμ±μ μ£Όμ λ°©μλ§ final ν€μλλ₯Ό μ¬μ©ν μ μλ€.
μ°Έκ³ : μμ‘΄κ΄κ³ μ£Όμ μ, μ΅κ·Όμλ μμ±μλ₯Ό λ± 1κ° λκ³ , @Autowiredλ₯Ό μλ΅νλ λ°©λ²μ μ£Όλ‘ μ¬μ©νλ€. μ¬κΈ°μ Lombok λΌμ΄λΈλ¬λ¦¬μ @RequiredArgsConstructor ν¨κ» μ¬μ©νλ©΄ κΈ°λ₯μ λ€ μ 곡νλ©΄μ, μ½λλ κΉλνκ² μ¬μ©ν μ μλ€.
- @RequiredArgsConstructorλ finalμ΄ λΆμ νλλ₯Ό λͺ¨μμ μμ±μλ₯Ό μλμΌλ‘ λ§λ€μ΄μ€λ€
βοΈ κ²°λ‘ : νμ μμ±μ μ£Όμ μ μ νν΄λΌ! κ·Έλ¦¬κ³ κ°λ μ΅μ μ΄ νμνλ©΄ μμ μ μ£Όμ μ μ νν΄λΌ. νλ μ£Όμ μ μ¬μ©νμ§ μλκ² μ’λ€.
μ‘°ν λΉμ΄ 2κ° μ΄μ - λ¬Έμ
- @Autowiredλ νμ μΌλ‘ μ‘°νν΄μ μμ‘΄κ΄κ³λ₯Ό μ£Όμ νλ€. (getBeanκ³Ό μ μ¬νκ² λμνλ€κ³ μκ°νλ©΄ λ¨)
- λ§μ½ κ°μ νμ μ λΉμ΄ 2κ° μ΄μμ΄λΌλ©΄ μ€λ₯κ° λ°μνλ€. μ΄λ νμ νμ μΌλ‘ μ§μ ν μ μμ§λ§ νμ νμ μΌλ‘ μ§μ νλ건 DIPλ₯Ό μλ°νκ³ μ μ°μ±λ λ¨μ΄μ§λ€.
ν΄κ²° λ°©λ²
@Autowired νλ λͺ
: @Autowired λ νμ 맀μΉμ μλνκ³ , μ΄λ μ¬λ¬ λΉμ΄ μμΌλ©΄ νλ μ΄λ¦, νλΌλ―Έν° μ΄λ¦μΌλ‘ λΉ μ΄λ¦μ μΆκ° 맀μΉνλ€.
@Autowired private DiscountPolicy rateDiscountPolicy; // νμ
μ΄ λκ°μκ² μ¬λ¬κ° μμΌλ©΄ νλλͺ
μΌλ‘ μ°Ύμμ΄
- @Qualifier : μ£Όμ μ μΆκ°μ μΈ λ°©λ²μ μ 곡νλ κ²μ΄μ§ λΉ μ΄λ¦μ λ³κ²½νλ κ²μ μλλ€. λ§μ½ @Qualifier("mainDiscountPolicy")λ₯Ό λͺ» μ°Ύλλ€λ©΄ κ°μ μ΄λ¦μ λΉμ μΆκ°μ μΌλ‘ μ°Ύλλ€.
@Component @Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
- @Primary
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Primary, @Qualifier νμ©
μ½λμμ μμ£Ό μ¬μ©νλ λ©μΈ λ°μ΄ν°λ² μ΄μ€μ 컀λ₯μ μ νλνλ μ€νλ§ λΉμ΄ μκ³ , μ½λμμ νΉλ³ν κΈ°λ₯μΌλ‘ κ°λ μ¬μ©νλ μλΈ λ°μ΄ν°λ² μ΄μ€μ 컀λ₯μ μ νλνλ μ€νλ§ λΉμ΄ μλ€κ³ μκ°ν΄λ³΄μ. λ©μΈ λ°μ΄ν°λ² μ΄μ€μ 컀λ₯μ μ νλνλ μ€νλ§ λΉμ @Primary λ₯Ό μ μ©ν΄μ μ‘°ννλ κ³³μμ @Qualifier μ§μ μμ΄ νΈλ¦¬νκ² μ‘°ννκ³ , μλΈ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ λΉμ νλν λλ @Qualifier λ₯Ό μ§μ ν΄μ λͺ μμ μΌλ‘ νλ νλ λ°©μμΌλ‘ μ¬μ©νλ©΄ μ½λλ₯Ό κΉλνκ² μ μ§ν μ μλ€. λ¬Όλ‘ μ΄λ λ©μΈ λ°μ΄ν°λ² μ΄μ€μ μ€νλ§ λΉμ λ±λ‘ν λ @Qualifier λ₯Ό μ§μ ν΄μ£Όλ κ²μ μκ΄μλ€.
μ°μ μμλ @Qualifier
κ° λ μ’μ λ²μμ μ νκΆμ κ°μ§κΈ° λλ¬Έμ @Qualifier
κ° λ λλ€.