728x90
반응형
DI(의존관계 주입)에는 크게 4가지가 있다.
1. 생성자 주입
2. 수정자 주입
3. 필드 주입
4. 일반 메서드 주입
1. 생성자 주입
- 생성자(constructor)를 통해서 DI를 주입하는 방법
- 1번만 호출되는 것을 보장
- 불변, 필수 DI에 적용
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
DIP,OCP 등을 위반하지 않도록 작성한 코드들 중 하나이며, OrderServiceImpl이라는 구현체, MemberRepository, DiscountPolicy 라는 인터페이스를 예로 들었다.
// 여기서 @Autowired 는 생성자가 1개일때 생략이 가능하다. ( 스프링 빈에만 해당 )
2. 수정자 주입
- setter라는 수정자 메서드로 DI를 주입하는 방법
- JavaBean property 규약의 수정자 메서드 방식 사용
- JavaBean property, Java에서는 과거부터 필드 값을 직접 변경 X --> set__, get__ 메서드를 통해 수정
- 선택, 변경 가능성이 있는 DI에 적용
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
// @Autowired 는 주입할 대상이 없으면 오류가 발생
// 주입할 대상이 없어도 동작하기 위해선 @Autowired( required = false ) 로 지정
3. 필드 주입
- 필드에 바로 DI를 주입하는 방법
- DI framework가 없으면 무쓸모
- 코드가 간결
- 외부에서 변경이 불가능 -> test가 용이하지 않음.
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
// test가 힘들다는 단점때문에 사용이 꺼려짐
4. 일반 메서드 주입
- 일반 메서드를 통해 DI를 주입
- 한번에 여러 필드를 주입 받을 수 있음.
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
init이라는 일반 메서드를 통해서 의존 관계를 주입했다.
※ 앞에서 말한 모든 DI 주입들은 스프링 컨테이너가 관리하는 스프링 빈이어야 가능하며 동작한다는 사실을 잊지 말자
다음 게시글
@Autowired를 통해 DI를 주입하는 데에 있어서 여러 가지 상황과 이에 대한 옵션 처리
728x90
반응형
'Spring' 카테고리의 다른 글
Spring Basic- Bean Scope(웹 스코프) (0) | 2023.06.10 |
---|---|
Spring Basic- Bean Scope(프로토타입 스코프) (0) | 2023.06.09 |
Spring Basic- Bean LifeCycle CallBack (0) | 2023.05.24 |
Spring Basic- DI(의존 관계) 자동 주입 3 (0) | 2023.05.23 |
Spring Basic- DI(의존 관계) 자동 주입 2 (0) | 2023.05.22 |