본문 바로가기

Java/Spring

자동 의존 주입을 위한 @Autowired @Resource @Inject 차이

더보기

Spring에서 제공하는 의존 자동 주입(Automatic Dependency Injection)은 설정 클래스에서 DI를 위한 코드를 간략화합니다.

의존 자동 주입을 위한 어노테이션은 @Autowired @Resource @Inject가 있습니다.

각 어노테이션은 사용 방법과 Spring에서 의존이 주입되는 방식에서 차이가 있습니다.

자동 주입을 위한 어노테이션: @Autowired

자동 주입을 위해 가장 기본적으로 사용되는 어노테이션입니다.

  • 생성자 필드 그리고 Setter에서 사용 할 수 있습니다.
  • 데이터 타입을 기준으로 Bean을 찾습니다.
  • 동일한 타입의 Bean이 여러 개인 경우 참조 변수의 이름과 동일한 Bean을 찾습니다.
  • @Qualifier에서 지정하는 Bean을 찾습니다.
@Autowired(required = false)
public void setXXX()
{
	
}
더보기

데이터 타입 > 참조 변수의 이름 > @Qualifier

더보기

동일한 Bean에 대한 우선 순위를 처리하기 위해 @Primary를 사용 할 수 있습니다.

자동 주입을 위한 어노테이션: @Resource

자바 9 이상에서 사용 할 수 없어 실제로는 거의 쓰이지 않습니다.

Not Nullable로써 자동 주입으로 인해 반드시 Bean을 찾을 수 있어야 합니다.

  • 필드 그리고 Setter에서 사용 할 수 있습니다. @Autowired와 달리 생성자에서는 사용 할 수 없습니다.
  • 참조 변수의 이름과 동일한 Bean을 찾습니다.
  • 데이터 타입을 기준으로 Bean을 찾습니다.
  • @Qualifier에서 지정하는 Bean을 찾습니다.
  • name 옵션을 사용하여 Bean을 찾을 수 있습니다.
@Resource(name = "someBeanName")
public void setXXX()
{
	
}
더보기

참조 변수의 이름 > 데이터 타입 > @Qualifier

자동 주입을 위한 어노테이션: @Inject

@Autowired 만큼 많이 사용되며 서로 대체가 가능합니다. 자바에서 지원하므로 Spring Framework에 종속적이지 않습니다.

Not Nullable로써 자동 주입으로 인해 반드시 Bean을 찾을 수 있어야 합니다.

  • 생성자 필드 그리고 Setter에서 사용 할 수 있습니다.
  • 데이터 타입을 기준으로 Bean을 찾습니다.
  • @Qualifier에서 지정하는 Bean을 찾습니다.
  • 참조 변수의 이름과 동일한 Bean을 찾습니다.
  • @Named 어노테이션을 함께 사용하여 Bean을 찾을 수 있습니다.
@Inject
@Named(value = "someBeanName")
public void setXXX()
{
	
}
더보기

데이터 타입 > @Qualifier > 참조 변수의 이름

더보기

동일한 Bean에 대한 우선 순위를 처리하기 위해 @Primary를 사용 할 수 있습니다.

정리 및 복습

  • 의존 자동 주입(Automatic Dependency Injection)은 설정 클래스에서 DI를 위한 코드를 간략화합니다.
  • 의존 자동 주입을 위한 어노테이션은 @Autowired @Resource @Inject가 있습니다.
구분 @Autowired @Resource @Inject
Annotation targets Constructor Field Setter Field Setter Constructor Field Setter
Injection order 데이터 타입 > 데이터 이름 > @Qualifier 데이터 이름 > 데이터 타입 > @Qualifier 데이터 타입 > 데이터 이름 > @Qualifier
Nullable required = true | false Not Nullable Not Nullable
Related annotations @Primary None @Primary @Named
Versions Spring Framework 전용 Java 9 이상에서 사용 불가능 Spring Framework에 종속적이지 않음