@Controller
public class DeviceController {
@Resource(name = "XXXService")
protected XxxService xxxService;
의존성을 주입하는 코드들 중 기존 @Autowired
나 생성자 주입이 아닌 @Resource
라는 어노테이션을 사용해서 의존성을 주입하는 코드가 있었다.
의존성을 주입하는 코드라는 것은 웹 서치를 통해 알게되었는데, 여기서 궁금한 것은 왜 굳이 @Autowired
를 두고, @Resource
를 사용했는지이다.
그러면 먼저 둘의 가장 핵심적인 차이점에 대해서 간략하게 알아보자.
먼저 @Autowired
는 의존 객체의 타입을 기준으로 Bean 객체를 선택한다.
또한 Spring 전용 어노테이션이다. 즉 @Autowired
을 사용하기 워해서는 Spring이 전제가 되어야 한다.
Autowired
의 동작 순서는 아래와 같이 동작한다.
@Primary
어노테이션이 지정된 빈을 우선적으로 선택한다.@Primary
어노테이션이 지정되지 않은 경우, 예외가 발생한다.@Qualifier
어노테이션을 사용하여 명시적으로 주입할 빈을 지정할 수 있다.@Autowired
가 적용된 필드, 생성자 또는 메서드 파라미터에 주입되어 사용된다. @Resource
는 이름을 기준으로 Bean 객체를 선택한다.
또한 Java Specification Request 스펙의 일부로 Java에서 제공하는 어노테이션이다.
그렇기에 Spring이 아닌 다른 Java EE 컨테이너에서도 사용할 수 있다.
Resource
의 동작 순서는 아래와 같이 동작한다.
@Qualifier
를 이용해서 주입할 빈 객체를 찾는다.위 차이점에서부터 알 분들은 다 아셨겠지만, @Resource
를 사용하는 이유는 Spring 프레임워크에서 벗어나, Java EE 컨테이너나 Spring과 연동되는 경우에는, @Resource
를 사용하는 것이 더 적절할 수 있다.