SpringBoot 원본 학습 시리즈 Http 인 코딩 자동 설정
26332 단어 소스 코드 학습자바 프레임 워 크
이전 블 로그 소스 학습 시리즈 의 SpringBoot 자동 설정 (편 1) 에 이 어 본 블 로 그 는 SpringBoot 의 자동 설정 소스 코드 를 계속 따 르 고 있 습 니 다.
ok, 먼저 전편 의 내용 을 복습 하고 앞의 학습 을 통 해 우 리 는 SpringBoot 의 자동 설정 은 주로 선택 기 AutoConfiguration ImportSelector 에 의 해 이 루어 진 다 는 것 을 알 게 되 었 습 니 다. 먼저 선택 기 를 통 해 자동 으로 설 정 된 종 류 를 Spring 용기 에 불 러 옵 니 다.
주의 점:
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
가 져 온 후보 설정 의 클래스 이름 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 류 를 가 져 왔 습 니 다.
보충:
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 는 유효한 설정 클래스 console 에서 인쇄 한 Negative matches 는 효과 가 없 는 설정 클래스 를 표시 합 니 다. 예 를 들 어 제 프로젝트 에 op 을 추가 하지 않 으 면 op 자동 설정 클래스 가 효과 가 없습니다 .
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SpringBoot 원본 학습 시리즈 Http 인 코딩 자동 설정ok, 먼저 전편 의 내용 을 복습 하고 앞의 학습 을 통 해 우 리 는 SpringBoot 의 자동 설정 은 주로 선택 기 AutoConfiguration ImportSelector 에 의 해 이 루어 진 다 는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.