주입 방법 #
생성자 주입 #
- final OK (누락 X)
- 변경 가능성 X
- 최초 1번 실행 보장
- 생성자 1개 =>
@Autowired
생략 가능- 여러 개, 생략 불가능
세터 주입 #
생성자 이후에 처리 (= final X)
단점
- Setter Open
- 변경 가능성
- final X
- 선택적 (null OK)
필드 주입 #
생성자 이후에 처리 (= final X)
- DI Framework 에 의존
- 테스트할 때, 주입해줄 수 없음.
- Setter 열어줘야함.
- final X
- 선택적 (null OK)
- * 단, 일부 테스트 코드에서는 OK
일반 메서드 주입 #
생성자 이후에 처리 (= final X)
일반 메서드 통해 주입 OK
- 잘 사용하지 않음
// 다른 주입과 동일하게, Bean 등록 시 알아서 주입해줌
@Autowired
public void asdasd(MyRepository myRepository) {
this.myRepository = myRepository;
}
@Autowired(required = false) #
- 주입 대상 있으면, 주입
- 주입 대상 없으면, 생략
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println(member); // Member Bean 없으면 이 주입(메서드)는 실행 안됨
}
```java
@Autowired(required = false)
public void setNoBean2(Optional<Member> member) {
System.out.println(member); // Optional.empty
}
// null 주입
@Autowired
public void setNoBean3(@Nullable Member member) {
System.out.println(member); // Member Bean 없으면 이 주입(메서드)는 실행 안됨
}
@Primary, @Qualifier #
@Qualifer 시 아래와 같이 사용자 어노테이션 만드는 방법도 있음
무분별하게 사용, 만들지는 말 것
@Qualifier("myDetail1Service")
public @interface MyDetail1Service {
}