@Autowired, @Resource 어노테이션을 사용하려면, XML 설정에 다음과 같은 코드를 추가한다.
<context:annotation-config> 태그는 다수의 전처리기 빈을 설정해준다.
전처리기를 개별적으로 등록할 수 있지만,
일반적으로 <conetext:annotation-config> 태그를 사용한다.
어노테이션을 이용한 객체 간 의존 자동 연결
@Autowired
@Service
@Controller
@Autowired는 등록된 타입으로 객체를 찾고,
@Resource는 등록된 이름으로 객체를 찾는다.
@Resource 어노테이션에 name속성에 지정된 이름의 빈 객체 설정하면
자동으로 관계가 설정된다.
@Resource(name="user")
private User user;
따라서, @Autowired는 등록된 타입으로 빈 객체를 찾기 때문에,
bean 태그의 id속성과는 상관이 없다.
@Autowired를 사용해서 타입을 찾으면
'NoUniqueDefinitionException' 예외가 발생한다.
직역해서 보자면 '유일하지 않은 정의' 이다.
이러한 단점을 보완하기 위해서, @Qualifier 어노테이션을 이용해서 범위를 좀 더 좁혀서 찾을 수 있도록 값을 지정한다.
@Inject 도 등록된 타입을 찾기 때문에, @Autowired 와 동일하게 동작한다.
@Resource 어노테이션 name속성을 지정하지 않을 경우,
필드 이름이나 프로퍼티 이름을 사용한다.
만약, 존재하지 않는다면 @Autowired 처럼 같은 타입의 객체를 찾고, 없다면 Exception이 발생한다.
@Resource는 지정한 이름으로 찾기 때문에 타입으로 찾을 때보다 겹치는 일이 현저히 줄어드므로, 사용하기에 더 편하다.
base-package속성에 지정한 패키지 및 그 하위 패키지에 위치한 클래스 중에서 @Component 어노테이션이 적용된 클래스를 검색해서 스프링 빈으로 등록한다.
스프링에서 ComponentScan으로 자동 등록되는 클래스는,
만약 빈 객체를 찾지 못한다면, BinCreationException 이 발생한다.
앞으로 많이 보게 될 예외이므로 잘 파악하자.
스캔 대상으로는,
include-filter 태그는 포함, exclude-filter 태그는 스캔 대상에서 제외된다.
@Autowired의 require 속성을 false로 지정하면 빈 객체를 찾지 못하더라도, BinCreationException이 발생하지 않는다.