이 개 스프링 소스의 해석

이전 기사는 초기화 방법 새로 고침 라이프 사이클에 관해서

이 새로 고침, 몇 가지 주요 방법에 대한 이야기는 여기에서 설명하는 방법이며, 예를 들어 invokeBeanFactoryPostProcessors의 finishBeanFactoryInitialization에 대한

prepareRefresh (); 

내부 빈 공장을 새로 고치려면 서브 클래스에게 //. 
ConfigurableListableBeanFactory BeanFactory에 obtainFreshBeanFactory = (); 

이러한 맥락에서 사용하기 위해 빈 공장을 준비 //. 
prepareBeanFactory (BeanFactory에);
// 컨텍스트의 서브 클래스에 빈 공장의 후 처리를 할 수 있습니다. 
postProcessBeanFactory (BeanFactory에); 

// 호출 공장 프로세서 맥락에서 콩으로 등록. 
invokeBeanFactoryPostProcessors (BeanFactory에); 

// 절편 콩 생성이 등록 빈 프로세서. 
registerBeanPostProcessors (BeanFactory에); 

//이 문맥 초기화 메시지 소스. 
initMessageSource (); 

//이 문맥 초기화 이벤트 멀티 캐스터. 
initApplicationEventMulticaster (); 

// 초기화 특정 상황에 맞는 서브 클래스에서 다른 특별한 콩. 
onRefresh (); 

// 리스너 콩을 확인하고이를 등록합니다. 
registerListeners ();

// 인스턴스화 나머지 (비 게으른 초기화) 싱글. 
finishBeanFactoryInitialization (BeanFactory에); 

// 마지막 단계 : 이벤트를 해당 게시 할 수 있습니다. 
finishRefresh ();

이 방법의 invokeBeanFactoryPostProcessors의 소스 코드를 먼저 우리의 모습

/ ** 
 * 인스턴스화 등록 된 모든 BeanFactoryPostProcessor를 콩 호출 
 주어진 경우 * 명시 적 질서를 존중. 
 * <P>는 싱글 인스턴스 전에 호출해야합니다. 
 * / 
보호 공극 invokeBeanFactoryPostProcessors (ConfigurableListableBeanFactory의 BeanFactory) { 
   PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors (BeanFactory에, getBeanFactoryPostProcessors ()); 

   한편 검색된 경우 //하는 LoadTimeWeaver 감지 및 직물을 준비 
   // (예 ConfigurationClassPostProcessor 의해 등록 된 @Bean 방법을 통해)  
   {경우 (beanFactory.getTempClassLoader () == 널 && beanFactory.containsBean (LOAD_TIME_WEAVER_BEAN_NAME))
      beanFactory.addBeanPostProcessor (새 LoadTimeWeaverAwareProcessor (BeanFactory에));
      beanFactory.setTempClassLoader (새 ContextTypeMatchClassLoader (beanFactory.getBeanClassLoader ())); 
   } 
}

invokeBeanFactoryPostProcessors 소스 코드를 계속 만 키 코드 여기에 게시

문자열 [] = postProcessorNames 
      beanFactory.getBeanNamesForType (BeanDefinitionRegistryPostProcessor.class 참, 거짓); 
(문자열 ppName : postProcessorNames)에 대한 { 
   경우 (beanFactory.isTypeMatch (ppName, PriorityOrdered.class)) { 
      currentRegistryProcessors.add (beanFactory.getBean (ppName, BeanDefinitionRegistryPostProcessor.class)); 
      processedBeans.add (ppName); 
   } 
} 
sortPostProcessors (currentRegistryProcessors,되는 BeanFactory); 
registryProcessors.addAll (currentRegistryProcessors); 
invokeBeanDefinitionRegistryPostProcessors (currentRegistryProcessors, 레지스트리); 
currentRegistryProcessors.clear ();

beanFactory.getBeanNamesForType (BeanDefinitionRegistryPostProcessor.class, 참, 거짓)을 수행 할;

마지막 문서에 의해 상기 프로세서 중 유형 BeanDefinitionRegistryPostProcessor 종류별이 방법

