Spring Boot@EnableAutoConfiguration 과@Configuration 의 차이 점

5352 단어 springspringboot
Spring Boot@EnableAutoConfiguration 과@Configuration 의 차이 점
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*의 주 해 를 많이 사용 한 것 을 볼 수 있 습 니 다.이 주해 의 역할 은 이 설정 류 가 언제 작용 할 수 있 는 지 판단 하 는 것 입 니 다.
더 많은 튜 토리 얼 참고 하 세 요.

좋은 웹페이지 즐겨찾기