[Spring #02] @Autowired, @Resource, @Inject

밍디·2024년 4월 29일
0

Spring

목록 보기
3/3
post-thumbnail

회사 코드를 보면 빈을 가져올 때 @Autowired, @Resource를 사용한다. 우선 두 어노테이션은 자동적으로 의존 대상을 찾아 필요한 의존성을 주입해 주는 DI를 위한 어노테이션이다. 그렇다면 둘의 차이점은 무엇일까?


@Autowired

Autowired.class 파일을 보자

package org.springframework.beans.factory.annotation;

/** 
Marks a constructor, field, setter method, or config method 
as to be autowired by Spring's dependency injection facilities. 
This is an alternative to the JSR-330 
...

패키지를 보아 스프링이 제공하는 어노테이션인 것을 알 수 있다. 주석을 보면 'Spring의 의존성 주입 Constructor, Field, setter Method 자동 연결되도록 표시한다 JSR-330 대안이다.' 라고 되어있다.

@Autowired
기본적으로 타입을 기준으로 의존성을 주입하는데 같은 타입의 빈 이 여러개일 경우 변수와 같은 이름의 빈을 찾아 주입한다.

@Primary와 @Qualifier를 사용 하면 같은 타입의 빈이 여러개일 경우 어떤 빈을 사용해야하는지 컨트롤 할 수 있다.

@Primary는 여러개의 인스턴스 중 하나를 결정해서 사용할 수 있는 경우
@Qualifier는 빈에 이름을 줘서 특정 빈을 가져와서 사용할 경우

단점.
1. 다른 프레임워크에서 사용 불가


JSR-330?

JSR: Java Specification Requests (JSRs) are the actual descriptions of proposed and final specifications for the Java platform.

JSR 330: Dependency Injection for Java

https://jcp.org/en/jsr/overview


@Inject

스프링은 JSR-330 표준 어노테이션을 지원한다.
@Inject는 스프링의 @Autowired와 같이 Constructor, Field, setter Method에 사용할 수 있다. 만약 @Qualifier와 같이 빈 이름으로 주입하고 싶다면 @Named를 사용하면 된다.

차이점
1. @Inject 는 'required' 속성이 없다.
@Autowired(required = flase) 속성을 넣어 빈이 주입되지 않더라도 오류가 나지 않도록 컨트롤할 수 있다. 반면 @Inject는 같은 기능을 사용하기 위해서 java.util.Optional 또는 @Nullable 추가적으로 사용해야 한다.

2. @Inject 자바에서 제공하는 어노테이션이라 다른 프레임워크에서 사용할 수 있다.

@Resource

JSR-250 어노테이션으로 fields와 setter method에 사용할 수 있다. @Resource에는 name 속성이 있다. 위의 두 어노테이션들은 먼저 타입으로 빈을 주입하지만 @Resource는 이름을 우선으로 빈을 주입한다.

참고
@Resource는 Java 9 이후로 삭제되었다.
JSR 250: Common Annotations for the JavaTM Platform

0개의 댓글

관련 채용 정보