@SpringBootApplication

이지수·2022년 4월 24일
0

@SpringBootApplication의 구조

SpringBootApplication의 역할은 한마디로 말하면, 내가 만든 Bean을 등록해주는 @ComponentScan과, 스프링부트에서 미리 만들어놓은 Bean을 등록해주는 @EnableAutoConfiguration의 조합이다.

@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 {
  ...
}
  • @SpringBootConfiguration
    • @Configuration과 같은 역할을 수행. @Bean을 정의하는 역할을 한다.
  • @ComponentScan
    • @Congifuration, @Repository, @Service, @Controller와 같은 객체 찾아서 IOC컨테이너에 Bean으로 등록하고 DI
  • @EnableAutoConfiguration
    • spring-boot-autoconfigure.jar/META-INF/spring.factories를 기준으로 자동성으로 Bean을 생성해주는 역할

@EnableAutoConfiguration

@EnableAutoConfiguration은 spring.factories 파일을 읽어
미리 정의된 Configiruation파일을 읽어 Bean을 생성한다.

spring.factories

spring-boot-autoconfigure-2.1.9.RELEASE.jar!/META-INF/spring.factories
# 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,\
...생략

spring.factories 에는 이런 내용들이 정의되어 있고, 전부 @Configuration이 정된 설정파일로 내부에 있는 Bean을 자동으로 등록하여 설정하는 역할을 한다.

예시를 보면,

WebMvcAutoConfiguration.java
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

	public static final String DEFAULT_PREFIX = "";

	public static final String DEFAULT_SUFFIX = "";

	private static final String[] SERVLET_LOCATIONS = { "/" };

	@Bean
	@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
	@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = true)
	public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
		return new OrderedHiddenHttpMethodFilter();
	}

	@Bean
	@ConditionalOnMissingBean(FormContentFilter.class)
	@ConditionalOnProperty(prefix = "spring.mvc.formcontent.filter", name = "enabled", matchIfMissing = true)
	public OrderedFormContentFilter formContentFilter() {
		return new OrderedFormContentFilter();
	}
}

@ConditionalOn* 에 따라서 자동설정 Bean을 생성. 불필요한 Bean이 생성되지 않도록, 사용자가 직접 정의한 Bean이 있는 경우는 사용자의 설정을 따르도록 설정되어 있는 것을 확인할 수 있다.

  • @ConditionalOnWebApplication(type = Type.SERVLET)
    • WebApplicationType이 SERVELET 인 경우 Bean 생성
  • @ConditionalOnClass
    • 특정 클래스 파일이 클래스 패스에 존재하는 경우 Bean 생성 (위 경우 웹MVC가 없다면 생성되지 않는다)
  • @ConditionalOnMissingBean
    • 대상 Bean이 없는 경우 생성하고, 있다면 생성하지 않는다.

Ref

profile
공부합시다

0개의 댓글

Powered by GraphCDN, the GraphQL CDN