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.