[Spring] @Autowired & @Resource

khakyy·2024년 2월 16일
0

SPRING

목록 보기
2/4
post-thumbnail

@Autowired & @Resource

두 어노테이션 모두 IoC 컨테이너에 등록된 빈 객체를 자동으로 의존성을 주입하는 역할

@Autowired

  • 필드, 메서드, 생성자에 사용 가능.
  • Bean의 타입을 사용해서 주입할 빈 객체를 조회.
  • 하나의 인터페이스는 한 개의 클래스로만 구현 가능. (두 개 이상의 클래스 구현 불가능.)
    마지막 특징 때문에 @Resource 어노테이션을 사용. (@Qualifier 또는 @Primary도 가능.)
public interface A {}

@Repository
public class B implements A {}

@Repository
public class C implements A {}

A를 구현하는 클래스 B, C 모두가 @Repository를 사용해 스프링 빈 객체로 등록되어 있는 상태.

@Service
public class Service {

    @Autowired
    private A a;
}

이러한 경우 주입받는 구현체가 B 클래스인지, C 클래스인지 구분 불가능.

@Autowired는 Bean의 타입을 이용해서 주입할 빈 객체를 찾기에, 빈 객체로 등록된 클래스 B, C 둘 다 A 인터페이스를 구현하고 있으니 구분 불가능.

@Autowired 어노테이션 사용 시 빈 객체를 찾는 순서
1. 타입이 같은 빈 객체를 찾는다.
2. 만약 타입이 같은 빈 객체가 두 개 이상이고, @Qualifier 어노테이션이 붙어있지 않은 경우 이름이 같은 빈 객체를 찾는다.
3. @Qualifier(또는 @Primary) 어노테이션이 붙어있다면 해당 어노테이션으로 지정된 빈 객체를 찾는다.

@Service
public class Service {

    @Autowired
    private A b;
}

A a에서 A b로 변경되었기에 B 클래스로 구현된 빈 객체를 찾아 주입.

@Resource

  • 필드, 메서드에 사용 가능, 생성자에는 사용 불가능.
  • Bean의 이름을 사용해서 주입할 빈 객체를 조회.
@Resource(name = "Repository")
private Repository repository;

name을 지정하여 사용하기에 한 개의 인터페이스를 여러 개의 클래스가 구현 가능.

@Resource 어노테이션 사용 시 빈 객체를 찾는 순서.
1. name으로 지정한 빈 객체를 찾는다.
2. name이 존재하지 않는다면 동일한 타입을 갖는 빈 객체를 찾는다.
3. name이 존재하지 않고, 동일한 타입을 갖는 빈 객체가 두 개 이상인 경우ㅠ 이름이 같은 빈 객체를 찾는다.
4. name이 존재하지 않고, 동일한 타입을 갖는 빈 객체가 두 개 이상이고, 이름이 같은 빈 객체마저도 없는 경우에는 @Qualifier 어노테이션(또는 @Primary)을 사용해서 주입할 빈 객체를 찾아야 한다.

참조 : https://mimah.tistory.com/entry/Spring-Resource-%EC%99%80-Autowired-%EC%B0%A8%EC%9D%B4#%40Autowired-1

0개의 댓글