Spring Boot@EnableAutoConfiguration 과@Configuration 의 차이 점
5352 단어 springspringboot
Spring Boot 에 서 는@SpringBootApplication 을 사용 하여 Spring Boot 프로그램 을 시작 합 니 다.이전 글 에서 우 리 는@SpringBootApplication 은@EnableAutoConfiguration,@Componentscan,@Configuration 세 사람의 집합 에 해당 한다 고 말 했다.
그 중에서@Configuration 은 클래스 에 사용 되 는데 이것 은 설정 클래스 임 을 나타 낸다.다음 과 같다.
@Configuration
public class MySQLAutoconfiguration {
...
}
@EnableAutoConfiguration 은 Spring Boot 를 여 는 자동 설정 기능 입 니 다.자동 설정 기능 은 무엇 입 니까?쉽게 말 하면 Spring Boot 는 의존 하 는 jar 패키지 에 따라 일부 설정 을 자동 으로 예화 합 니 다.
다음은@EnableAutoConfiguration 이 어떻게 작 동 하 는 지 살 펴 보 겠 습 니 다.
@EnableAutoConfiguration 의 정 의 를 살 펴 보 겠 습 니 다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
Class>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
String[] excludeName() default {};
}
이 줄 을 주의 하 십시오:@Import(AutoConfigurationImportSelector.class)
AutoConfiguration ImportSelector 는 ImportSelector 인 터 페 이 스 를 실현 하고 실례 화 할 때 selectImports 를 호출 합 니 다.다음은 그 방법 이다.
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
이 방법 에서 getCandidate Configurations 는 클래스 로 더 에서 모든 META-INF/spring.factories 를 찾 고@EnableAutoConfiguration 클래스 를 불 러 옵 니 다.관심 있 는 친 구 는 이 방법의 실현 을 구체 적 으로 연구 할 수 있다.
private static Map> loadSpringFactories(@Nullable ClassLoader classLoader) {
MultiValueMap result = cache.get(classLoader);
if (result != null) {
return result;
}
try {
Enumeration urls = (classLoader != null ?
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
result = new LinkedMultiValueMap<>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
for (Map.Entry, ?> entry : properties.entrySet()) {
String factoryTypeName = ((String) entry.getKey()).trim();
for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
result.add(factoryTypeName, factoryImplementationName.trim());
}
}
}
cache.put(classLoader, result);
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load factories from location [" +
FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}
spring-boot-autoconfigure-2.2.2.RELEASE.jar 의 META-INF/spring.factories 를 다시 한 번 살 펴 보 겠 습 니 다.
spring.factories 의 내용 은 key=value 형식 입 니 다.EnableAutoConfiguration 에 중점 을 두 겠 습 니 다.
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
...
위 코드 에 따라 모든 EnableAutoConfiguration 이 자동 으로 불 러 옵 니 다.이것 이 바로 자동 로드 의 원리 다.
만약 우리 가 구체 적 인 실현 을 자세히 본다 면:
@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(JmxAutoConfiguration.class)
@ConditionalOnProperty(prefix = "spring.application.admin", value = "enabled", havingValue = "true",
matchIfMissing = false)
public class SpringApplicationAdminJmxAutoConfiguration {
@conditional*의 주 해 를 많이 사용 한 것 을 볼 수 있 습 니 다.이 주해 의 역할 은 이 설정 류 가 언제 작용 할 수 있 는 지 판단 하 는 것 입 니 다.
더 많은 튜 토리 얼 참고 하 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.