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);
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.