spring 에서 하나의 예 bean 에 비 단일 예 bean 을 주입 하 는 방법 에 대한 상세 한 설명
이 문 제 를 보고 많은 동료 들 이 멍청 하 다 고 믿 습 니 다.평소에 우리 의 방법 은 대부분 아래 의 조작 입 니 다.
@Component
public class People{
@Autowired
private Man man;
}
여기 서 만약 에 Man 이 단일 사례 라면 이런 표기 법 은 문제 가 없 지만 Man 이 원형 이 라면 문제 가 있 을 수 있 습 니까?오류 실례 시범
여기에 원형(생명주기 프로 토 타 입)클래스 가 있 습 니 다.
package com.example.myDemo.component;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope(value = "prototype")
public class Man {
public void eat() {
System.out.println("I like beef");
}
}
단일 예(수명 주 기 는 singleton)의 클래스 가 있 습 니 다.
package com.example.myDemo.component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component;
@Component
public class Woman {
// , Man @Autowired
private Man man;
public void eat() {
System.out.println("man:"+man);
System.out.println("I like fruits");
}
}
다음은 테스트 방법 을 보고,
package com.example.myDemo;
import com.example.myDemo.component.MyFactoryBean;
import com.example.myDemo.component.Woman;
import com.example.myDemo.po.Student;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.ApplicationContext;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class MyDemoApplication {
public static void main(String[] args) {
ApplicationContext ac=SpringApplication.run(MyDemoApplication.class, args);
Woman woman=(Woman)ac.getBean("woman");
for(int i=0;i<5;i++){
woman.eat();
}
}
}
테스트 결 과 를 보면,위의 결 과 는 Woman 의 man 이 단일 한 것 으로 나 타 났 다.5 번 의 순환 인쇄 결과 가 같은 대상 이기 때문에 무슨 일이 일 어 났 는 지,
Woman 은 하나의 예 입 니 다.Man 은 원형 입 니 다.우 리 는 일반적인@Autowired 주 해 를 사용 하여 같은 인 스 턴 스 를 주입 합 니 다.여기 서 왜 Man 이 하나의 대상 인지 생각 합 니 다.Woman 은 하나의 예 입 니 다.이 는 전체 spring 용기 에 하나의 인 스 턴 스 만 있 고 속성 을 주입 할 때 한 번 만 주입 하 는 것 을 의미 합 니 다.그래서 그 중에서 Man 속성 도 하나의 인 스 턴 스 만 있 을 수 있 습 니 다.위의 그림 의 결과 가 나 오 는 것 도 이상 하지 않다.
현재 이러한 수요 가 있 습 니 다.단일 bean 에 원형 bean 을 주입 하려 면 어떻게 이런 수 요 를 실현 해 야 합 니까?
응용 프로그램 ContextAware 인터페이스 구현
응용 프로그램 ContextAware 인 터 페 이 스 는 spring 이 제공 하 는 확장 점 이라는 것 을 잘 알 고 있 습 니 다.이 인 터 페 이 스 를 실현 하 는 클래스 는 응용 프로그램 Context 를 얻 을 수 있 습 니 다.
Woamn 클래스 는 아래 모양 으로 바 꿔 주세요.
package com.example.myDemo.component;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class Woman implements ApplicationContextAware {
private Man man;
private ApplicationContext ac;
public void eat() {
this.man = (Man) ac.getBean("man");
System.out.println("man:" + man);
System.out.println("I like fruits");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ac = applicationContext;
}
}
Woman 은 Application ContextAware 인 터 페 이 스 를 실현 하고 Applicaiton Context 대상 을 주입 한 다음 eat()방법 에서 AppicationContext 를 통 해 Man 의 인 스 턴 스 를 얻어 테스트 결 과 를 본다.man 속성 은 여러 가지 예 를 볼 수 있 습 니 다.즉,원형 모델 에 부합 되 는 정의 입 니 다.
왜 이런 방식 을 채택 하면 원형 bean 을 주입 하 는 목적 을 달성 할 수 있 는 지 생각해 보 자.
eat()방법 에 서 는 applicationContext 의 getBean 방법 으로 Man,eat()방법 을 실행 할 때마다 getBean 방법 을 호출 합 니 다.getbean 방법 은 실행 할 때 Man 의 생명 주 기 를 판단 합 니 다.원형(prototype)이 라면 사용 할 때마다 Man 을 다시 예화 하기 때문에 상기 결과 가 나 옵 니 다.
이 방법 은 spring 과 의 결합 도가 너무 높 아 시스템 의 결합 도 를 낮 추 는 요구 에 부합 되 지 않 는 다 는 단점 이 있다.
lookup method
spring 도 하나의 예 bean 에 프로 토 타 입 bean 을 주입 하 는 상황 을 고려 하여@Lookup 주 해 를 제공 합 니 다.XML 설정 방식 에 서 는
Woman 클래스 수정 은 다음 과 같 습 니 다.
package com.example.myDemo.component;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class Woman {
private Man man;
public void eat() {
this.man = createMan();
System.out.println("man:" + man);
System.out.println("I like fruits");
}
@Lookup
public Man createMan(){
return null;
}
}
테스트 결 과 를 보면,위의 그림 에 따 르 면 man 은 여러 가지 예 입 니 다.즉,하나의 bean 에 원형 bean 을 주입 한 것 입 니 다.그 역할 은@Lookup 주석 입 니 다.
@Lookup 주 해 를 통 해 원형 bean 을 주입 하 는 목적 을 완 성 했 습 니 다.질문 을 남 겨 주세요.spring 은 어떻게 했 습 니까?
lookup 메 서 드 서명
@Lookup 주석 이나
public|protected [abstract] return-type methodName(no-argments)
4.567917.방법 은 Public 일 수도 있 고 proctected 일 수도 있다4.567917.방법 은 추상 적일 수도 있 고 비 추상 적일 수도 있다
총결산
단일 bean 에 원형 bean 을 주입 하 는 방식 을 공 유 했 습 니 다.lookup 을 사용 하 는 방식 이 더 간결 합 니 다.
이것 은 또 하나의 시험 문제 일 수도 있 습 니 다.여러분,주의 하 세 요.lookup 의 원 리 는 다음 에 공유 하 겠 습 니 다.주목 해 주세요.
여기 서 spring 에 하나의 사례 bean 에 비 사례 bean 을 주입 하 는 글 을 소개 합 니 다.더 많은 관련 spring 에 비 사례 bean 을 주입 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.