[다양한 의존관계 주입 방법]
1. 생성자 주입
- 생성자를 통해서 의존 관계를 주입 받는 방법
- 불변, 필수 의존관계에 사용
- 생성자가 1개만 있을 경우에는 @Autowired를 생략해도 자동 주입된다!
2. 수정자 주입(setter 주입)
- setter라는 필드의 값을 변경하는 수정자 메서드를 통해 의존관계를 주입
- 선택, 변경 가능성이 있는 의존관계에 사용
- 주입할 대상이 없어도 동작하게 하려면 @Autowired대신 @Autowired(required = false)사용
3. 필드 주입
- 필드에 바로 주입
- 외부에서 변경이 불가능 -> 테스트 하기 힘든 단점 --> 사용하지 말기!!
4. 일반 메서드 주입
- 일반 메서드를 통해 주입 받는다
- 한번에 여러 필드르 주입 받을 수 있음
★ 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작함!! Member같은 클래스에서는 불가능
[옵션 처리]
자동 주입 대상을 옵션으로 처리하는 방법
자동 주입할 대상이 없으면
- @Autowired(required=false) - 수정자 메서드 자체가 호출 안됨
- org.springframework.lang.@Nullable - null 호출
- Optional<> - Optional.empty가 입력됨
★ 과거 : 수정자 주입, 필드 주입 많이 사용 -> 최근에는 생성자 주입을 권장함!!
<이유>
- 1. 불변 2. 누락 3. final 키워드
- 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 잘 살릴 수 있음
- 기본으로 생성자 주입 사용하고 필수 값이 아닌 경우에는 수정자 주입 방식을 옵션으로 뷰여
[롬복 라이브러리]
@RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어줌
-> 코드 깔끔하게 사용 가능!
[조회 빈이 2개 이상 : 문제]
@Autowired는 타입으로 조회하는데 이렇게 되면 빈이 2개 이상일 때 문제가 발생한다
-> 해결방법 :
1. @Autowired 필드 명 매칭
- 타입 매칭 시도
- 타입 매칭 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭
2. @Qualifier
- @Qualifier끼리 매칭
- 주입시에 @Qualifier를 붙여주고 등록한 이름을 적어준다
3. @Primary 사용
- 우선순위를 정하는 방법
- @Autowired 시에 여러 빈이 매칭되면 @Primary가 우선권을 가진다
★ 우선순위 : @Qualifier>@Primary
[애노테이션 직접 만들기]
[조회한 빈이 모두 필요할 때, List, Map]
- 편리한 자동 기능을 기본으로 사용
- 직접 등록하는 기술 지원 객체는 수동 등록
- 다형성을 적극 활용하는 비즈니스 로직은 수동 등록 고민해보기
[빈 생명주기 콜백]
- 스프링 빈의 라이프사이클 : 객체 생성 -> 의존관계 주입
- 스프링 빈의 이벤트 라이프사이클 : 스프링컨테이너생성 -> 스프링빈생성 -> 의존관계주입 -> 초기화콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
스프링은 아래의 3가지 방법으로 빈 생명주기 콜백을 지원
- 인터페이스
InitializingBean : afterPropertiesSet() 메서드로 초기화 지원
DisposableBean : destroy() 메서드로 소멸 지원
- 빈 등록 초기화, 소멸 메서드 지정
설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 처럼 초기화, 소멸 메서드를
지정
- 애노테이션 @PostConstruct, @PreDestroy
최근 스프링에서 가장 권장하는 방법, 편리함 / 컴포넌트 스캔과 잘 어울린다.
'spring' 카테고리의 다른 글
스프링 스터디_마지막 (0) | 2022.02.24 |
---|---|
스프링 스터디 5주차 (0) | 2022.02.10 |
스프링 스터디 4주차 (0) | 2022.02.03 |
스프링 스터디 3주차 (0) | 2022.01.27 |
스프링 2주차 스터디 (0) | 2022.01.20 |