개발/1일1문제해결
[Spring] @Autowired, @Inject, @Resource 사용법 및 차이
Gamii
2021. 7. 19. 00:58
728x90
1. 개념
@Resource | @Inject | @Autowired | |
범용 | 자바에서 지원 | 자바에서 지원 | 스프링 전용 |
위치 | 필드, setter메서드 | 필드, 생성자, setter메서드, 일반 메서드 |
필드, 생성자, setter 메서드 |
연결 방식 | 이름으로 연결 | 타입에 맞춰서 연결 | 타입에 맞춰서 연결 |
연결을 위한 검색 방식 | 이름->타입->@Qulifier ->실패 |
타입->@Qulifier->이름 ->실패 |
타입->이름>@Qulifier ->실패 |
강제 연결 방식 | @Resource(name="title") | @Qualifier("title") | |
공통점 | 자동 의존성 주입(DI) |
2. 예시
1) @Resource
@Resource
private Apple banana;
//이름으로 연결하기 때문에 banana-> Banana로 연결
//(이름의 맨 앞글자를 대문자로 변경해서 인식)
@Resource(name="banana")
private Apple bana;
//직접 이름을 명시해도 된다.
@Resource
@Qualifier("banana")
private Apple bana;
//Qualifier을 사용하여 명확하게 표현 가능
연결을 위한 검색 방식(순서)
- name 속성에 지정된 Bean 객체를 검색 후 사용 (@Resource(name="banana")) --- 이름
- name 속성이 없을 경우, 동일한 타입을 갖는 Bean 객체를 검색 후 사용 (Apple) --- 타입
- name 속성이 없고, 동일 타입의 Bean 객체가 2개 이상인 경우
- 같은 이름의 Bean 객체를 사용하거나,
- 없다면, @Qualifier을 이용해서 객체를 검색 후 사용 (@Qualifier("banana")) --- @Qualifier
2)@Inject
@Inject
private Apple ap;
//타입으로 연결하기 때문에 Apple을 찾아서 주입
3)@Autowired
@Autowired
private Banana banana;
//타입으로 연결하기 때문에, Banana로 연결
@Autowired
@Qualifier("banana")
private Banana bana;
//Qualifier로 Bean의 이름을 명시할 수 있다.
연결을 위한 검색 방식(순서)
- 타입이 동일한 Bean 객체를 검색 후 사용(Banana)
단, @Qulifier가 명시되어 있는 경우 @Qulifier와 같은 값을 가져야 한다. - 동일한 타입의 Bean 객체가 두개 이상인 경우
- @Qulifier로 명시한 Bean을 사용
- 없으면, 이름이 동일한 Bean 객체를 찾아서 사용(banana ->Banana)
- 여러 Bean을 동시에 주입이 가능합니다.
@Component public class Apple implements Fruits{ } @Component public class Banana implements Fruits{ } @Component public class Person{ @Autowired List<Fruits> fruits; //Fruits를 상속받는 Apple과 Banana가 주입이 되어있다. }
- @Autowired를 적용했지만, 스프링 Bean이 존재하지 않는 경우 Exception 발생
--> Exception 발생시키지 않고, Null 값으로 유지 시키고 싶은 경우
아래 코드처럼 @Autowired의 required 속성 값을 false로 지정
@Autowired(required=false) private Apple apple;
-
@Autowired @Qualifier("banana")
둘 다 동일한 역할을 수행한다.@Resource(name="banana")