Spring @Autowired 주입 팁 자세히 보기

오늘 동료와 스프링 자동 주입을 토론했을 때 이런 코드가 특히 곤혹스러워하는 것을 발견했다. 물론 대체적인 원리는 이해할 수 있지만 이전에 이렇게 사용한 적이 없다.미래에 사용될 수도 있고, 미래에 다른 사람이 쓴 코드를 볼 때 같은 곤혹을 해결하는 데 시간이 걸리지 않을 것이라고 생각하기 때문에 편집자는 그래도 연구 기록이 필요하다고 생각한다.
1. 같은 유형을 여러 번 같은 실례로 주입한다
일단 이 코드가 뭔지 한번 볼까요?

@Autowired
private XiaoMing xiaoming;

@Autowired
private XiaoMing wanger;
XiaoMing.java

package com.example.demo.beans.impl;

import org.springframework.stereotype.Service;

/**
 * 
 * The class XiaoMing.
 *
 * Description: 
 *
 * @author: huangjiawei
 * @since: 2018 7 23 
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
@Service
public class XiaoMing {
 
 public void printName() {
  System.err.println(" ");
 }
}

우리는 @Autowired 유형( Type 에 따라 자동으로 주입할 수 있고 기본적으로 주입된 bean이 단례( SingleTon 인 것을 알고 있다. 그러면 위에서 두 번 주입하면 중복되지 않느냐고 물어볼 수 있다.답은 긍정적이다.그리고 매번 주입되는 실례는 같은 실례이다.다음은 간단히 검증해 보겠습니다.

@RestController
public class MyController {
 
 @Autowired
 private XiaoMing xiaoming;
 
 @Autowired
 private XiaoMing wanger;
 
 @RequestMapping(value = "/test.json", method = RequestMethod.GET)
 public String test() {
  System.err.println(xiaoming);
  System.err.println(wanger);
  return "hello";
 }
}

위의 인터페이스를 호출한 후 아래의 내용을 출력하면 둘이 같은 실례임을 알 수 있다.
com.example.demo.beans.impl.XiaoMing@6afd4ce9
com.example.demo.beans.impl.XiaoMing@6afd4ce9
2. 주입 인터페이스 유형 실례
만약 우리가 주입하고자 하는 유형이 하나의 인터페이스 유형으로 성명되고, 이 인터페이스는 1개 이상의 실현 클래스가 있다면, 아래의 코드는 정상적으로 실행될 수 있습니까?우리는 Student 를 인터페이스로 가정하고 WangEr XiaoMing 를 두 가지 실현류로 한다.

@Autowired
private Student stu1;

@Autowired
private Student stu2;

@Service
public class XiaoMing implements Student {

@Service
public class WangEr implements Student {
답은 위의 코드가 정상적으로 작동하지 않고 Spring이 오류를 보고하기 시작했습니다. 왜냐하면 Spring은 Student에 하나의 실례를 주입하려고 했지만 주입하는 과정에서 의외로 두 개를 발견했기 때문에 오류를 보고했습니다. 구체적인 오류 정보는 다음과 같습니다.
Field stu1 in com.example.demo.controller.MyController required a single bean, but 2 were found:
 - wangEr: defined in file [C:\Users\huangjiawei\Desktop\demo\target\classes\com\example\demo\beans\impl\WangEr.class]
 - xiaoMing: defined in file [C:\Users\huangjiawei\Desktop\demo\target\classes\com\example\demo\beans\impl\XiaoMing.class]
그럼 어떻게 해야 되지?일반적인 사고방식에서 우리는 모든 실현 클래스에 id 값을 분배할 것을 생각하는데 그 결과 다음과 같은 코드가 생겼다.

@Autowired
private Student stu1;

@Autowired
private Student stu2;

@Service("stu1")
public class XiaoMing implements Student {

@Service("stu2")
public class WangEr implements Student {
위의 설정을 마치면 스프링은 필드 이름에 따라 기본적으로 bean 공장에 가서 해당하는 bean을 찾아 주입합니다. 이름은 마음대로 찾을 수 없습니다. 주입된 속성 이름과 일치해야 합니다.
3. 총결산
  • 1. 같은 유형@Autowired을 여러 번 주입할 수 있고 모든 주입의 실례는 같은 실례이다.
  • 2. 인터페이스를 주입할 때 각 실현 클래스에 해당하는 id를 가리키면 스프링이 오류를 보고한다.
  • 이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기