Spring에서 Bean을 생성하는 단계는 크게 두 가지 단계로 나눌 수 있음.
1. 스프링 빈 등록(@Bean or @Component를 찾아 빈 등록)
2. 의존관계 주입 (@Autowired 찾아 의존관계 주입)
단, 생성자 주입은 빈 등록하면서 의존관계 주입 동시에 진행 (그런데 의존관계 주입에 필요한 빈이 컨테이너에 없으면..?)
의존관계 주입 방법
- 생성자 주입
- 수정자 주입(setter 주입)
- 필드 주입
- 일반 메서드 주입
1. 생성자 주입
생성자에 @Autowired
등록이 되면 생성자 호출, 생성자 호출 시 생성자에 있는 파라미터들을 자동을 주입한다.
장점: 생성자 호출 시점에 딱 1번만 호출되는걸 보장하기 때문에, 변하지 않는다고 보장할 수 있음 (final)
* 생성자가 딱 1개 있는 경우에 @Autowired 를 생략해도 됨.
public class MemberServiceImpl implements MemberService {
private MemberRepository memberRepository;
@Autowired // 생갹가능
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
2. 수정자 주입 (setter 주입)
선택적, 변경 가능성이 있는 의존관계를 주입할 때 사용
@Autowired(required = false)
로 어노테이션을 달면 주입할 대상이 없어도 동작 가능.
또는 중간에 필드를 변경하고 싶을 때 사용 할 수 있음.
public class MemberServiceImpl implements MemberService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
생성자 주입, 수정자 주입이 둘 다 있으면 생성자 주입 먼저 실행!
3. 필드 주입 -> 테스트코드 아니면 사용하지 말자
필드에다 값을 빡 넣어버림!
public class MemberServiceImpl implements MemberService {
@Autowired private MemberRepository memberRepository;
}
코드가 매우 간결해지지만, DI 프레임 워크가 없으면 사용할 수 없음.
즉 테스트코드를 작성할 때 의존관계를 임의로 넣어줄 수 없음.
4. 일반 메서드 주입
아무 메서드에서나 @Autowired를 수행할 수 있다.
일반적으로 잘 사용하지 않음..
public class MemberServiceImpl implements MemberService {
private MemberRepository memberRepository;
@Autowired
public void init(MemberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}'코딩 > JAVA 공부' 카테고리의 다른 글
| [Spring] 다중 등록 빈 의존 관계 문제 (0) | 2023.05.19 |
|---|---|
| [Spring] DI 옵션 처리, 롬복과 최신 트랜드 (0) | 2023.05.16 |
| [Spring] 컴포넌트 스캔 (0) | 2023.05.13 |
| [Spring] 스프링 컨테이너 생성 및 Bean 등록 (0) | 2023.05.12 |
| [JAVA] 가변 리스트, 불변 리스트 / 리스트에서 반복문 사용하기 (0) | 2023.04.12 |