728x90
반응형
의존성 주입
의존성 주입방법은 4가지가 있다.
- 생성자주입
- 수정자 주입
- 필드 주입
- 일반 메서드 주입
생성자 주입
생성자를 통해서 의존관계를 주입받는 방법.
특징
- 생성자 호출시점에 한번만 호출되는 것이 보장된다.
- 불편, 필수 의존관계에 사용된다.
@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;
}
}
수정자 주입
setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 주입
특징
- 선택, 변경 가능성이 있는 의존관계에 사용
- 자바빈 프로퍼티 규약의 수정자 메서스 방식을 사용하는 방법이다.
@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;
}
}
필드주입
필드에 바로주입하는 방법
특징
- 코드가 간결하지만 외부에서 변경 불가하여 테스트가 힘들다.
- DI 프레임 워크가 없으면 아무것도 할 수 없다.
- 사용하지 말자
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
일반 메서드 주입
특징
- 한번에여러필드를주입받을수있다.
- 일반적으로잘사용하지않는다.
@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;
}
}
옵션처리
주입할스프링빈이없어도동작해야할때가있다.
그런데@Autowired만사용하면required 옵션의기본값이true로되어있어서자동주입대상이없 으면오류가발생한다.
처리방법
- @Autowired(reqired = false) : 자동 주입할 대상이 없으면 메서드가 호출 안된다.
- @Nullable : 자동 주입할 대상이 없으면 null이 입력된다.
- Optional<>: 자동 주입할 대상이 없으면 Optional.empty가 입력된다.
전체코드
package hello.core.autowired;
import hello.core.member.Member;
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 org.springframework.lang.Nullable;
import java.util.Optional;
public class AutoWiredTest {
@Test
void AutowiredOption() {
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean {
// required 를 false로 할 경우 호출이 안됨.
// 의존 관계가 없으면 메서드 호툴이 안된다.
@Autowired(required = false)
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
// 호출이 되게 하려면?
// @Nullable 호출은 된다. 하지만 null 로 들어 온다
// spring bean 없으면
@Autowired
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2);
}
// optional로 처리
@Autowired
public void setNoBean3(Optional<Member> noBean3) {
System.out.println("noBean3 = "+noBean3);
}
}
}
728x90
반응형
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] Lombok (0) | 2021.05.23 |
---|---|
[Spring] 의존성 주입방법 2 (0) | 2021.05.17 |
[Spring] ComponentScan2 - Annotation만들기 (0) | 2021.05.08 |
[Spring] ComponentScan1 - 기초 (0) | 2021.05.08 |
[Spring] Configuration과 Singleton (0) | 2021.05.05 |
댓글