spring 소스 학습 노트 - 초기 화 (6) - 완성 및 이상 처리
6789 단어 Spring
refresh () 방법 은 전편 에서 MessageSource 와 시간 모니터 등 초기 화 처 리 를 보고 이 편 을 계속 내 려 다 보 았 다.
주: refresh () 의 코드 는 다시 열거 하지 않 습 니 다. spring 소스 코드 에서 AbstractApplication Context 류 를 보십시오.
1. finishBeanFactory Initialization (beanFactory) 이 방법 은 BeanFactory 초기 화 를 완성 합 니 다. 주로 하 는 일 은 이전에 처 리 했 던 특수 bean 을 제외 한 모든 단일 bean 을 초기 화 하 는 것 입 니 다. 코드 는 다음 과 같 습 니 다.
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}
beanFactory.setTempClassLoader(null);
beanFactory.freezeConfiguration();
beanFactory.preInstantiateSingletons();
this.configurationFrozen = true;
synchronized (this.beanDefinitionMap) {
this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);
}
if (this.logger.isInfoEnabled()) {
this.logger.info("Pre-instantiating singletons in " + this);
}
synchronized (this.beanDefinitionMap) {
for (String beanName : this.beanDefinitionNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
final FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged(new PrivilegedAction() {
public Boolean run() {
return ((SmartFactoryBean) factory).isEagerInit();
}
}, getAccessControlContext());
}
else {
isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean) factory).isEagerInit();
}
if (isEagerInit) {
getBean(beanName);
}
}
else {
getBean(beanName);
}
}
}
}
initLifecycleProcessor();
getLifecycleProcessor().onRefresh();
publishEvent(new ContextRefreshedEvent(this));
1. initLifecycleProcessor () 방법의 코드 를 먼저 본다.
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
this.lifecycleProcessor =
beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
if (logger.isDebugEnabled()) {
logger.debug("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
}
}
else {
DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
defaultProcessor.setBeanFactory(beanFactory);
this.lifecycleProcessor = defaultProcessor;
beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate LifecycleProcessor with name '" +
LIFECYCLE_PROCESSOR_BEAN_NAME +
"': using default [" + this.lifecycleProcessor + "]");
}
}
이 방법 은 주로 생명주기 관리자 LifecycleProcessor 를 초기 화 하 는 데 쓰 인 다
2. initLifecycleProcessor () 방법 다음 에는 라 이 프 사이클 관리자 에 대한 트리거 입 니 다. LifecycleProcessor 는 두 개의 트리거 점 인 onRefresh () 와 onClose () 가 있 습 니 다. 현재 refresh 에 있 기 때문에 onRefresh () 방법 을 호출 합 니 다.
3. PublishEvent () 방법 을 호출 하여 ContextRefreshedEvent 이 벤트 를 발표 합 니 다. PublishEvent () 의 코드 도 간단하게 소개 하지 않 습 니 다. 바로 현재 컨 텍스트 와 parent 의 ApplicationEventMulticaster 의 multicastEvent () 방법 을 호출 하여 이벤트 처리 모듈 을 분석 할 때 상세 하 게 분석 하 는 것 입 니 다.
3. 마지막 으로 전체 try 코드 블록 에서 이상 한 처 리 를 하면 두 가지 방법 으로 호출 되 는 것 을 볼 수 있 습 니 다.
1. destroyBeans () 코드 는 매우 간단 하 다. 바로 BeanFactory 의 destroy Singletons () 방법 으로 모든 단일 bean 을 없 애 는 것 이다.아니면 BeanFactory 전문 분석 에 넣 지 않 겠 습 니까?
2. cancelRefresh () 이 방법 코드 를 보 세 요:
synchronized (this.activeMonitor) {
this.active = false;
}
동기 화 된 상태 값 을 설정 하 는 것 일 뿐 입 니 다. 하지만 작은 디 테 일 이 있 습 니 다. 이 방법 은 Abstract Refreshable Application Context 와 GenericApplication Context 두 개의 하위 클래스 에서 재 작성 되 었 습 니 다. 그러나 아주 간단 합 니 다. 바로 beanFactory. setSerializationId (null) 를 추가 한 다음 에 위의 슈퍼 방법 으로 상 태 를 수정 하 는 것 입 니 다.
Application Context 의 기본 초기 화 에 관 한 과 차 는 분석 이 끝 났 습 니 다. 중간 에 많은 문제 에 부 딪 혔 고 상세 한 연구 가 필요 한 부분 도 많 습 니 다. 다음은 메 모 를 열거 하고 그 다음 에 하나씩 분석 하 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.