spring 에서 하나의 예 bean 에 비 단일 예 bean 을 주입 하 는 방법 에 대한 상세 한 설명

6966 단어 spring주입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.방법 은 추상 적일 수도 있 고 비 추상 적일 수도 있다
  • 방법의 반환 값 은 주입 할 유형 이 고 여 기 는 prototype 형식의 클래스 입 니 다
  • 방법 에 참여 하지 않 았 습 니 다
  • 방법 체 는 비어 있 을 수 있다.구체 적 인 반환 값 은 null 또는 그 어떠한 유형 일 수 있 으 며 결과 에 영향 을 주지 않 습 니 다.
    총결산
    단일 bean 에 원형 bean 을 주입 하 는 방식 을 공 유 했 습 니 다.lookup 을 사용 하 는 방식 이 더 간결 합 니 다.
    이것 은 또 하나의 시험 문제 일 수도 있 습 니 다.여러분,주의 하 세 요.lookup 의 원 리 는 다음 에 공유 하 겠 습 니 다.주목 해 주세요.
    여기 서 spring 에 하나의 사례 bean 에 비 사례 bean 을 주입 하 는 글 을 소개 합 니 다.더 많은 관련 spring 에 비 사례 bean 을 주입 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기