首頁 > 軟體

SpringBoot入口類和@SpringBootApplication講解

2022-03-21 13:00:16

入口類和@SpringBootApplication

SpringBoot專案建立完成之後預設會生成一個*Application的入口類,通過該類的main方法即可啟動SpringBoot專案。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringbootRunApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootRunApplication.class, args);
    }
}

在此入口類中,我們可以看到SpringBoot建立的業務程式碼中(除單元測試)唯一的一個註解——@SpringBootApplication,這也是SpringBoot的核心註解。

原始碼如下:

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

該註解自身為我們提供了四個可設定項:

  • exclude:根據類排除不使用的自動設定;
  • excludeName:根據類名排除不使用的自動設定;
  • scanBasePackages:掃描指定的包;
  • scanBasePackageClasses:掃描指定的類;

@SpringBootApplication組合了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,因此我們也可以直接使用這三個註解來替代它。

在早期版本並沒有@SpringBootConfiguration,之後使用了@SpringBootConfiguration並在其中組合了@Configuration註解。在@EnableAutoConfiguration註解中組合了@AutoConfigurationPackage。

@ComponentScan相關使用

@ComponentScan用來指定掃描的組建所在的包路徑或class檔案。在不指定引數的時候,SpringBoot的@ComponentScan預設會掃描同目錄及同目錄下級目錄的類檔案。通過部分原始碼我們可以明確的看到。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
  
    @AliasFor("basePackages")
    String[] value() default {};
    @AliasFor("value")
    String[] basePackages() default {};
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
    String resourcePattern() default 「**/*.class";
    // 省略掉部分原始碼
}

上面的原始碼重點看一下屬性resourcePattern的預設值“**/*.class”,可以看出,如果不指定其他引數的話,預設會去尋找同級目錄下的class。

在構造SpringBoot專案時,往往會出現這樣一種情況:因為忘記或不知道SpringBoot預設掃描的路徑,隨意建立包和類的位置,導致專案啟動之後,無法範例化對應的組建,無法正確存取介面。

當然,如果是有意為之,那麼我們就可以使用@SpringBootApplication或@ComponentScan來指定一些特殊的需要範例化的包或類。

@SpringBootApplication(scanBasePackages = 「com.secbro2.controller")
// 或
@ComponentScan(basePackages = "com.secbro2.controller")

@EnableAutoConfiguration

@EnableAutoConfiguration讓SpringBoot可以根據類路徑中的jar包依賴可以為專案進行一些自動設定。這也是SpringBoot最核心的功能。當然,前提條件是依賴需要按照starter的規則來構建。

比如,我們新增了web的starter,那麼SpringBoot就會自動新增Tomcat和SpringMVC的依賴,然後又會進行一些相應的預設設定。但有些依賴需要我們自己去設定一些內容,比如雖然引入了data-jpa的starter,但是如果我們不設定對應的資料來源,程式肯定沒辦法正常啟動。

關閉自動設定

自動設定有它的便捷之處,但在某些情況下,我們可能並不需要一些自動設定。比如,雖然引入了data-jpa的依賴,但此刻並不需要連線資料庫。那麼,就可以通過註解將此自動設定進行關閉。@SpringBootApplication為我們提供了相應的功能。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

為什麼是SpringBoot

面試中可能會被問到:為什麼我們要使用SpringBoot?

你可能會說:因為SpringBoot用java設定替代了xml設定,或因為它內建Tomcat,可以直接打成jar包,通過java -jar快速啟動等;但這都不是重點,重點是剛剛說的@EnableAutoConfiguration實現的功能:自動設定。基於程式設計的一個共識:約定優於設定。這也正是SpringBoot的核心。

回想一下,在使用SpringBoot的過程中,當用到某個元件,只需引入相應的依賴(starter)。此時SpringBoot已經幫我們把相關的依賴引入,設定好最基本的引數。然後我們根據需要再在application.yml檔案中設定一些明確的引數(比如:資料庫地址、使用者名稱等),就完成了一個元件的整合,可以專注業務程式碼的編寫了。

SpringBoot主程式類,主入口類

主程式類,主入口類

/**
 * @SpringBootApplication 來標註一個主程式類,說明這是一個Spring Boot應用
 */
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}
  • @SpringBootApplication:Spring Boot應用標註在某個雷尚說明這個類是Spring Boot的主設定類,Spring Boot就應該允許這個類的main方法來啟動SpringBoot應用;
  • @SpringBootConfiguration:SpringBoot的設定類;表追在某個類上,標識這是一個SpringBoot的設定類@Configuration: 設定雷尚來標註這個註解

設定類----組態檔;設定類也是容器中的一個元件;@Component

  • @EnableAutoConfiguration:開啟自動設定功能,以前我們需要設定的東西,SpringBoot開啟自動設定功能;這樣自動設定才能生效;
  • @AutoConfigurationPackage:自動設定包
@Import(AutoConfigurationPackages.Registrar.class);

Spring的底層註解@import,給容器中匯入一個元件;匯入 的元件由AutoConfigurationPackages.Registrar.class

將主設定類(@SpringBootApplication標註的類)的所有包及下面所有元件掃描到Spring容器;

@Import(AutoConfigurationPackages.Registrar.class);

給容器中匯入元件

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com