SpringBoot的啟動類@SpringBootApplication詳解:


SpringBoot啟動類:

@SpringBootApplication public class SpringBootDemo1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemo1Application.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 {

1、查看SpringBootApplication中的參數

前面四個注解:(前面兩個為元注解)

//元注解:對注解進行描述的注解,加在注解類上
@Target(ElementType.TYPE)
//有效時間,定義注解,一定:runtime
@Retention(RetentionPolicy.RUNTIME)
//注解是否在javaDoc文檔顯示
@Documented
//注解是否被繼承,子類能不能繼承這個父類的注解
@Inherited

 后面三個注解:

//springboot的配置類
@SpringBootConfiguration
//開啟自動配置
@EnableAutoConfiguration
//掃描注解
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

2、查看@SpringBootConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration //就是Configuration注解
public @interface SpringBootConfiguration {

3、查看@EnableAutoConfiguration

  @EnableAutoConfiguration 簡單概括一下就是,借助@Import的支持,收集和注冊特定場景相關的bean定義。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class) //導入一個類的核心類
public @interface EnableAutoConfiguration {

  借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以

幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器

AutoConfigurationImportSelector的核心方法:

@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                .loadMetadata(this.beanClassLoader);
        AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
                annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }

 自動配置幕后英雄:SpringFactoriesLoader詳解
       SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。

public abstract class SpringFactoriesLoader {

    private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
    public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

 配合@EnableAutoConfiguration使用的話,它更多是提供一種配置查找的功能支持,即根據@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfigure.EnableAutoConfiguration作為查找的Key,獲取對應的一組@Configuration類

 所以,@EnableAutoConfiguration自動配置:

配置類:    “spring04.config.JdbcConfig”   -->    反射技術  

               Class.forName()   --> JdbcConfig的Class對象

               --> newInstace()  -->  得到配置類的對象

               --> 配置類對象調用方法, 把方法產生的對象保存到Ioc容器

  selectImport()解析”MATA-INF/spring.factories” 文件, 這個文件包含所有的配置類的”包.類”, 通過反射,調用每一個配置類的方法, 這個方法上都有一個@Bean, 把這個方法產生的對象保存到IOC容器,  這個配置類的bean就是原先在spring配置文件中配置的bean

4、@ComponentScan包掃描

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

component是組件,scan是掃描,所以這個注解的含義就是用來掃描組件的,

componentScan 掃描當前包及其子包下被 @Component@Controller@Service@Repository注解標記的類並納入到spring容器中進行管理,所以這個注解會自動注入所有在主程序所在包下的組件。默認把當前啟動類所在的包作為掃描包的起點,例如咱們的項目,掃描 com.maweiqi 包

以前在ssm項目中我們需要去配置我們的包掃描

<context:component-scan base-package="com.xxx"></context:component-scan>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM