의존관계주입방법
- 생성자 주입
특징 : 생성자 호출 시점에 딱 1번만 호출 보장
불변, 필수 의존관계에 사용함
스프링 빈 등록시에 호출됨
- 수정자 주입
특징 : setter 메서드로 의존관계 주입
선택, 변경 가능성이 있는 의존관계에 사용
- 필드 주입
필드에 바로 주입하는 방법, 추천되지 않음
특징 : 외부에서 변경이 불가능해서 테스트가 힘듬
DI프레임워크가 없으면
어플리케이션 실행과 관계없는 테스트에는 사용가능
스프링 설정하는 Configuration에서 특별한 목적으로 사용
- 일반 메서드 주입
특징 : 한번에 여러 필드를 주입 받을 수 있다.
거의 사용하지 않음
옵션처리
주의할 스프링 빈이 없어도 동작해야 할 때가 있다.
- Autowired(required = false)
- SpringFramework - @Nullable
- Optional
생성자 주입을 선택
장점
- private final을 사용 가능 -> 혹시 모를 생성자에서의 오류 검출
- 데이터 누락시에 컴파일 오류가 발생해서 검출가능
- 프레임워크에 의존하지 않고 순수 자바 언어의 특징을 잘 살릴 수 있는 방법
롬복
생성자 주입을 사용할 때, 테스트 작성할 때 너무 이것저것 작성할 것이 많다.
롬복
- @Getter, @Setter, @ToString 등 다양한 기능 지원(개편함)
- @RequiredArgsConstructor : 생성자 자동으로 생성
-> 생성자 직접 안만들어도됨 ㄷ;
최근에는 생성자를 딱 1개 두고, @Autowired를 생략하는 방법을 주로 사용
조회할 빈이 두 개 이상
하위타입을 빈으로 지정하는 것은 DIP를 위배하고 유연성이 떨어짐.
그리고 이름만 다르고, 완전히 똑같은 타입의 빈이 2개 있을 때 해결이 안된다.
@Autowired 필드명, @Qualifier, @Primary
-
@Autowired fieldName
@Autowired 는 타입매칭을 시도하고, 이때 여러빈이 있으면 필드명, 파라미터 이름으로 빈이름을 추가한다.
-> 타입매칭 시도하고, 결과가 2개 이상이면 필드명, 파라미터 명으로 빈 이름을 매칭
-
@Qualifier
그냥 Qualifier를 찾는 용으로만 사용하는게 좋음
단점 : 모든 코드에 어노테이션을 붙여야 함
-
@Primary
우선순위를 정해줌
@Primary 보다 @Qualifier가 더 세세하게 동작함
스프링은 항상 자동보다 수동이 우선순위가 높음
따라서 primary < qualifier
Annotation 직접 만들기
@Qualifier를 쉽게 사용할 수 있는 방식
@Qualifier("이름")에서 문자를 잘못 입력해서 발생하는 오류 방지 가능
조회한 빈이 모두 필요할 때 List, Map
의도적으로 정말 해당 타입의 빈이 모두 필요할 때
=> test.autowired.AllBeanTest