>  기사  >  Java  >  Spring이 객체를 주입하는 방법과 Bean 생성 프로세스 분석

Spring이 객체를 주입하는 방법과 Bean 생성 프로세스 분석

angryTom
angryTom앞으로
2019-11-28 17:47:533091검색

Spring이 객체를 주입하는 방법과 Bean 생성 프로세스 분석

먼저 대략적인 구현을 알아야 합니다

● 이 주입 프로세스는 BeanPostProcessor에서 구현되어야 합니다.

●spring은 beanFactory.getBean에서 Bean을 인스턴스화합니다. 즉, 지연 로딩

●에 따르면 두 번째, 즉, 모든 BeanPostProcessor는 getBean

● 두 번째 기사에서 BeanFactory의 새로 고침 프로세스는 BeanPostProcessor만 등록하고 실제로는 getBean 메소드

에서 실행된다고 언급했습니다. (추천 영상: java 비디오 튜토리얼 )

MergedBeanDefinitionPostProcessor도 BeanPostProcessor의 일종입니다. BeanPostProcessor의 기본 생명주기 함수를 대체하여 새로운 생명주기 함수를 생성합니다. 이렇게 살펴보겠습니다.

for (BeanPostProcessor bp : getBeanPostProcessors()) {
    if (bp instanceof MergedBeanDefinitionPostProcessor) {
        MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
        bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
    }
}

비BeanFactoryProcess에서 Bean 정의를 수정할 수 있습니다.

InstantiationAwareBeanPostProcessor는 일종의 BeanPostProcessor이기도 합니다. 이는 또한 속성 값을 속성 개체에 주입할 수 있는 수명 주기 함수를 재정의합니다.

@Autowired 정의 로딩 프로세스

먼저 살펴보지 말자 빈 생성 프로세스는 MergedBeanDefinitionPostProcessor의 구현 하위 클래스에 따라 다릅니다. 다음은 이름 추측입니다.

AutowiredAnnotationBeanPostProcessor가 이를 수행해야 하므로 postProcessMergedBeanDefinition의 코드를 직접 볼 수 있습니다.

AutowiredAnnotationBeanPostProcessor의 메서드입니다.

메서드 호출에 따라 buildAutowiringMetadata가 이러한 주석이 실제로 발견되는 위치임을 알 수 있습니다. 마지막으로 checkConfigMembers는 Member를 Bean 정의에 등록합니다. 이를 찾는 방법을 알고 싶은 독자는 소스 코드를 직접 확인할 수 있습니다.

여기에서는 Bean 정의에 Member만 등록하고, Bean을 채우는 과정에서 실제 인스턴스화가 발생하므로 주입 시기를 알아보기 위해 아래에서 Bean 생성 프로세스에 대해 이야기해 보겠습니다.

Bean 생성 과정

앞서 언급했듯이 Spring은 getBean 과정에서 Bean을 생성합니다. Bean 생성은 여러 단계로 나누어집니다.

1. Bean 정의를 가져옵니다

2. 라이프사이클 함수 실행(이전)

4. 의존성 생성

5. 빈 채우기

6. 라이프사이클 함수 실행(이후)

입구는 BeanFactory.getBean, BeanFactory 구현 클래스는 DefaultListableBeanFactory . BeanFactory의 새로 고침 과정에서 찾을 수 있습니다

소스 코드에 따르면 Bean이 아직 존재하지 않으면 Bean 생성 프로세스가 실행됩니다.

이 소스 코드에서 Bean 정의를 가져옵니다

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

따라서 Bean 정의에 따라 종속성을 검색하고 Bean을 생성하면 Bean이 재귀적으로 생성되는 것을 볼 수 있습니다

String[] dependsOn = mbd.getDependsOn();
for (String dep : dependsOn) {
    getBean(dep);
}

그러면 Bean이 생성됩니다

if (mbd.isSingleton()) {
    createBean(beanName, mbd, args);
}
// 真正的执行在 doCreateBean 过程中
Object beanInstance = doCreateBean(beanName, mbdToUse, args);

Bean 생성 첫 번째 단계는 New Bean

if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
}

생성입니다. bean 두 번째 단계는 MergedBeanDefinitionPostProcessor를 포함한 모든 프로세서를 실행하는 것이므로 이 단계에서는 주입 옵션을 등록합니다

applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

빈 생성 세 번째 단계는 빈을 채우는 것입니다. 여기에서 @Autowired 주입이 완료됩니다

populateBean(beanName, mbd, instanceWrapper);

최종 처리는 다음과 같습니다. AutowiredAnnotationBeanPostProcessor의 postProcessPropertyValues ​​​​함수

metadata.inject(bean, beanName, pvs);

이전에 의존성을 얻어서 버려졌기 때문에 컨테이너에 들어왔으니 리플렉션을 이용해 직접 작성하면 됩니다

네번째 단계는 빈을 초기화하는 것입니다. 여기에는 메소드 주입이 원래 Bean 초기화 프로세스 중에 발생했으며 BeanPostProcessor의 사전 사후 라이프사이클, 초기화 메소드 등을 포함하는 라이프사이클 기능이 실행되었습니다. 설명: AutowiredAnnotationBeanPostProcessor는 둘 다입니다. MergedBeanDefinitionPostProcessor 및 InstantiationAwareBeanPostProcessor

이 기사는 PHP 중국어 웹사이트인

java tutorial

칼럼에서 가져온 것입니다. 학습을 환영합니다!

위 내용은 Spring이 객체를 주입하는 방법과 Bean 생성 프로세스 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제