@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에서 지원 |
연결방식 | 이름으로 매핑 | 타입에 맞춰서 연결 | 타입에 맞춰서 연결 |
'Spring' 카테고리의 다른 글
Spring -> Spring Boot 마이그레이션 (0) | 2022.08.05 |
---|---|
[Spring] MockMvc Bean 주입 에러 (0) | 2022.08.04 |
[Spring] Spring Security (0) | 2022.08.03 |
Spring Test MockMvc 한글 깨짐 처리 (0) | 2022.08.03 |