Springboot Autowried 및 Resouce 사용 비교 분석
인터넷 에서 자 료 를 수집 했다.
공통점
@Resource 와@Autowired 는 모두 속성 을 주입 하 는 수식 으로 사용 할 수 있 습 니 다.인터페이스 가 단일 실현 클래스 만 있 을 때 두 주해 의 수식 효과 가 같 고 서로 교체 할 수 있 으 며 사용 에 영향 을 주지 않 습 니 다.
차이 점
@Resource 는 자바 자체 의 주해 입 니 다.@Resource 는 두 가지 속성 이 비교적 중요 합 니 다.name 과 type 으로 나 뉜 다.Spring 은@Resource 주해 의 name 속성 을 bean 의 이름 으로 해석 하고 type 속성 은 bean 의 유형 으로 해석 합 니 다.따라서 name 속성 을 사용 하면 by Name 의 자동 주입 정책 을 사용 하고 type 속성 을 사용 할 때 by Type 자동 주입 정책 을 사용 합 니 다.name 도 지정 하지 않 고 type 속성 도 지정 하지 않 으 면 반사 체 제 를 통 해 by Name 자동 주입 정책 을 사용 합 니 다.
@Autowired 는 spring 의 주해 입 니 다.spring 2.5 버 전에 서 도입 되 었 습 니 다.Autowired 는 type 에 따라 만 주입 되 며 name 과 일치 하지 않 습 니 다.type 이 주입 대상 을 식별 할 수 없 을 때@Qualifier 또는@Primary 주석 에 의존 하여 함께 수식 해 야 합 니 다.
열거 하 다
새 Human Service.java 클래스
package com.komiles.study.service;
/**
* @author [email protected]
* @date 2020-03-23 11:46
*/
public interface HumanService {
/**
*
* @return
*/
String runMarathon();
}
클래스 ManServiceImpl.java 구현
package com.komiles.study.service.impl;
import com.komiles.study.service.HumanService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* @author [email protected]
* @date 2020-03-23 11:48
*/
@Service
public class ManServiceImpl implements HumanService {
/**
*
*/
@Override
public String runMarathon() {
return " A man run marathon";
}
}
새 HumanController.java
package com.komiles.study.controller;
import com.komiles.study.service.HumanService;
import com.komiles.study.service.impl.ManServiceImpl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author [email protected]
* @date 2020-03-23 11:49
*/
@RestController
@RequestMapping("/human")
public class HumanController {
@Autowired
private HumanService humanService;
@GetMapping("/run")
public String runMarathon()
{
return humanService.runMarathon();
}
}
실행 프로그램출력 내용:man run marathon
controller 에 있 는@Autowired 를@Resource 로 바 꿔 도 정상적으로 접근 할 수 있 습 니 다.
만약 내 가 여러 개의 실현 류 를 쓴다 면 어떻게 될 까?
Woman ServiceImpl.자바 새로 만 들 기
package com.komiles.study.service.impl;
import com.komiles.study.service.HumanService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* @author [email protected]
* @date 2020-03-23 12:01
*/
@Service
public class WomanServiceImpl implements HumanService {
/**
*
*/
@Override
public String runMarathon() {
return "A Woman run marathon";
}
}
프로그램 을 실행 하 다 보 니 오류 가 발생 했 습 니 다.두 개의 실현 클래스 가 있 기 때문에 프로그램 이 그것 을 찾 을 줄 몰 랐 습 니 다.어 떡 하지?
두 가지 방법 이 있어 요.
첫 번 째 는 실현 류 에서 클래스 의 이름 을 짓 고 도입 할 때 이름 을 직접 도입 한다.
예 를 들 어 ManServiceImpl.자바 류,@Service 에 값 을 추가 합 니 다.@Service(value="manService")또는@Component(value="manService")
package com.komiles.study.service.impl;
import com.komiles.study.service.HumanService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* @author [email protected]
* @date 2020-03-23 11:48
*/
@Service(value = "manService")
//@Component(value = "manService")
public class ManServiceImpl implements HumanService {
/**
*
*/
@Override
public String runMarathon() {
return " A man run marathon";
}
}
Controller 클래스 에서 사용 할 때 도 이름 을 만들어 야 합 니 다.@Resource 를 사용 하려 면@Resource(name="manService")를 추가 해 야 합 니 다.
@Autowired 를 사용 하려 면@Qualifier(value="manService")를 사용 해 야 합 니 다.
package com.komiles.study.controller;
import com.komiles.study.service.HumanService;
import com.komiles.study.service.impl.ManServiceImpl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author [email protected]
* @date 2020-03-23 11:49
*/
@RestController
@RequestMapping("/human")
public class HumanController {
@Autowired
@Qualifier(value = "manService")
// @Resource(name="manService")
private HumanService humanService;
@GetMapping("/run")
public String runMarathon()
{
return humanService.runMarathon();
}
}
어떤 종 류 를 우선 인용 하려 면 구현 클래스 에@Primary 를 사용 할 수 있 습 니 다.프로젝트 코드:
https://github.com/KoMiles/springboot/blob/master/src/main/java/com/komiles/study/controller/HumanController.java
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.