Spring Framework에서 @Inject와 @Autowired의 차이점은 무엇입니까? 어떤 조건에서 어떤 것을 사용해야합니까?


695

SpringSource에서 일부 블로그를 살펴보고 블로그 중 하나에서 저자가 사용 @Inject중이며 그가 사용할 수도 있다고 가정합니다 @Autowired.

다음은 코드 조각입니다.

@Inject private CustomerOrderService customerOrderService;

나는 사이의 차이에 대해하지 확신 @Inject하고 @Autowired누군가가 자신의 차이를 설명하면 감사하겠습니다 어느 하나가 어떤 상황에서 사용할 수 있나요?


3
나도 이것에 익숙하지 않기 때문에 대답이 없지만 sakaenakajima.wordpress.com/2010/08/10/…에
Sagar V


2
'@Inject'와 '@Autowired'의 차이점은이 기사에 잘 설명되어 있습니다. alextheedom.wordpress.com/2016/02/13/…
Alex

답변:


720

여기서는 javax.inject.Inject주석을 참조한다고 가정합니다 . @Inject자바 CDI (의 일부 컨텍스트 및 의존성 주입 표준 Java EE 6에 도입) (JSR-299), 더 읽기 . Spring은 @Inject자체 @Autowired주석 과 동의어 사용을 지원하기로 선택했습니다 .

따라서 귀하의 질문에 대답하기 위해 @AutowiredSpring 자체 주석이 있습니다. @InjectSpring과 유사한 종속성 주입 표준을 정의하는 CDI라는 새로운 Java 기술의 일부입니다. Spring 애플리케이션에서 두 개의 주석은 Spring이 일부 JSR-299 주석을 자체적으로 지원하기로 결정한 것과 동일한 방식으로 작동합니다.


115
따라서 이론적으로 @Inject를 사용하면 스프링을 Guice와 같은 다른 DI 프레임 워크로 대체하고 동일한 방식으로 종속성을 주입 할 수 있습니다.
Alex Barnes

71
pedantic의 위험에 : @InjectCDI (JSR-299)와 별도의 JSR (JSR-330)입니다.
Brad Cupit

36
JSR- * 주석에만 의존하는 경우 DI 프레임 워크를 대체 할 수 있습니다 . 그러나 당신은? 스프링을 사용하기 시작하면 DI보다 더 많이 사용했을 가능성이 있습니다. 당신은 단지 변화를 만들지 않을 것입니다; 그리고 당신이 할지라도, 그것은 이동을 만들거나 깨뜨릴 몇 가지 검색 및 대체가 아닙니다. 반면 Spring의 자체 주석은 더 많은 기능을 제공합니다. 좋은 프레임 워크를 마스터하면 많은 것을 사용하는 것보다 더 많은 것을 얻을 수 있습니다.
Agoston Horvath

18
DI 프레임 워크를 자주 변경하지 않는다는 데 동의합니다. 그러나 소스 코드에 여러 패키지가 있고 여러 프로젝트에서 공유하려는 공통 패키지를 빌드하려는 경우 @InjectJSR 주석을 사용 @Autowired하는 것이 스프링 DI로 코드베이스를 잠그는 것보다 낫습니다 .
Aditya

3
@Inject단독으로 사용 한다고 프레임 워크 독립성이 보장되지는 않습니다. 또한 봄의 같은 프레임 워크에 의존 시스템을 사용하지 않고 주사 콩을 선언해야 할 것 @Component또는 application.xml하지만, 사용 @Named@Singleton클래스 수준. 어떤 Spring 프로젝트가 오늘날 그런 콩을 실제로 선언하는지 전혀 모르겠습니다. Spring에서 JEE로 마이그레이션 된 프로젝트에 대해서는 들어 본 적이 없습니다 ...
Marcus K.

162

여기입니다 블로그 포스트 비교 @Resource, @Inject그리고 @Autowired, 그리고 꽤 포괄적 인 일을 할 것으로 보인다는.

