생성자에 의존 관계인 객체를 주입하는 방법
불변과 필수 의존 관계에 사용된다.
생성자에 @Autowired
를 하면 스프링 컨테이너에 @Component
로 등록된 빈에서 생성자에 필요한 빈들을 찾아 주입해준다.
생성자가 1개만 존재하는 경우에는 @Autowired
를 생략해도 자동 주입된다.
Q) 생성자가 1개일 때, @Autowired를 생략해도 되는 이유는?
A) 스프링이 해당 클래스 객체를 생성하여 빈에 넣어야하는데, 생성할 때 생성자를 무조건 호출해야 하므로 그 때 의존성 주입도 같이 발생한다.
선택과 변경 가능성이 있는 의존 관계에 사용된다.
@Autowired
를 입력하지 않으면 실행이 되지 않는다.
@Autowired
를 붙여서 바로 주입하는 방법@Component
public class CoffeeService {
@Autowired
privat MemberRepository memberRepository;
@Autowired
privat CoffeeRepository coffeeRepository;
}
의존성 주입할 Bean이 없는 경우가 있다.
@Autowired
는 required 옵션의 기본값이 true이기 때문에 주입 대상이 Bean으로 등록되지 않았으면 오류가 발생한다.
이때는 @Autowired(required=false)
를 작성해준다.
@Autowired(required=false)
: 자동 주입할 대상이 없으면 메서드 자체가 호출되지 않는다.
의존 관계 설정이 되지 않으면 객체 생성이 불가능하다.
의존 관계 주입은 처음 애플리케이션이 실행될 때 대부분 정해지고 종료 전까지 변경되서는 안 된다. 생성자 주입을 사용하면 최초로 1번만 호출되고 그 이후에는 다시는 호출되는 일이 없기 때문에 불변함을 충족할 수 있다.
의존성 주입이 필요한 필드를 final
로 선언 가능하다.
final
키워드를 사용할 수가 없다.final
로 설정하면, 컴파일 시점에서 오류를 바로 확인할 수 있다.java: variable (데이터 이름) might not have been initialized
(스프링에서) 순환참조를 방지할 수 있다.
테스트 코드 작성 용이하다.
setter 주입이 필요한 경우가 있는데 그 때만 사용하면 되고 평상시에는 생성자 주입을 사용할 것!