@Autowired
@Autowired의 필수여부 지정
@Autowired 어노테이션을 적용하면 반드시 주입할 의존 객체가 존재해야 한다.
만약 xml 설정파일에 해당하는 객체가 존재하지 않으면, @Autowired가 적용된 대상에 주입할 객체를 찾을 수 없기 때문에 Exception이 발생한다.
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRepositoryUserDetailsService' defined in file [../UserRepositoryUserDetailsService.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.cru.cloud.management.data.UserRepository]: : No qualifying bean of type [org.cru.cloud.management.data.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. ..... | cs |
@Autowired 어노테이션에 require 속성을 이용해, 대상에 꼭 의존 객체를 주입하지 않아도 된다고 설정할 수 있다.
1 | @Autowired(require=false) | cs |
이 경우 @Autowired 어노테이션이 적용된 대상에 주입할 의존 객체가 없더라도 required=false이기 때문에 스프링 컨테이너를 생성하는 과정에서 Exception을 발생시키지 않는다. (대신 null이 됨)
required=false인 경우 의존 객체가 주입되지 않는 것이 아니다.
주입할 의존 객체가 존재하면 해당 객체는 @Autowired 적용 대상에 주입되는 것은 같지만 required=false인 경우 주입할 의존 객체가 존재하지 않아도 Exception을 발생시키지 않는다.
@Autowired 어노테이션의 적용순서
의존 객체를 찾는 순서.
- 타입이 같은 빈 객체를 검색하고 한 개라면 그 빈 객체를 사용한다. @Qualifier가 명시되어 있으면 @Qualifier와 같은 값을 갖는 빈 객체여야 한다.
- 타입이 같은 빈 객체가 두 개 이상 존재하면 @Qualifier로 지정한 빈 객체를 찾는다. 존재하면 그 객체를 사용한다.
- 타입이 같은 빈 객체가 두 개 이상 존재하고 @Qualifier가 없을 경우 이름이 같은 빈 객체를 찾는다. 존재하면 그 객체를 사용한다.
위 단계에 해당되지 않으면 스프링 컨테이너는 Exception을 발생시킨다.
@Autowired와 파라미터
@Autowired 어노테이션을 적용한 생성자나 메서드에 파라미터가 두 개 이상인 경우, @Qualifier 어노테이션을 적용할 땐 해당 파라미터에 직접 지정해주면 된다. 파라미터가 한 개인 경우에도 지정할 수 있다.
public class ContactBook{ private Contact contact; private ContactCategory category; @Autowired public void injectDependency(Contact contact, @Qualifier("category1") ContactCategory category){ this.contact = contact; this.category = category } } | cs |
참고 및 출처:
스프링4 프로그래밍 입문 (최범균)
http://javacan.tistory.com/ (최범균님 블로그)