2012-02-02 1 views
26

두 가지 방법의 차이점은 보이지 않습니다. @Qualifier은 항상 @Autowired과 함께 사용됩니다.@Qualifier와 @Resource의 차이점

@Autowired 
@Qualifier("alpha") 

VS

@Resource(name="alpha") 

사람은 나를 차이를 알려 수 있을까? 감사!

+0

[Resource @Autowired] (http://stackoverflow.com/questions/4093504/resource-vs-autowired) – skaffman

답변

49

@Autowired은 단독으로 사용할 수 있습니다. 단독으로 사용하는 경우 유형별로 배선됩니다. @Autowired이 주입 할 빈을 모르기 때문에 컨테이너에 같은 유형의 빈이 하나 이상 선언 된 경우 문제가 발생합니다. 그 결과, 실제로는 (유선 이름) 빈 이름

@Resource 너무 이름으로 연결되어 유선으로 지정 될 수있는 빈 명확히 @Autowired 함께 @Qualifier를 사용한다. 따라서 @Autowired@Qualifier과 함께 사용하는 경우 @Resource과 동일합니다.

차이점은 @Autowired@Qualifier은 스프링 주석이고 @Resource은 JSR-250의 표준 자바 주석입니다. 게다가 @Resource은 필드와 설정자 주입 만 지원하며 @Autowired은 필드, 설정자, 생성자 및 다중 인수 메소드 주입을 지원합니다.

필드 및 설정자 삽입에 @Resource을 사용하는 것이 좋습니다. 생성자 또는 다중 인수 메소드 삽입을 위해 @Qualifier@Autowired을 지정하십시오.

this를 참조하십시오

당신이 이름으로 주석 중심의 주입을 표현하려는 경우, 기본적으로 @Autowired를 사용하지 않습니다 - @Qualifier 값을 통해 빈 이름 을 참조하는 기술적 할 경우에도 마찬가지입니다. 대신 고유 한 이름으로 특정 대상 구성 요소를 식별하기 위해 의미가 정의 된 JSR-250 @Resource 주석을 선호하며 선언 된 유형 은 일치 프로세스와 관련이 없습니다.

+0

실제로 그 부분은 무엇입니까? 이름으로 autowire를 원한다면 리소스 사용이 권장되는 곳을 보지 못합니다 (일부 상황에서는 실제로 작동하지 않을 것입니다). –

+0

이 업데이트되었습니다. 3.11.3의 팁 섹션에 있습니다. –

3

@Autowired는 올드 스쿨 봄입니다. @Resource는 Java EE CDI 표준입니다. Spring은 (매우 비슷한 @Inject와 마찬가지로) 두 가지 상황 모두에서 똑같은 작업을 수행합니다. @Resource를 권하고 싶습니다. @Autowired는 표준 이전에 만들어졌으며 대부분 이전 버전과의 호환성을 위해 지원되는 것으로 보입니다.

+0

의 가능한 중복 @ Resource는 현재 스프링 표준입니다. Spring Bean에서 @ Autowired가 아닌 @ Resource를 사용해야합니다. –

4

@Autowired와 관련된 몇 가지 문제에 직면하여 @Qualifier를 사용하기 시작했으며 같은 유형의 여러 빈이 정의되었을 때 @Qualifier를 @Autowired로 사용할시기를 마침내 알 수있었습니다.

당신이 동일한 유형이지만 다른 값의 2 콩 정의 가정 : 다음

<bean id="appContext1" class="com.context.AppContext"> 
    <constructor-arg value="abc" /> 
<bean/> 
<bean id="appContext2" class="com.context.AppContext"> 
    <constructor-arg value="ABC" /> 
<bean/> 

그냥 @Autowire를 사용하려고하는 경우를, 당신은 다른 사람을 빈 이름과 같은 변수 이름을 사용해야합니다 여러 유형이 발견되면 오류가 발생합니다.

@Autowired 
AppContext appContext; 

위와 같은 경우에는 한정어를 사용해야합니다.

@Autowired 
@Qualifier("appContext1") 
AppContext appContext; 

대신 bean 이름과 동일한 변수 이름을 사용하면 @Qualifier를 사용하지 않아도됩니다.

@Autowired 
AppContext appContext1; 

나는 항상 빈 이름과 같은 변수 이름을 사용하지만, 실수로 다른 변수 이름을 가지고이 문제에 직면했다.

의심되는 점이 있으면 알려주세요.