링크에서 :

테스트 2와 7을 제외하고 구성과 결과는 동일했습니다. 후드를 살펴 보았을 때 '@Autowired'와 '@Inject'주석이 동일하게 작동한다고 결정했습니다. 이 두 주석 모두 'AutowiredAnnotationBeanPostProcessor'를 사용하여 종속성을 주입합니다. '@Autowired'와 '@Inject'는 스프링 빈을 주입하기 위해 서로 바꿔 사용할 수 있습니다. 그러나 '@Resource'주석은 'CommonAnnotationBeanPostProcessor'를 사용하여 종속성을 주입합니다. 비록 다른 포스트 프로세서 클래스를 사용하더라도 모두 거의 동일하게 동작합니다. 아래는 실행 경로를 요약 한 것입니다.

저자가 언급 한 테스트 2와 7은 각각 '필드 이름으로 주입'과 '나쁜 한정자를 사용하여 빈을 해결하려는 시도'입니다.

결론은 필요한 모든 정보를 제공해야합니다.


4
이 기사는 세 가지 주석에 대한 훌륭한 설명입니다. 처음 스 와이프 한 후에 다시 읽어야했습니다. 그러나 훌륭한 기사입니다.
Thomas

1
고마워요! 이 기사는 Spring과 JavaEE의 차이점과 유사점 및 내가 가지고있는 몇 가지 다른 질문을 찾는 데 대한 여러 대답에 대답했습니다.
Kevin Cruijssen

36

배선이없는 상황을 처리하기 위해 @Autowired required속성을로 설정하여 Bean을 사용할 수 있습니다 false.

그러나를 사용할 때 @InjectProvider 인터페이스는 Bean과 함께 작동하므로 Bean이 직접 주입되지 않고 Provider로 주입됩니다.


8
이것은 매우 중요하며 가장 많이 대답 된 답변에서 간과되었습니다.
Igor Donin 2016 년

기본적으로 필수 매개 변수는 자동 유선에 대해 true로 설정되어 있습니다. 참조 : docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
고요한

25

스프링 3.0으로 봄 이벤트 JSR-330 의존성 주입 주석 지원 ( @Inject, @Named, @Singleton).

Spring 문서 에는 Spring과 동등한 것을 비교하는 것을 포함 하여 Spring 문서 에 대한 별도의 섹션 이 있습니다 .


Spring이 JSR을 지원한다고 말할 때의 의미는 무엇입니까? 컨테이너가 Spring과 독립적으로 JSR을 지원하지 않으며 컨테이너가 J2EE를 준수해야합니까? 기능을 래핑한다는 의미입니까? Spring이 "지원"하지 않으면 javax의 주석이 기본적으로 여전히 작동하지 않습니까?
Dan Chase

JEE 컨테이너에서 Spring을 실행할 필요는 없으며 Tomcat과 같은 서블릿 / JSP 컨테이너에서도 사용할 수 있으며 여전히 JSR-330을 지원할 수 있습니다. Spring은 별도의 DI 컨테이너이며, 호스트 JEE 서버와 CDI Bean을 "교환"하지 않습니다. JEE 컨테이너 또는 Spring Bean에서 CDI를 사용할 수 있지만 둘 다 사용할 수는 없습니다.
Andre Steingress

22

합니다 (읽을 때주의 주요 차이점 봄 문서를 사이) @Autowired@Inject그이다, @Autowired@Inject가 어떤 속성을 '요구'한 반면 '필요'속성이 없습니다.


필요한 것은 무엇을 의미합니까?
mattyman

2
@mattymanme 문서에서 "기본적으로 자동 연결은 후보 Bean이 0 일 때마다 실패합니다. 기본 동작은 어노테이션이있는 메소드, 생성자 및 필드를 필수 종속성을 나타내는 것으로 처리하는 것입니다. 필수 동작을 false로 설정하여이 동작을 변경할 수 있습니다. ". 예 : @Autowired(required=false). "required
Lucky

소스 코드를 살펴보십시오. public interface Autowired {/ ** * 주석이 달린 종속성이 필요한지 여부를 선언합니다. * / 부울 필수 () 기본값 true; } 공개 인터페이스 주입 {}
tarn

15

@Inject를 항상 더 잘 사용하십시오. Java에서 제공하는 썬 구성 방식이므로 응용 프로그램을 프레임 워크에 무관하게 만듭니다. 따라서 봄이되면 수업도 효과가 있습니다.

@Autowired를 사용하면 @Autowired는 스프링 제공 주석이기 때문에 스프링에서만 작동합니다.


13
태양은 죽었다. 오랫동안 태양을 사십시오.
Amrinder Arora

6
얼마나 자주 프레임 워크를 변경 하시겠습니까? 그냥 궁금해
Kay

대부분의 프로젝트에서 Inject 대신 Autowired를 보았습니다. 나는 대답의 근거를 이해하지만 나는 공감할 수 없다.
Witold Kaczurba

13

@Autowired 주석은 Spring 프레임 워크에서 정의됩니다.

@Inject주석은 표준 주석이며 표준 "Dependency Injection for Java"(JSR-330)에 정의되어 있습니다. Spring (버전 3.0부터)은 표준 JSR-330에 정의 된 일반화 된 의존성 주입 모델을 지원합니다. ( Google Guice 프레임 워크Picocontainer 프레임 워크 도이 모델을 지원합니다).

with 인터페이스 @Inject의 구현에 대한 참조를 주입 할 수 있으며 Provider이로 인해 지연된 참조를 주입 할 수 있습니다.

주석 @Inject@Autowired-는 거의 완전한 비유입니다. @Autowired주석 뿐만 아니라 주석은 @Inject자동 바인딩 속성, 메서드 및 생성자에 사용할 수 있습니다.

@Autowired주석 과 달리 @Inject주석에는 required속성 이 없습니다 . 따라서 종속성을 찾지 못하면 예외가 발생합니다.

결합 특성의 설명에 차이가 있습니다. 주입을위한 구성 요소 선택에 모호성이있는 경우 @Named규정 자를 추가해야합니다. @Autowired주석 과 유사한 상황에서 @Qualifier한정자 가 추가됩니다 (JSR-330은 고유 한 @Qualifier주석을 @Named정의 하고이 한정자를 통해 정의됩니다).


'@Inject'에 필수 속성이 없더라도 Java Docs 상태 : '@Inject'로 주석이 달린 멤버의 주입이 필요합니다. 멤버를 찾을 수 없으면 주입이 실패한다는 것을 암시하는 것 같습니다. Java 문서를 참조하십시오 : docs.oracle.com/javaee/7/api/javax/inject/Inject.html
Alex Theedom


12

위의 것 외에도 :

  1. @AutowiredBean 의 기본 범위 는 Singleton 이지만 JSR 330 @Inject주석을 사용하면 Spring의 프로토 타입 과 같습니다 .
  2. JSR 330에는 @를 사용하는 @Lazy와 같은 기능이 없습니다 @Inject.
  3. 를 사용하는 JSR 330에는 @Value에 해당하지 않습니다 @Inject.

0

@Inject주석은 JSR-330 주석 모음 중 하나입니다. 여기에는 유형별 일치, ​​한정자 별 일치, ​​이름 별 일치 실행 경로가 있습니다. 이러한 실행 경로는 setter 및 field injection에 유효합니다. @Autowired주석의 동작은 주석과 동일합니다 @Inject. 유일한 차이점은 @Autowired주석이 Spring 프레임 워크의 일부라는 것입니다. @Autowired주석에는 위의 실행 경로가 있습니다. 그래서 나는 @Autowired당신의 대답을 추천합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.