spring 소스 코드 (1) 메 인 프로 세 스

6066 단어 원본 코드 읽 기
그 전에 spring 소스 코드 를 보고 일부분 만 보고 필 기 를 했 습 니 다. 많은 절 차 를 정리 하지 못 했 습 니 다. 그래서 오늘 저 는 전에 본 spring 로 딩 의 주류 과정 을 정리 하고 편리 한 후에 메 인 절 차 를 바탕 으로 각 분기 기능 의 확장 을 했 습 니 다.
봄 은 어디서부터 봐 야 할 지.
1. 당신 이 알 고 싶 은 기능 에 착안 하여 debug 는 한 걸음 한 걸음 내 려 갈 수 있 습 니 다. 2. bean 이 만 든 주류 과정 에 따라 볼 수 있 고 개인 적 으로 추천 할 수 있 습 니 다. (먼저 메 인 절 차 를 익 힌 다음 에 기능 에 따라 손 쉽게 얻 을 수 있 습 니 다)
spring 의 메 인 프로 세 스
컨 텍스트 용기 만 들 기
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(“spring.xml”);

불 러 올 로 컬 설정 설정
setConfigLocations(configLocations);

새로 고침 절차
refresh()

컨 텍스트 의 새로 고침 을 준비 하고 용기 시작 시간 을 설정 하 며 활성 플래그 위 치 를 true 로 설정 하고 속성 자원 초기 화 (구현 되 지 않 음, 사용자 정의 용기 구현 가능), 속성 검증 을 실행 합 니 다.
prepareRefresh()

내부 bean 공장 을 새로 고치 고 configLocations 설정 파일 에서 beandefinition 을 beanfactory 로 불 러 옵 니 다. dom 을 통 해 요 소 를 분석 하고 사용자 정의 태그 인지 판단 합 니 다. 사용자 정의 해상도 기 를 호출 하면 태그 이름 에 따라 해당 하 는 네 임 스페이스 프로 세 서 를 가 져 오고 자신 이 등록 한 해상도 기 를 호출 하여 beandefinition 을 얻 습 니 다.
obtainFreshBeanFactory()

공장 의 표준 상하 문 특징, 클래스 캐리어, 백업 프로세서 등 을 설정 합 니 다.
prepareBeanFactory(beanFactory);

표준 초기 화 후 내부 bean 공장 을 수정 할 수 있 습 니 다. 예 를 들 어 beandefinition 에 불 러 옵 니 다. 그러나 bean 이 예화 되 기 전에 사용자 정의 용기 에 사용자 정의 beanpostprocess 를 등록 할 수 있 습 니 다.
postProcessBeanFactory(beanFactory);

beanfactorypostprocess 와 beandefinititionregistry postprocess 의 postprocess * () 방법 을 호출 합 니 다. 예 를 들 어 Property Place holder Configurer 의 process Properties 방법 은 하위 클래스 에서 도구 류 로 properties 파일 을 불 러 올 수 있 습 니 다.
invokeBeanFactoryPostProcessors(beanFactory);

bean 이 만 든 beanpostprocess 를 등록 하고 bean 공장 에 가입 합 니 다. (실 현 된 인터페이스 에 따라 정렬 하여 등록 합 니 다)
registerBeanPostProcessors(beanFactory);

메시지 자원 초기 화
initMessageSource();

멀티캐스트 초기 화, 없 으 면 생 성
initApplicationEventMulticaster();

템 플 릿 방법, 하위 클래스 에 대한 사용자 정의 새로 고침
onRefresh();

모니터 를 구성 기 에 등록 하면 모니터 는 특정한 사건 을 처리 하고 모니터 를 호출 할 때마다 온라인 스 레 드 에서 새로운 스 레 드 를 지원 합 니 다.
registerListeners();

게 으 르 지 않 은 모든 로 딩 의 단일 예 bean 을 예화 합 니 다.
finishBeanFactoryInitialization(beanFactory);

라 이 프 사이클 프로 세 서 를 초기 화하 고 새로 고침 방법 을 사용 하여 용기 가 새로 고침 되 었 음 을 발표 합 니 다.
finishRefresh();

