티스토리 뷰
스프링부트 프로젝트를 처음 생성하면 Application에 작성되어있는 main
이 한줄로 웹 애플리케이션을 실행하고 자동 설정 파일을 읽어서 가져온다.
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication 를 타고 들어가본다.
@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과 @EnableAutoConfiguration 과 @ComponentScan이다.
스프링 부트를 실행하면 빈은 두 단계로 나눠서 읽힌다.
(참고로 스프링 부트에서 빈을 읽을때에는 @SpringBootApplication 애노테이션이 위치한 패키지를 기준으로 하위 패키지에 등록되어있는 빈을 모두 수집한다.)
첫번째로 @ComponentScan을 통해서 클래스에 Component라는 애노테이션이 붙어있는 클래스들을 모두 수집한다.
웹 애플리케이션을 개발하면서 자주 쓰는 @Controller, @Service, @Repository, @Configuration ... 등이 모두 해당된다.
대표적으로 @Controller만 살펴보자면 @Component 애노테이션이 붙어있는 것을 확인할 수 있다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(
annotation = Component.class
)
String value() default "";
}
@EnableAutoConfiguration이 하는 역할은 spring-boot-autoconfigure안에 META-INF 밑에 있는 spring.fatories안에 들어있는 많은 자동 설정들을 조건에 따라서 등록시키는 역할을 한다.
@EnableAutoConfiguration 애노테이션이 읽어 들이는 빈은 @ComponentScan이 빈을 다 등록한 다음에 추가적인 빈을 등록해주는 것이다. 그래서 두 단계로 빈을 읽는다고 한 것이다.
spring.factories를 살펴보면..
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# 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,\
....(생략)
# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider
이렇게 많은 자동설정들이 존재한다. 이 프로퍼티에 등록되어있는 클래스들은 모두 @Configuration이 붙어있다. 이 클래스들을 스프링 부트를 시작할 때 다 빈으로 등록되는 것이다. 그런데 위에서 음영으로 색칠한 조건에 따라서 라는 말을 붙였었다. 즉 특정 조건에 맞을 때만 빈을 등록하기도 하고 등록하지 않기도 하는 것이다.
그럴때 사용되어지는 애노테이션이 @ConditionalOn..이 접두사로 붙은 애노테이션이다.
@Conditional 애노테이션은 스프링 4.0부터 도입된 애노테이션으로서 조건부로 빈을 스프링 컨테이너에 등록하는 역할을 한다.
스프링 web MVC를 자동설정해주는 WebMvcAutoConfiguration 클래스를 잠깐 보자면..
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@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_LOCATION = "/";
public WebMvcAutoConfiguration() {
}
...(생략)
}
@ConditionalOnClass 애노테이션은 특정 클래스 파일이 존재하면 빈으로 등록하라는 애노테이션이고
@ConditionalOnMissingBean 애노테이션은 특정 빈(Bean)이 존재하면 빈을 등록하라는 애노테이션인것이다.
@AutoConfigureOrder 애노테이션은 우선순위를 매기는 애노테이션이다.
참고
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8?inst=1e933e3e
- Total
- Today
- Yesterday
- docker
- mybatis config
- 오라클
- Mac
- svn
- rocky
- springboot
- Github Status
- jQuery
- input
- LocalDate
- 베리 심플
- Bash tab
- Spring
- Java
- elasticsearch
- maven
- LocalDateTime
- k8s
- 북리뷰
- config-location
- intellij
- Linux
- Spring Security
- window
- oracle
- Kotlin
- localtime
- JavaScript
- mybatis
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |