spring 고 품질 시리즈 - IOC (3)

두 번 째 편 에서 우리 가 남 긴 의문: 이 글 을 정리 하 는 데 아직도 의문 이 남아 있다. 후기 에 필 자 는 연구 과정 에서 해설 을 할 것 이다. 1. spring. xml 이 부족 하면 어느 단계 에 2. @ configuration 을 불 러 올 것 인가? 어느 단계 에 동적 대 리 를 시작 할 것 인가?
  • beanMethods 집합 중의 @ Bean 방법 4 를 언제 처리 합 니까? @ propertySource 를 어떻게 적용 합 니까
  • 먼저 네 번 째 점 인 @ propertySource 는 @ ConfigurationProperties 와 협조 해 야 한다 고 밝 혔 습 니 다. 이 주 해 는 속성 접 두 사 를 가리 킬 수 있 습 니 다. 이 주 해 를 통 해서 만 propertySource
  • 를 해석 할 수 있 습 니 다.
    관건 은 ConfigurationClassBeanDefinitionReader 의 방법 loadBeanDefinitions 이 고 이 방법 은 ConfigurationClassPostProcessor 의 방법 processConfigBeanDefinitions 에서 구체 적 으로 다음 과 같다.
    private void loadBeanDefinitionsForConfigurationClass(ConfigurationClass configClass,
                TrackedConditionEvaluator trackedConditionEvaluator) {
           @conditional           beanDefinition
            if (trackedConditionEvaluator.shouldSkip(configClass)) {
                String beanName = configClass.getBeanName();
                if (StringUtils.hasLength(beanName) && this.registry.containsBeanDefinition(beanName)) {
                    this.registry.removeBeanDefinition(beanName);
                }
      @Import      ImportBeanDefinitionRegistrar ImportSelector         
    this.importRegistry.removeImportingClass(configClass.getMetadata().getClassName());
                return;
            }
          @Import     bean  ImportSelector      bean
            if (configClass.isImported()) {
                registerBeanDefinitionForImportedConfigurationClass(configClass);
            }
      @Bean
            for (BeanMethod beanMethod : configClass.getBeanMethods()) {
                loadBeanDefinitionsForBeanMethod(beanMethod);
            }
            
    
      spring.xml  @ImportSource
    loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
      @ImportBeanDefinitionRegistrar    
    loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
        }
    

    처리 @ Conditional
  • 0. 우선 캐 시 에서 현재 configClass 를 건 너 뛸 수 있 는 지 여 부 를 가 져 옵 니 다. 가능 하 다 면 이전에 만 든 beanDefinition 을 삭제 하고 @ Import ImportBeanDefinition Registrar 를 처리 할 때 저장 할 beanDefinition
  • 을 삭제 합 니 다.
  • 1. @ Conditional 주석 에서 value 는 우리 가 사용자 정의 condition 인터페이스의 실현 클래스 입 니 다. 실현 클래스 에 따라 현재 bean 이 load
  • 를 원 하 는 지 판단 합 니 다.
  • 2. 캐 시 에 현재 configClass 가 가 져 올 지 여 부 를 판단 하지 않 았 다 면, 그의 클래스 를 가 져 올 때 skipp 가 필요 하 다 면, skipp 가 필요 할 것 입 니 다. 이것 도 없 으 면 현재 configclass 클래스 에 @ conditional 주석 이 있 는 지 확인 하고, 있 으 면 현재 생 성 이 필요 한 지 판단 하 십시오.
  • 3. imports 집합 은 spring 이 ImportSelector 를 처리 할 때 가 져 올 클래스 를 가 져 오 면 이 집합 에 먼저 넣 습 니 다
  • 처리 @ Import
  • 1. 현재 configClass 가 가 져 왔 는 지 먼저 판단 합 니 다
  • 2. 이 configclass 를 처리 하면 beanFactory 에 beanDefinition
  • 을 등록 하 는 것 입 니 다.
  • 3. 일반적으로 우리 가 가 져 오 는 것 은 일반적인 bean 이거 나 ImportSelector 이거 나 ImportBean Definition Registrar 이 며, ImportSelector 는 최종 적 으로 일반 bean 인지 ImportBean Definition Registrar 인지 여 부 를 볼 수 있 습 니 다. 이 두 가 지 는 모두 집합 에 저장 되 어 서로 다른 시간 에 호출
  • 합 니 다.
    처리 @ bean
  • 1. 먼저 @ bean 의 방법 이 있 는 지 판단 하고 있 으 면 진정한 주입
  • 2. 그리고 현재 configclass 에 conditional 주해 가 있 는 지, 있 으 면 주입 할 수 있 는 지 판단 합 니 다
  • 3. @ Bean 주해 가 있 는 지 판단
  • 4. 별명 이 있 는 지 확인 할 수 있다 면 별명 과 beanName 의 맵 을 만 듭 니 다
  • 5. @ bean 방법 이 재 작성 되 었 는 지 판단 하고 재 작성 하면 bean 을 계속 생 성 할 수 있 는 지 판단 합 니 다
  • 6. 상기 재 작성 할 수 없 는 것 은 configclass 가 ScannedGenericBean Definition, 즉 ASM Reader 에 읽 어 주 는 것 입 니 다. Role 은 ROLE 보다 큽 니 다.응용 프로그램, beanFactory 는 DefaultListableBeanFactory 에 속 하고 allowBeanDefinitionOverriding 는 false
  • 7. ConfigurationClassBeanDefinition 의 리 소스 (class 파일 위치) 와 source (방법의 메타 데이터)
  • 를 설정 합 니 다.
  • 8. 그리고 방법 에 따라 static 설정 factory BeanName 과 factory MethodName 을 설정 합 니 다. 정적 인 factory BeanName 이면 className 입 니 다. 그렇지 않 으 면 beanName - 9 입 니 다. setAutowireMode 설정 (기본적으로 구조 함수 로 도 name 과 type 인지 지정 할 수 있 습 니 다. 이 두 개 만 지정 할 수 있 습 니 다) 또 하나의 속성 이 있 습 니 다 SKIPREQUIRED_CHECK_ATTRIBUTE 대 표 는 @ Conditional 검 측 이 필요 없 이 바로 건 너 뛰 기 (문제 가 있 을 수 있 습 니 다) - 10. ConfigurationClassBeanDefinition 의 각 속성 보완
  • 초기 화 방법 과 destroy 방법 을 등록 하고 proxy 인지 확인 합 니 다. 현재 beanName 과 proxy 대상 을 연결 해 야 한다 면 변 화 된 beanName 과 원본 beanDefinition 도 beanFactory 에 등록 합 니 다

  • 처리 @ ImportSource --- spring.xml
  • 1. 현재 reader 의 class 유형 이 BeanDefinitionReader 인지 먼저 판단 합 니 다. 자원 이 groovy 인지 xml 인지 판단 하 는 경우
  • 2. 캐 시 reader InstanceCache 에서 reader 의 class 형식 에 따라 구체 적 인 인 인 스 턴 스 를 가 져 옵 니 다. 존재 하지 않 으 면 캐 시 를 만 들 고 넣 습 니 다. - 3. xml 를 불 러 오 는 방법 에 들 어가 면 AbstractBean DefinitionReader 에 들 어 가 는 loadBean Definitions 방법
  • 을 받 습 니 다.
  • 4. resourceLoader 가 ResourcePatternResolver 에 속 하 는 지 판단 하여 그 방법 을 호출 하 는 지 판단 합 니 다
  • 5. 최종 적 으로 XmlBeanDefinitionReader 의 loadBeanDefinitions
  • 를 호출 합 니 다.
  • 6. loadBeanDefinitions 의 논 리 는 인 코딩 된 리 소스 를 threadLocal 의 set 에 저장 하여 중복 로 딩 여 부 를 검사 하 는 것 입 니 다. 만약 에 이상 을 던 지지 않 으 면 이 xml 에 인 코딩 이 필요 한 지 판단 하고 필요 하 다 면 인 코딩 속성 을 설정 한 다음 에 인 코딩 된 리 소스 의 source 의 input Stream 에 인 코딩 된 속성 을 부여 하 는 것 입 니 다.그리고 진정한 해석 방법 doLoadBeanDefinitions
  • 를 호출 합 니 다.
  • 7. doLoadBeanDefinitions 는 xml 를 분석 한 다음 에 beandefinition
  • 을 등록 하 는 것 이다.
    처리 @ ImportBeanDefinitionRegistrar
    호출 된 핵심 논 리 는 다음 과 같다.
        public static void register(BeanDefinitionRegistry registry, String... packageNames) {
     1. BEAN=AutoConfigurationPackages.class.getName()
      //   AutoConfigurationPackages    ,      beanDefinition   constructorArguments    packageNames,         bean
            if (registry.containsBeanDefinition(BEAN)) {
                BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN);
                ConstructorArgumentValues constructorArguments = beanDefinition
                        .getConstructorArgumentValues();
                constructorArguments.addIndexedArgumentValue(0,
                        addBasePackages(constructorArguments, packageNames));
            }
            else {
                GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
                beanDefinition.setBeanClass(BasePackages.class);
                beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0,
                        packageNames);
                beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
                registry.registerBeanDefinition(BEAN, beanDefinition);
            }
        }
    
  • 1. 먼저 AutoConfigurationPackages 가 존재 하 는 지 확인 하고, 존재 하면 beanDefinition 의 constructorArguments 에 packageNames 를 추가 하고, 존재 하지 않 으 면 이 bean 을 추가 합 니 다.

  • 1. @ configuration 이 어느 단계 에서 동적 프 록 시 2 를 시 작 했 는 지 의문 이다. property Source 를 어떻게 사용 하 는 지.

    좋은 웹페이지 즐겨찾기