Spring 의 Lookup 을 깊이 이해(방법 주입)

머리말
본 고 는 주로 Spring 중의 Lookup(방법 주입)에 관 한 내용 을 소개 하고 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 살 펴 보 겠 습 니 다.
Spring 을 사용 할 때 이런 상황 이 발생 할 수 있 습 니 다.하나의 사례 의 Bean 은 다른 사례 가 아 닌 Bean 에 의존 합 니 다.자동 조립 을 간단하게 사용 하여 의존 도 를 주입 하면 다음 과 같은 문제 가 발생 할 수 있 습 니 다.
일례 의 Class A

@Component
public class ClassA {
 @Autowired
 private ClassB classB;

 public void printClass() {
  System.out.println("This is Class A: " + this);
  classB.printClass();
 }
}
일례 가 아 닌 Class B

@Component
@Scope(value = SCOPE_PROTOTYPE)
public class ClassB {
  public void printClass() {
    System.out.println("This is Class B: " + this);
  }
}
여기 서 Class A 는 기본 적 인 단일 scope 를 사용 하고 Class B 에 의존 합 니 다.Class B 의 scope 는 prototype 이기 때문에 단일 사례 가 아 닙 니 다.이때 테스트 를 통 해 이렇게 쓴 문 제 를 알 수 있 습 니 다.

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {ClassA.class, ClassB.class})
public class MyTest {
  @Autowired
  private ClassA classA;

  @Test
  public void simpleTest() {
    for (int i = 0; i < 3; i++) {
      classA.printClass();
    }
  }
}
출력 결 과 는:
This is Class A: ClassA@282003e1
This is Class B: ClassB@7fad8c79
This is Class A: ClassA@282003e1
This is Class B: ClassB@7fad8c79
This is Class A: ClassA@282003e1
This is Class B: ClassB@7fad8c79
두 종류의 Hash Code 는 세 번 의 출력 에서 모두 같 음 을 알 수 있다.Class A 의 값 이 변 하지 않 는 것 은 이해 할 수 있 습 니 다.단일 사례 이기 때 문 입 니 다.그러나 Class B 의 scope 는 prototype 이지 만 Hash Code 도 변 하지 않 고 하나의 사례 가 된 것 같 습 니 다.
이러한 상황 이 발생 한 이 유 는 Class A 의 scope 가 기본 singleton 이기 때문에 Context 는 Class A 의 bean 을 한 번 만 만 만 들 기 때문에 의존 할 기 회 를 한 번 만 주입 할 수 있 고 용기 도 Class A 에 매번 새로운 Class B 를 제공 할 수 없 기 때문이다.
그다지 좋 지 않 은 해결 방안.
상기 문 제 를 해결 하려 면 Class A 를 수정 하여 applicationContextAware 를 실현 할 수 있 습 니 다.

@Component
public class ClassA implements ApplicationContextAware {
  private ApplicationContext applicationContext;

  public void printClass() {
    System.out.println("This is Class A: " + this);
    getClassB().printClass();
  }

  public ClassB getClassB() {
    return applicationContext.getBean(ClassB.class);
  }

  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }
}
이렇게 하면 Class B 가 필요 할 때마다 수 동 으로 Context 에 가서 새로운 bean 을 찾 을 수 있 습 니 다.테스트 를 한 번 더 달 린 후 다음 과 같은 출력 을 얻 었 습 니 다:
This is Class A: com.devhao.ClassA@4df828d7
This is Class B: com.devhao.ClassB@31206beb
This is Class A: com.devhao.ClassA@4df828d7
This is Class B: com.devhao.ClassB@3e77a1ed
This is Class A: com.devhao.ClassA@4df828d7
This is Class B: com.devhao.ClassB@3ffcd140
Class A 의 Hash Code 는 세 번 의 출력 에서 변 하지 않 고 Class B 는 매번 다 르 기 때문에 문제 가 해결 되 었 고 호출 할 때마다 새로운 인 스 턴 스 를 사용 하 는 것 을 볼 수 있 습 니 다.
그러나 이러한 표기 법 은 Spring 강 과 결합 되 어 Spring 은 침입 성 을 낮 추 는 또 다른 방법 을 제공 했다.
@Lookup
Spring 은@Lookup 이라는 주 해 를 제공 합 니 다.이것 은 방법 에 작용 하 는 주해 입 니 다.표 시 된 방법 은 다시 쓰 이 고 반환 값 의 유형 에 따라 용 기 는 BeanFactory 의 getBean()방법 으로 bean 을 되 돌려 줍 니 다.

@Component
public class ClassA {
  public void printClass() {
    System.out.println("This is Class A: " + this);
    getClassB().printClass();
  }

  @Lookup
  public ClassB getClassB() {
    return null;
  }
}
매우 간결 하고 스프링 과 강하 게 결합 하지 않 으 며 테스트 를 다시 실행 하면 정확 한 출력 을 얻 을 수 있 음 을 발견 할 수 있 습 니 다.
표 시 된 방법의 반환 값 은 더 이상 중요 하지 않 습 니 다.용기 가 동적 으로 하위 클래스 를 생 성하 고 이 주 해 된 방법 을 다시 쓰 거나 실현 하기 때문에 최종 적 으로 하위 클래스 의 방법 을 호출 합 니 다.
@Lookup 을 사용 하 는 방법 은 다음 과 같은 서명 이 필요 합 니 다.

<public|protected> [abstract] <return-type> theMethodName(no-arguments);
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기