天天看點

了解一下Spring Boot中@SpringBootApplication 注解

(Spring Boot中@SpringBootApplication 注解)

@SpringBootApplication注解

SpringBootApplication注解位于spring-boot-autoconfigure 工程的org.springframework.boot.autoconfigure 包中,定義代碼如下:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;

@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 {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "nameGenerator"
    )
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}
           

@SpringBootApplication 注解顯得有點複雜。可以通過 exclude和excludeName 屬性來配置不需要實作自動裝配的類或類名,也可以通過 scanBasePackages和scanBasePackageClasses 屬性來配置需要進行掃描的包路徑和類路徑。

注意到 @SpringBootApplication注解實際上是一個組合注解,它由三個注解組合而成,分别是 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。

@ComponentScan 注解

@ComponentScan 注解不是 Spring Boot 引入的新注解,而是屬于 Spring 容器管理的内容。@ComponentScan 注解就是掃描基于 @Component 等注解所标注的類所在包下的所有需要注入的類,并把相關 Bean 定義批量加載到容器中。顯然,Spring Boot 應用程式中同樣需要這個功能。

@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 {};
}
           

常見注解