생성자 호출시점에 딱 1번만 호출되는 것이 보장됨
주로 불변, 필수 의존관계에 사용
생성자만 통해서 주입시 버그 발생해도 원인을 쉽게 파악 가능
생성자가 딱 1개만 있으면 @Autowired 생략해도 자동으로 의존관계 주입해줌
setter 메서드에 @Autowired 하는 방법
선택, 변경 의존관계에 사용
@Autowired(required = false) 로 선택가능
주입할 대상이 없으면 오류인데 @Autowired(required = false) 을 사용하면 대상이 없어도 동작한다.
필드에 바로 주입하는 방법
외부에서 변경이 불가능해서 테스트 하기 힘들다
일반 메서드에 @Autowired 하는 방법
한번에 여러 필드를 주입 받을 수 있다
일반적으로 잘 사용하지 않는다
@Autowired(required = false) : 자동 주입할 대상이 없으면 수정자 메서드 호출이 안됨
@Nullable : 자동 주입할 대상이 없으면 null로 들어감
Optional<> : 자동 주입할 대상이 없으면 Optional.empty 로 들어감
대부분의 의존관계 주입은 애플리케이션 종료시점까지 의존관계를 변경할 일이 없고 대부분 변해서는 안된다
누군가 실수로 변경하지 못하도록 생성자 주입 사용
생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다.
final 키워드를 사용하여 생성자에서 값이 설정되지 않는 오류를 컴파일 시점에서 막아준다.
@Getter : getter 메서드 생성해줌
@Setter : setter 메서드 생성해줌
@RequiredArgsConstructor : final 이 붙은 필드를 초기화 해주는 생성자를 만들어줌
롬북은 컴파일 시점에 코드들을 자동으로 생성해줌
@Autowired 된 메서드의 필드명과 일치하는 빈 이름을 선택한다
추가 구분자를 붙여주는 방법
의존관계 주입시 추가적인 방법을 제공하는 것이고 빈 이름을 변경하는 것은 아니다
@Autowired 된 메서드의 필드 옆에 @Qualifier("123") 를 달고 클래스에도 @Qualifier("123")을 달면 해당 클래스로 의존관계 주입해줌
해당 클래스가 없으면 빈 이름과 비교해서 찾아본다
우선 순위를 부여하는 방식
@Primary 가 붙은 빈을 우선으로 의존관계 주입한다
코드에서 자주 사용하는 메인 DB의 커넥션을 획들하는 스프링 빈이 있고 특변한 기능으로 가끔 사용하는 서브 DB의 커넥션을 획등하는 스프링 빈이 있는 경우
메인은 @Primary, 서브는 @Qualifier 사용
자동 기능이 편리하기 때문에 기본으로 사용
수동을 사용하면 좋은 경우는
기술 지원 빈
혹은 비즈니스 로직 중에서 다형성을 적극 활용할 때