필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것
Spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입 방법을 제공한다.
@Autowired 어노테이션은 Spring에게 의존성을 주입하라는 지시자 역할로 쓰이는데 생성자, field, setter에 붙일 수 있다.
@Autowired
private OwnerRepository owners;
@Autowired
public void setOwners(OwnerRepository owners){
this.owners = owners;
}
스프링 4.3부터 어떤 클래스의 생성자가 하나 뿐이고 그 생성자로 주입받는 참조변수들이 빈으로 등록되어 있다면, 그 빈을 자동으로 주입해주도록 기능이 추가되었다. 그래서 @Autowired를 생략할 수 있다.
public OwnerController(OwnerRepository clinicService){
this.owners = clinicServiec;
}
보통 생성자를 사용하여 의존성 주입하는 방법이 주로 권장된다. 그 이유는 필수적으로 사용해야하는 참조변수 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문이다. (field와 setter를 사용하면 강제할 수 없다.)
A를 B가 참조하고, B가 A를 참조
이 경우, A와 B 둘 다 생성자주입을 사용하면 만들지 못한다. 하지만 field injection 또는 setter injection을 사용하면 인스턴스를 만든 다음 서로의 인스턴스를 주입할 수 있어 상호참조하는 의존성 문제가 해결가능하다.
그러나 가급적 상호참조가 발생하지 않도록 의존성을 조율하는 것을 권장한다.
@Repository @Primary
@Autowired @Qualifier("BookRepository")
Spring Bean Life Cycle을 참고하여 보면 BeanFactory가 BeanPostProcessor타입의 빈을 찾는데, 그 중의 하나가 AutowiredAnnotationBeanPostProcessor이다. 그래서 다른 일반적인 빈들에 BeanPostProcessor의 로직을 적용하는 것이다.