spring 소스 학습 노트 - 초기 화 (6) - 완성 및 이상 처리

6789 단어 Spring
전환 하 다http://www.sandzhang.com/blog/2011/04/08/spring-study-notes-initialization-6/
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();
  • 1 - 5 줄 은 conversionService 라 고 정의 되 고 ConversionService 라 는 bean 이 정의 되면 beanFactory 의 conversionService 속성 으로 설정 합 니 다.이것 은 주로 데이터 전환 서 비 스 를 제공 하 는 데 쓰 인 다
  • .
  • 폐기 전 prepareBeanFactory () 에서 생 성 된 임시 ClassLoader
  • freeze Configuration () 의 코드 는 다음 과 같다.
  • this.configurationFrozen = true;
    synchronized (this.beanDefinitionMap) {
        this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);
    }
  • 이 방법 은 bean 정의 등 설정 을 대표 하여 캐 시 할 수 있 습 니 다. 더 이상 수정 할 곳 이 없습니다
  • 마지막 줄 은 불 러 오 는 모든 지연 되 지 않 은 단일 bean 을 초기 화 하 는 것 입 니 다. 이 방법의 코드 를 보 겠 습 니 다.
  • 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);
                }
            }
        }
    }
  • 먼저 한 줄 의 info 급 로그 다음 에 대상 beanDefinitionMap 의 동기 화 에서 모든 bean 의 name 을 각각 초기 화 한 다음 에 bean 정의 정보 대상 bd 를 얻 은 다음 에 판단 합 니 다. 여 기 는 추상 적 이지 않 은 bean (추상 적 인 bean 은 정의 설정 등 정 보 를 계승 하 는 데 사용 되 는 초기 화 할 수 없습니다), 단일 예,지연 되 지 않 은 bean 을 처리 하여 Factory Bean 이 라면 아래 처 리 를 하고 getBean (beanName) 을 직접 호출 하지 않 으 면 이 bean 을 초기 화 합 니 다. 이 방법 에 대해 서 는 BeanFactory 의 단독 분석 에 넣 는 것 이 좋 습 니 다.Factory Bean 의 획득 에 대해 서 는 beanname 앞 에 & 를 추가 한 다음 에 SmartFactory Bean 인지 아 닌 지 를 판단 하고 초기 화 (Eager Init) 를 원 합 니 다. getBean (bean Name) 을 호출 하 는 것 이 라면 공장 의 getObject 를 처음 호출 할 때 초기 화 되 어야 합 니 다. 이 중간 에 AccessController. do Privileged 의 운용 에 대해 잘 모 르 겠 습 니 다.나중에 분석 해 봐. 왜 여기 서 이 걸 사용 해 야 하 는 지 모 르 겠 어
  • 2. 마지막 처 리 는 finish Refresh () 방법 입 니 다. 코드 는 다음 과 같 습 니 다.
    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 를 초기 화 하 는 데 쓰 인 다
  • 사용자 가 lifecy cleProcessor 형식 이 lifecy cleProcessor 라 는 LocalBean 을 정의 하면 현재 applicationContext 의 lifecy cleProcessor 속성
  • 에 값 을 부여 합 니 다.
  • 사용자 가 정의 하지 않 으 면 기본 수명 주기 관리자 Default LifecycleProcessor 를 초기 화하 고 단일 bean 을 등록 하 며 lifecy processor 속성
  • 에 값 을 부여 합 니 다.
    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 의 기본 초기 화 에 관 한 과 차 는 분석 이 끝 났 습 니 다. 중간 에 많은 문제 에 부 딪 혔 고 상세 한 연구 가 필요 한 부분 도 많 습 니 다. 다음은 메 모 를 열거 하고 그 다음 에 하나씩 분석 하 겠 습 니 다.
  • bean 정의 로드
  • bean 의 초기 화
  • BeanFactory 의 핵심 방법
  • BeanFactory 와 ApplictionContext 의 관계 및 각자 의 계승 구조
  • 확장 점 BeanFactory PostProcessor 및 BeanPostProcessor
  • 이벤트 모니터 어 플 리 케 이 션 Listener
  • 정보 관리자 MessageSource
  • 속성 편집기 PropertyEditor
  • 라 이 프 사이클 관리자 LifecycleProcessor
  • 로드 타임 위 버, MergedBean DefinitionPostProcessor, AccessController. do Privileged 등 몇 가지 세부 사항 이 있다
  • 좋은 웹페이지 즐겨찾기