from Dictionary - SpringBootApplication
@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 {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
//AutoConfigure 제외 대상
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
//AutoConfigure 제외 대상 (클래스 명)
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
//ComponentScan Packages
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
//ComponentScan classes
@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
//BeanNaming 담당 클래스
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
//@Bean을 프록시로 처리하도록 설정
//프록시가 필요한 이유는 해당 메소드를 직접 호출하는 경우에도
//항상 싱글톤 스코프를 강제해서 1개의 객체만 생성하기 위함
}
-
@SpringBootConfiguration
@Configuration을 담은 Annotation ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @Indexed public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class) boolean proxyBeanMethods() default true;
}
2. @EnableAutoConfiguration
필요한 Spring auto configuration을 활성화하는 어노테이션
자동 설정할 클래스 선별은 `AutoConfigurationImportSelector`가 처리한다.
`@Import`를 통해서 진행한다.
```java
@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 {};
}
autoConfigure 가능 대상은 spring.factories에 있다.(spring-boot-autoconfigure)
auto-configuration 클래스는 아래의 어노테이션을 자주 사용한다.
- @ConditionalOnClass: 해당 클래스가 클래스 패스에 존재하는 경우
- @ConditionlOnBean: 해당 클래스나 이름이 빈 팩토리에 포함되어 있는 경우
- @ConditionalOnMissingBean: 해당 빈이 등록되어있지 않은 경우 -> bean이 없을 경우만 올라가게 할 수 있다.
- @ComponentScan
빈을 등록하기 위한 어노테이션을 탐색하는 basePackage를 지정한다.
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Repeatable(ComponentScans.class) public @interface ComponentScan { @AliasFor("basePackages") String[] value() default {}; @AliasFor("value") String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class; ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT; String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN; boolean useDefaultFilters() default true; Filter[] includeFilters() default {}; Filter[] excludeFilters() default {}; boolean lazyInit() default false; @Retention(RetentionPolicy.RUNTIME) @Target({}) @interface Filter { FilterType type() default FilterType.ANNOTATION; @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String[] pattern() default {}; } }