@SpringBootApplication
public class XXApplication {
public static void main(String[] args) {
SpringApplication.run(XXApplication.class, args);
}
}
애플리케이션 메인 클래스를 보면 @SpringBootApplication
이 있다. 이 어노테이션 덕분에 Spring에서 설정해야 했던 일들이 사라졌다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication { }
여기서 필수 어노테이션을 추려보면,
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { }
AutoConfigurationImportSelector는 위의 인터페이스들을 구현한다. 그 중 DeferredImportSelector는 설정 클래스가 import되고 나서 호출되어 필요한 부분을 활성화시킨다.
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
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;
}
여기서 사용되는 SpringFactoriesLoade는 클래스 경로에 있는 모든 JAR 파일의 META-INF/spring.factories에서 설정 파일 목록을 가져오는 역할을 한다.
미리 정의된 설정들이 @Conditional~ 조건에 의해 활성화되거나 비활성화되면서 사용자가 추가한 여러 spring-boot-starter-*가 활성화되고 설정된다.
커스텀 @Conditional 애노테이션과 설정 파일을 만들고 모듈의 META-INF/spring.factories에 설정 파일을 지정하면 스프링 부트가 지원하는 자동 설정 기능을 만들 수 있다.