반응형
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이 등록되거나 안될 수도 있음)
반응형
'프로그래밍 노트 > SPRING BOOT' 카테고리의 다른 글
[Spring Boot] freemarker 설정하기 (0) | 2019.11.05 |
---|---|
[Spring Boot] Servlet, Servlet-filter 설정 (1) | 2019.11.05 |
[Spring Boot] 스프링부트 테스트하기 (0) | 2019.09.16 |
[Spring Boot] 자동 설정 이해하기 @EnableAutoConfiguration (0) | 2019.07.11 |
[Spring Boot] 의존성 관리 (0) | 2019.07.11 |