SpringBoot 원본 학습 시리즈 Http 인 코딩 자동 설정

SpringBoot 원본 학습 시리즈 Http 인 코딩 자동 설정
이전 블 로그 소스 학습 시리즈 의 SpringBoot 자동 설정 (편 1) 에 이 어 본 블 로 그 는 SpringBoot 의 자동 설정 소스 코드 를 계속 따 르 고 있 습 니 다.
ok, 먼저 전편 의 내용 을 복습 하고 앞의 학습 을 통 해 우 리 는 SpringBoot 의 자동 설정 은 주로 선택 기 AutoConfiguration ImportSelector 에 의 해 이 루어 진 다 는 것 을 알 게 되 었 습 니 다. 먼저 선택 기 를 통 해 자동 으로 설 정 된 종 류 를 Spring 용기 에 불 러 옵 니 다.
주의 점:
  • List configurations = this.getCandidateConfigurations(annotationMetadata, attributes); 가 져 온 후보 설정 의 클래스 이름
  • SpringFactoriesLoader 로 더 는 설정 클래스 를 불 러 옵 니 다. 설정 클래스 를 용기 에 불 러 왔 습 니 다. SpringFactoriesLoader 의 loadSpringFactory 방법 은 자동 설정 프로젝트 의 META - INF / spring. factories 설정 파일 을 읽 고 설정 클래스 의 모든 클래스 를 불 러 옵 니 다. 패키지 를 Properties 대상 으로 한 다음 용기 에 불 러 옵 니 다
  • public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
    	/*  spring.factories      Spring  */
         public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
            String factoryClassName = factoryClass.getName();
    
            try {
            // META-INF/spring.factories            Enumeration     
                Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
                ArrayList result = new ArrayList();
    			//      ,              
                while(urls.hasMoreElements()) {
                    URL url = (URL)urls.nextElement();
                    Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
                    String factoryClassNames = properties.getProperty(factoryClassName);
                    result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
                }
    
                return result;
            } catch (IOException var8) {
                throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() + "] factories from location [" + "META-INF/spring.factories" + "]", var8);
            }
        }
    
    

    ok, Springboot 의 자동 설정 류 는 모두 이 가방 에 있 습 니 다. 소스 코드 가 많 기 때문에 본 블 로 그 는 소스 코드 在这里插入图片描述 의 자동 설정 을 간단하게 따 를 뿐 SpringBoot 프레임 워 크 의 중요 한 기능 이 라 고 할 수 있 습 니 다. 그 강력 한 기능 은 여러 설정 류 를 통 해 이 루어 진 것 입 니 다. 이렇게 많은 설정 이 있 을 때SpringBoot 공식 설정 참고:https://docs.spring.io/spring-boot/docs/2.1.10.RELEASE/reference/html/common-application-properties.html
    SpringBoot 의 자동 설정 클래스 가 매우 많 습 니 다. 모든 설정 클래스 가 유효 하지 않 은 것 이 분명 합 니 다. 예 를 들 어 jar 를 인용 하지 않 았 다 면 해당 하 는 설정 클래스 는 효과 가 없 을 것 입 니 다. ok. 본 블 로 그 는 HttpEncoding AutoConfiguration 자동 인 코딩 설정 클래스 를 인 스 턴 스 로 하여 SpringBoot 의 자동 설정 을 기록 합 니 다.
    먼저 @ conditional 주해 의 용법 을 보충 합 니 다: 자세 한 내용 은 제 가 지난 블 로그 SpringBoot 시리즈 의 @ conditional 주해 용법 소 개 를 참고 하 실 수 있 습 니 다.
    @ Conditional 파생 주해
    역할
    @ConditionalOnJava
    시스템 의 자바 버 전이 요구 에 부합 되 는 지 여부
    @ConditionalOnBean
    지정 한 Bean 클래스 가 있 습 니 다.
    @ConditionalOnMissingBean
    지정 한 bean 클래스 가 없습니다.
    @ConditionalOnExpression
    지정 한 SpEL 표현 식 에 부합
    @ConditionalOnClass
    지정 한 클래스 가 있 습 니 다.
    @ConditionalOnMissingClass
    지정 한 클래스 가 없습니다
    @ConditionalOnSingleCandidate
    용 기 는 지정 한 bean 만 있 거나, 이 bean 이 첫 번 째 bean 입 니 다.
    @ConditionalOnProperty
    지정 한 property 속성 은 지정 한 값 이 있 습 니 다.
    @ConditionalOnResource
    경로 에 지정 한 자원 이 존재 합 니 다.
    @ConditionalOnWebApplication
    시스템 환경 은 웹 환경 입 니 다.
    @ConditionalOnNotWebApplication
    시스템 환경 은 웹 환경 이 아 닙 니 다.
    @ConditionalOnjndi
    JNDI 에 지정 한 항목 이 있 습 니 다.
    지난 블 로그 의 학습 을 통 해 우 리 는 SpringBoot 에 자동 설정 류 가 많다 는 것 을 알 게 되 었 기 때문에 본 블 로 그 는 HttpEncoding AutoConfiguration 류 를 가 져 왔 습 니 다.
    보충:
  • @ Configuration proxyBeanMethods 속성: 기본 값 은 열 려 있 습 니 다. 열 린 후 다른 설정 류 에서 이 종류의 @ bean 방법 을 호출 할 수 있 습 니 다. 자세 한 내용 은 Spring 공식 문서: Spring 공식 문서
  • 를 참조 하 십시오.
    package org.springframework.boot.autoconfigure.web.servlet;
    
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
    import org.springframework.boot.autoconfigure.http.HttpProperties;
    import org.springframework.boot.autoconfigure.http.HttpProperties.Encoding;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter;
    import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.Ordered;
    import org.springframework.web.filter.CharacterEncodingFilter;
    
    @Configuration(
        proxyBeanMethods = false
    )//        ,  proxyBeanMethods,            @bean 
    @EnableConfigurationProperties({HttpProperties.class})//    @ConfigurationProperties   HttpProperties   ,HttpProperties   ConfigurationProperties  ,             
    @ConditionalOnWebApplication(
        type = Type.SERVLET
    )//       Web       ,       SERVLET
    @ConditionalOnClass({CharacterEncodingFilter.class})//   CharacterEncodingFilter    ,      ,CharacterEncodingFilter :SpringMVC           
    @ConditionalOnProperty(
        prefix = "spring.http.encoding",
        value = {"enabled"},
        matchIfMissing = true
    )//         spring.http.encoding.enabled  ,     ,     true ,     `matchIfMissing =true`
    public class HttpEncodingAutoConfiguration {
    	//    Encoding  
        private final Encoding properties;
    	//        properties.getEncoding();      ,       
        public HttpEncodingAutoConfiguration(HttpProperties properties) {
            this.properties = properties.getEncoding();
        }
    
        @Bean
        @ConditionalOnMissingBean//      CharacterEncodingFilter ,   characterEncodingFilter  
        public CharacterEncodingFilter characterEncodingFilter() {
        	//           
            OrderedCharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
            //       
            filter.setEncoding(this.properties.getCharset().name());
            filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));
            filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));
            return filter;
        }
    
        @Bean
        public HttpEncodingAutoConfiguration.LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
            return new HttpEncodingAutoConfiguration.LocaleCharsetMappingsCustomizer(this.properties);
        }
    
        private static class LocaleCharsetMappingsCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {
            private final Encoding properties;
    
            LocaleCharsetMappingsCustomizer(Encoding properties) {
                this.properties = properties;
            }
    
            public void customize(ConfigurableServletWebServerFactory factory) {
                if(this.properties.getMapping() != null) {
                    factory.setLocaleCharsetMappings(this.properties.getMapping());
                }
    
            }
    
            public int getOrder() {
                return 0;
            }
        }
    }
    
    

    HttpEncoding AutoConfiguration 소스 코드 에 대한 학습 을 통 해 알 수 있 듯 이 사실은 주로 @ Conditional 과 그 파생 주 해 를 사용 합 니 다. 이런 주 해 는 특정한 상황 에서 효과 가 나타 나 고 효과 가 나타 나 야 구성 요 소 를 Spring 용기 에 불 러 옵 니 다.
    ok, 그리고 우 리 는 어떤 설정 이 효과 가 있 는 지 어떻게 압 니까?SpringBoot 프로젝트 에 서 는 설정 을 통 해 인쇄 를 시작 할 수 있 습 니 다. application. properties 에 debug=true 속성 을 추가 하면 됩 니 다.
    콘 솔 에서 인쇄 한 Positive matches 는 유효한 설정 클래스 SpringBoot源码学习系列之Http编码自动配置_第1张图片 console 에서 인쇄 한 Negative matches 는 효과 가 없 는 설정 클래스 를 표시 합 니 다. 예 를 들 어 제 프로젝트 에 op 을 추가 하지 않 으 면 op 자동 설정 클래스 가 효과 가 없습니다 SpringBoot源码学习系列之Http编码自动配置_第2张图片.

    좋은 웹페이지 즐겨찾기