@Resource, @Autowired, @Inject 차이점(feat. @Qualifier)

2021. 10. 18. 10:41Spring

의존 객체 자동 주입(Automatic Dependency Injection)

 스프링 설정파일에서 의존 객체 대상을 명시하지 않아도 스프링 컨테이너가 자동적으로 의존 대상 객체를 찾아 해당 객체에 필요한 의존성을 주입하는 것을 말한다

 

@Resource

찾는 순서

이름 -> 타입 -> @Qualifier -> 실패

특징

  • Java에서 지원하는 어노테이션
  • 특정 프레임워크에 종속되어있지 않다.
  • name 속성의 이름을 기준으로 찾습니다. 없으면 타입, 없으면@Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입한다.
  • <context:annotation-config/> 구문을 꼭 xml 설정파일에 추가해야한다.

사용할 수 있는 위치

  • 멤버변수 , setter 메소드

 

@Autowired

찾는 순서

타입 -> 이름 -> @Qualifier -> 실패

특징

  • Spring에서 지원하는 어노테이션입니다.
  • 주입하려고 하는 객체의 타입이 일치하는지를 찾고 객체를 자동으로 주입한다. 만약에 타입이 존재하지 않는다면 @Autowired에 위치한 속성명이 일치하는 bean을 컨테이너에서 찾는다. 그리고 이름이 없을 경우 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입한다.
  • <context:annotation-config/> 구문을 꼭 xml 설정파일에 추가해야한다.

사용할 수 있는 위치

  • 멤버변수, setter메소드, 생성자, 일반 메소드

 

@Inject

찾는 순서

타입 -> @Qualifier-> 이름 -> 실패

특징

  • Java에서 지원하는 어노테이션입니다.
  • 특정 프레임 워크에 종속적이지 않다.
  • @Aurowired와 동일하게 작동하지만 찾는 순서가 다르다
  • @Inject를 사용하기 위해서는 maven이나 gradle에 javax 라이브러리 의존성을 추가해야한다.

사용할 수 있는 위치

  • 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능

 

@Qualifier

@Autowired 시 타입이 동일한 bean객체가 여러개 있으면 Spring이 Exception을 일으킨다. 

해당 상황에서 bean을 명시해주기 위해 사용

 

예시

@Autowired @Qualifier("m1")
private AdminService adminService;

스프링이 어떤bean을 주입해야 될지 모르기 때문에 스프링 컨테이너를 초기화 하는과정에서 Exception

  • @Autowired의 주입 대상이 한 개여야 하는데 실제로는 두 개 이상의 빈이 존재해 주입할 때 사용할 객체를 선택할 수 없기 때문이다.
  • 단, @Autowired가 적용된 필드나 설정 메서드의 property 이름과 같은 이름을 가진 빈 객체가 존재할 경우에는 이름이 같은 빈 객체를 주입받는다.

 

 

참고

https://velog.io/@sungmo738/Resource-Autowired-Inject-%EC%B0%A8%EC%9D%B4