프로그래밍 노트/SPRING BOOT

[Spring Boot] 자동 설정 이해하기2

깡냉쓰 2019. 11. 5. 23:21
728x90
반응형

2019/07/11 - [프로그래밍 노트/SPRING BOOT] - [Spring Boot] 자동 설정 이해하기 @EnableAutoConfiguration

이 전에 자동설정과 관련된 포스팅을 했었는데, 어떻게 동작하는지 더 자세히 코드를 들여다보자.

@EnableAutoConfiguration

  • Spring Boot의 자동 구성을 위한 메타 어노테이션
  • 애플리케이션에서 필요한 Bean을 유추해서 구성해 주는 기능을 담당 (@SpringBootApplication에 포함되어 있음)

EnableAutoConfiguration 어노테이션을 들어가보면 AutoConfigurationImportSelector를 사용하는 것을 볼 수 있다.
=> @Import(AutoConfigurationImportSelector.class)

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

AutoConfigurationImportSelector.java

AutoConfigurationImportSelector의 getCandidateConfigurations 메소드를 보면 Configuration 후보들을 반환하는 것을 볼 수 있다.
List<String> configurations = SpringFactoriesLoader.loadFactoryNames

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
}

SpringFactoriesLoader.java

META-INF/spring.factories파일에서 factoryClass에 해당하는 설정 클래스명을 반환 후 로드한다.

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    String factoryTypeName = factoryType.getName();
    return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
    MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
    if (result != null) {
        return result;
    } else {
        try {
            Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
            LinkedMultiValueMap result = new LinkedMultiValueMap();

            while(urls.hasMoreElements()) {
            ... 생략

spring.factories

애플리케이션 타입을 유추할때 사용할 @Configuration클래스들이 정의되어 있다.

# 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 어노테이션이 어떻게 동작하는지 살펴보았다. META-INF/spring.factories에 기술된 모든 Bean들을 생성한다. 이정도로 알고 있으면 될것같다.(조건에 따라 Bean이 등록되거나 안될 수도 있음)

728x90
반응형