Spring 핵심 에서 흔히 볼 수 있 는 자성 캐 시 를 리 셋 합 니 다. 단일 bean 의 메타 데이터 에 사용 할 필요 가 없 을 수도 있 기 때 문 입 니 다.
resetCommonCaches();

spring 생 성 bean 의 생명주기
게 으 르 지 않 은 모든 로 딩 의 단일 예 bean 을 예화 합 니 다.
finishBeanFactoryInitialization(beanFactory);

모든 단 례 를 실례 화하 다
beanFactory.preInstantiateSingletons();

bean 인 스 턴 스 를 가 져 옵 니 다. 공장 bean 을 가 져 올 때 & 접 두 사 를 추가 해 야 합 니 다.
getBean(beanName);
doGetBean(name, null, null, false);

bean 인 스 턴 스 생 성
createBean(beanName, mbd, args);

프 록 시 클래스 를 만 들 까요?피 에이전트 의 목표 클래스 가 인 터 페 이 스 를 실 현 했 는 지, 최적화 되 었 는 지 에 따라 어떤 프 록 시 를 사용 하 는 지 판단 합 니 다 (jdk 획득 cglib)
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

bean 만 들 기
doCreateBean(beanName, mbdToUse, args);

bean 인 스 턴 스 를 만 드 는 것 은 공장 방법 으로 만 들 수도 있 고 자동 구조 기 반사 구축 일 수도 있 습 니 다.
createBeanInstance(beanName, mbd, args);

속성 할당
populateBean(beanName, mbd, instanceWrapper);

bean 초기 화
initializeBean(beanName, exposedObject, mbd);

BeanNameAware, BeanClassLoaderAware, BeanFactory Aware 를 실현 하 는 set 방법 호출
invokeAwareMethods(beanName, bean);

beanpostprocess 의 post Process Before Initialization 방법 을 호출 합 니 다.
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

클 라 이언 트 자체 의 초기 화 방법 을 호출 합 니 다. InitialingBean 인터페이스 가 실현 되면 after PropertiesSet () 을 먼저 호출 합 니 다.
invokeInitMethods(beanName, wrappedBean, mbd);

beanpostprocess 의 postprocessBeforeInitialization 방법 으로 postprocessAfterInitialization (result, beanName);
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

spring 로 딩 프로필 구축 beandefinition
beandefinition 로드 프로 세 스
obtainFreshBeanFactory();

빈 팩 토 리 를 새로 고치 고 빈 팩 토 리 를 만 들 필요 가 없습니다.
refreshBeanFactory();

로 딩 beandefinition
loadBeanDefinitions(beanFactory);

beandefinitionreader 에 따라 beandefinition 을 불 러 옵 니 다.
loadBeanDefinitions(beanDefinitionReader);

설정 파일 에서 beandefinition 불 러 오기
reader.loadBeanDefinitions(configLocations);

리 소스 자원 불 러 오기
loadBeanDefinitions(location, null);

자원 을 컴 파일 하 다.
loadBeanDefinitions(resource);

자원 을 흐름 의 형식 으로 바꾸다.
loadBeanDefinitions(new EncodedResource(resource));

흐름 과 자원 에 따라 dom 는 document 대상 으로 해석 합 니 다.
doLoadBeanDefinitions(inputSource, encodedResource.getResource());

documentReader 등록 beandefinition
registerBeanDefinitions(doc, resource);

dom 대상 에 따라 루트 요소 요소 가 져 오기
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

분석 요소
doRegisterBeanDefinitions(root);

다양한 종류의 요소 탭 을 분석 합 니 다. 기본 탭 과 사용자 정의 탭 으로 나 눌 수 있 습 니 다.
parseBeanDefinitions(root, this.delegate);

사용자 정의 탭 분석 (bean, alias, import 제외)
delegate.parseCustomElement(root);

요소 에 따라 대응 하 는 NamespaceHandler 네 임 스페이스 프로 세 서 를 가 져 오고 분석 합 니 다.
handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));

좋은 웹페이지 즐겨찾기