생성자 AnnotationConfigApplicationContext라는 것을 포함하여 내장 추가하는 일부 클래스를 갖춘이 클래스 내부,
ConfigurationClassPostProcessor 클래스, 또한 공장 내부의 용기에이 시간에, 우리는이 소스 카테고리를 발견했다
공용 클래스 ConfigurationClassPostProcessor 구현 BeanDefinitionRegistryPostProcessor, 
      PriorityOrdered, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware {

분명히이 클래스가 구현하는 인터페이스 BeanDefinitionRegistryPostProcessor, beanFactory.getBeanNamesForType (BeanDefinitionRegistryPostProcessor.class, 참, 거짓)으로,이 방법은이 클래스를 얻을 수 있습니다, 다음 컬렉션 currentRegistryProcessors 안에 넣어 invokeBeanDefinitionRegistryPostProcessors 방법은 수행이 방법의 참조 점에 근원

/ ** 
 * 주어진 BeanDefinitionRegistryPostProcessor 콩을 호출합니다. 
 * / 
개인 정적 무효 invokeBeanDefinitionRegistryPostProcessors ( 
      {컬렉션 포스트 프로세서, BeanDefinitionRegistry에 레지스트리 <? BeanDefinitionRegistryPostProcessor 확장>) 

   (BeanDefinitionRegistryPostProcessor 포스트 프로세서 : 후 - 처리)에 대한 { 
      postProcessor.postProcessBeanDefinitionRegistry (레지스트리); 
   } 
}

ConfigurationClassPostProcessor의 postProcessBeanDefinitionRegistry 방법으로 실행됩니다

/ ** 
 * 레지스트리의 구성 클래스에서 파생 더 bean 정의. 
 * / 
@Override 
공개 무효 postProcessBeanDefinitionRegistry (BeanDefinitionRegistry에 레지스트리) { 
   INT registryId = System.identityHashCode (등록); 
   (this.registriesPostProcessed.contains (registryId가)) {경우 
      새로운 IllegalStateException을 발생 ( 
            + 레지스트리 "postProcessBeanDefinitionRegistry 이미에 대해이 포스트 프로세서 호출"); 
   } 
   경우 (this.factoriesPostProcessed.contains (registryId)) { 
      새로운 IllegalStateException이을 (던져 
            + 레지스트리 "postProcessBeanFactory이 이미에 대해이 포스트 프로세서 호출");
   }
   this.registriesPostProcessed.add (registryId); 

   processConfigBeanDefinitions (레지스트리); 
}

어떤 processConfigBeanDefinitions 방법을 따라 계속

집합 <ConfigurationClass> = alreadyParsed 새로운 HashSet의 <> (configCandidates.size ()); 
{할 
   parser.parse (후보); 
   () parser.validate; 

   집합 <ConfigurationClass> = configClasses 새로운 LinkedHashSet의 <> (parser.getConfigurationClasses ()); 
   configClasses.removeAll (alreadyParsed); 

   // 읽기 모델과 그 내용에 따라 빈 정의를 작성 
   (this.reader == NULL) {경우 
      this.reader 새로운 ConfigurationClassBeanDefinitionReader (= 
            레지스트리, this.sourceExtractor, this.resourceLoader, this.environment, 
            this.importBeanNameGenerator, 파서. getImportRegistry ()); 
   }

이 구문 분석 방법은있는 프로젝트 컨트롤러, 서비스 및 기타 정보 및 분석 프로세스 ImportSelectores, 정보 ImportBeanDefinitionRegistor을 완료하기 위해 추가, 그리고 마지막으로지도에 콩 인스턴스 뒤에 완성이 분석하는 BeanDefinition에있는 매장 정보는 다음을 사용합니다 정보, 오늘은 첫 번째 점에서, 다음 클래스는 콩 인스턴스의 라이프 사이클을 말하기 시작

게시 20 개 원래 기사 · 원 찬양 4 ·은 20000 +를 볼

추천

출처blog.csdn.net/lj872224/article/details/104231284