Springboot Autowried 및 Resouce 사용 비교 분석

프로젝트 를 할 때 항목 에 클래스 를 불 러 올 때@Autowired 를 사용 하 는 곳 도 있 고@Resource 를 사용 하 는 곳 도 있 습 니 다.
인터넷 에서 자 료 를 수집 했다.
공통점
@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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기