의존성 주입(@Resource, @Autowired, @Inject) 어노테이션 정리

lsj8367·2021년 3월 18일
0

@Resource, @Autowired, @Inject 차이점 정리

세 개의 어노테이션은 컨테이너에 생성된 빈(Bean) 객체를 자동으로 주입받을 수 있도록 해주는 어노테이션들이다. 주의할 점은 Bean 객체가 생성될 때 어노테이션을 스캔해서 자동 주입해준다. 일반적인 방법으로 해당 클래스의 instance를 new해서 생성하면 어노테이션은 작동하지 않는다.
그냥 Bean 설정 파일에서 하나하나 ref="다른bean" 을 생략할수 있다. 설정파일에서 Bean을 등록하지 않고 어노테이션을 통해(@Bean) 등록할 수도 있는데 원리는 같다.

@Resource

Java에서 지원하는 어노테이션이며 특정 프레임워크에 종속적이지 않다.
순서는 아래와 같다.

이름 > 타입 > @Qualifier > 성공

name 속성의 이름을 기준으로 찾는다. 없으면 타입, 없으면 @Qualifier 어노테이션의 유무를 찾고 그 어노테이션이 붙은 속성에 의존성을 주입한다.

context:annotation-config/ 구문을 꼭 xml에 추가해야한다.

사용할 수 있는 위치
멤버변수, setter메소드

@Autowired

Spring에서 지원하는 어노테이션
찾는 순서

타입 > 이름 > @Qualifier > 성공

@Autowired는 주입하려고 하는 객체의 타입이 일치하는지를 찾고 객체를 자동으로 주입한다.
만약 타입이 존재하지 않는다면 @Autowired에 위치한 속성명이 일치하는 bean을 컨테이너에서 찾는다. 그리고 이름이 없을 경우 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입해준다.

context:annotation-config/ 구문을 꼭 xml에 추가해야한다.

사용할 수 있는 위치
생성자, 멤버변수, setter 메소드에 적용이 가능함.

스프링 4.3버전 이후부터 생성자가 1개일경우 @Autowired 어노테이션을 생략이 가능하다.

@Inject

Java에서 지원하는 어노테이션이다. 특정 프레임워크에 종속적이지 않다.
찾는 순서

타입 > @Qualifier > 이름 > 실패

@Autowired와 동일하게 작동은 하지만 찾는 순서가 다르다.
@Inject를 사용하기 위해선 maven이나 gradle에 javax 라이브러리 의존성을 추가해야한다.

사용할 수 있는 위치
멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능

@Qualifier

만약에 타입이 동일한 bean객체가 여러개가 있을시에 Spring이 Exception을 일으킨다.
스프링이 어떤 bean을 어떤것에 주입해야될지 모르기 때문에 스프링 컨테이너를 초기화하면서 에러를 발생시킨다.

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

Exception
@Qualifier에 지정한 Bean 한정자 값을 갖는 Bean이 존재하지 않으면 Exception 발생함.

정리

| | @Resource | @Autowired | @Inject |
| :-: | - | - | - |
| 범용 | Java에서 지원 | Spring 전용 | Java에서 지원 |
| 연결방식 | 이름으로 매핑 | 타입에 맞춰서 연결 | 타입에 맞춰서 연결 |

profile
기록을 많이 하자!💻

0개의 댓글