의존을 주입할 대상에 @Autowired를 붙이면 설정 파일에서 의존을 주입하지 않아도 스프링이 알아서 그 객체와 타입이 똑같은 Bean 객체를 찾아서 주입해줌
메서드에 @Autowired 어노테이션을 붙이면 그 메서드의 파라미터와 같은 타입에 해당하는 Bean 객체를 스프링이 알아서 주입해준다.
setter가 세팅하는 객체나, setter 자체에 @Autowired 어노테이션을 붙이면 설정 파일에 설정해줄 필요가 없어지므로 훨씬 간단하다.
같은 타입의 Bean이 두 개 이상인 경우 의존 자동 주입을 사용하면 Exception이 발생한다. (상속받는 경우도 마찬가지)
이 때 Qualifier 어노테이션을 활용하면 같은 타입의 Bean이 여러개더라도 의존을 주입할 Bean을 지정할 수 있다.
@Qualifier 어노테이션은 두 가지 위치에 붙이면 된다.
1. @Bean 어노테이션을 붙인 @Bean 설정 메서드
2. 1에서 설정한 특정 Bean 설정 메서드로부터 의존을 주입받을 Bean 객체
만약에 Bean 설정에 @Qualifier 어노테이션이 없으면 Bean의 이름을 한정자로 사용한다. @Autowired 어노테이션도 마찬가지이다.
의존을 주입할 대상이 없는 값이어도 상관 없는 경우가 있다. 그러나 @Autowired는 기본적으로 해당 위치에 주입할 Bean을 찾을 수 없는 경우 무조건 Exception을 발생시킨다. 이런 상황을 막기 위해서 @Autowired(required=false)를 사용할 수 있다. 해당 위치에 꼭 의존을 주입할 필요가 없다는 의미이다. 스프링 5 이상에서는 주입 대상 파라미터의 타입에 자바8의 Optional을 사용할 수도 있다. 또한 null이어도 상관 없다는 의미로 의존 주입 대상인 파라미터 앞에 @Nullable을 사용할 수도 있다. 세 가지 방식 모두 메서드에도, 필드에도 적용 가능하다.
Cf) @Autowired(required=false)의 경우 의존을 주입할 대상이 존재하지 않으면 메서드가 호출되지 않는다.(값 할당 자체를 안하고 아무것도 안건들임) 그러나 @Nullable의 경우 의존을 주입할 대상이 없어도 메서드가 호출된다.(null값 할당해버림) Optional 역시 값이 없는 Optional을 할당한다.
의존 자동 주입을 설정해놓은 Bean에 명시적 주입(직접 주입해주는거)도 한다면 어떻게 될까?
실제로 해보면 명시적 주입은 무시되고 의존 자동 주입한 결과가 나오게 된다. 따라서 의존 주입을 사용할 계획이라면 프로젝트 전체적으로 의존 주입을 사용하는 것으로 통일을 하는 것이 좋다.