SpringBoot入口類和@SpringBootApplication講解
入口類和@SpringBootApplication
SpringBoot項(xiàng)目創(chuàng)建完成之后默認(rèn)會生成一個*Application的入口類,通過該類的main方法即可啟動SpringBoot項(xiàng)目。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class SpringbootRunApplication { ?? ?public static void main(String[] args) { ?? ??? ?SpringApplication.run(SpringbootRunApplication.class, args); ?? ?} }
在此入口類中,我們可以看到SpringBoot創(chuàng)建的業(yè)務(wù)代碼中(除單元測試)唯一的一個注解——@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 { ?? ?/** ?? ? * 根據(jù)類排除不使用的自動配置 ?? ? */ ?? ?@AliasFor(annotation = EnableAutoConfiguration.class) ?? ?Class<?>[] exclude() default {}; ?? ?/** ?? ? * 根據(jù)類名排除不使用的自動配置 ?? ? */ ?? ?@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 {}; }
該注解自身為我們提供了四個可配置項(xiàng):
exclude
:根據(jù)類排除不使用的自動配置;excludeName
:根據(jù)類名排除不使用的自動配置;scanBasePackages
:掃描指定的包;scanBasePackageClasses
:掃描指定的類;
@SpringBootApplication組合了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,因此我們也可以直接使用這三個注解來替代它。
在早期版本并沒有@SpringBootConfiguration,之后使用了@SpringBootConfiguration并在其中組合了@Configuration注解。在@EnableAutoConfiguration注解中組合了@AutoConfigurationPackage。
@ComponentScan相關(guān)使用
@ComponentScan用來指定掃描的組建所在的包路徑或class文件。在不指定參數(shù)的時候,SpringBoot的@ComponentScan默認(rèn)會掃描同目錄及同目錄下級目錄的類文件。通過部分源碼我們可以明確的看到。
@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"; ? ? // 省略掉部分源碼 }
上面的源碼重點(diǎn)看一下屬性resourcePattern的默認(rèn)值“**/*.class”,可以看出,如果不指定其他參數(shù)的話,默認(rèn)會去尋找同級目錄下的class。
在構(gòu)造SpringBoot項(xiàng)目時,往往會出現(xiàn)這樣一種情況:因?yàn)橥浕虿恢繱pringBoot默認(rèn)掃描的路徑,隨意創(chuàng)建包和類的位置,導(dǎo)致項(xiàng)目啟動之后,無法實(shí)例化對應(yīng)的組建,無法正確訪問接口。
當(dāng)然,如果是有意為之,那么我們就可以使用@SpringBootApplication或@ComponentScan來指定一些特殊的需要實(shí)例化的包或類。
@SpringBootApplication(scanBasePackages = “com.secbro2.controller") // 或 @ComponentScan(basePackages = "com.secbro2.controller")
@EnableAutoConfiguration
@EnableAutoConfiguration讓SpringBoot可以根據(jù)類路徑中的jar包依賴可以為項(xiàng)目進(jìn)行一些自動配置。這也是SpringBoot最核心的功能。當(dāng)然,前提條件是依賴需要按照starter的規(guī)則來構(gòu)建。
比如,我們添加了web的starter,那么SpringBoot就會自動添加Tomcat和SpringMVC的依賴,然后又會進(jìn)行一些相應(yīng)的默認(rèn)配置。但有些依賴需要我們自己去配置一些內(nèi)容,比如雖然引入了data-jpa的starter,但是如果我們不配置對應(yīng)的數(shù)據(jù)源,程序肯定沒辦法正常啟動。
關(guān)閉自動配置
自動配置有它的便捷之處,但在某些情況下,我們可能并不需要一些自動配置。比如,雖然引入了data-jpa的依賴,但此刻并不需要連接數(shù)據(jù)庫。那么,就可以通過注解將此自動配置進(jìn)行關(guān)閉。@SpringBootApplication為我們提供了相應(yīng)的功能。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
為什么是SpringBoot
面試中可能會被問到:為什么我們要使用SpringBoot?
你可能會說:因?yàn)镾pringBoot用java配置替代了xml配置,或因?yàn)樗鼉?nèi)置Tomcat,可以直接打成jar包,通過java -jar快速啟動等;但這都不是重點(diǎn),重點(diǎn)是剛剛說的@EnableAutoConfiguration實(shí)現(xiàn)的功能:自動配置。基于編程的一個共識:約定優(yōu)于配置。這也正是SpringBoot的核心。
回想一下,在使用SpringBoot的過程中,當(dāng)用到某個組件,只需引入相應(yīng)的依賴(starter)。此時SpringBoot已經(jīng)幫我們把相關(guān)的依賴引入,配置好最基本的參數(shù)。然后我們根據(jù)需要再在application.yml文件中配置一些明確的參數(shù)(比如:數(shù)據(jù)庫地址、用戶名等),就完成了一個組件的集成,可以專注業(yè)務(wù)代碼的編寫了。
SpringBoot主程序類,主入口類
主程序類,主入口類
/** ?* @SpringBootApplication 來標(biāo)注一個主程序類,說明這是一個Spring Boot應(yīng)用 ?*/ @SpringBootApplication public class HelloWorldMainApplication { ? ? public static void main(String[] args) { ? ? ? ? SpringApplication.run(HelloWorldMainApplication.class,args); ? ? } }
@SpringBootApplication
:Spring Boot應(yīng)用標(biāo)注在某個雷尚說明這個類是Spring Boot的主配置類,Spring Boot就應(yīng)該允許這個類的main方法來啟動SpringBoot應(yīng)用;@SpringBootConfiguration
:SpringBoot的配置類;表追在某個類上,標(biāo)識這是一個SpringBoot的配置類@Configuration: 配置雷尚來標(biāo)注這個注解
配置類----配置文件;配置類也是容器中的一個組件;@Component
@EnableAutoConfiguration
:開啟自動配置功能,以前我們需要配置的東西,SpringBoot開啟自動配置功能;這樣自動配置才能生效;@AutoConfigurationPackage
:自動配置包
@Import(AutoConfigurationPackages.Registrar.class);
Spring的底層注解@import,給容器中導(dǎo)入一個組件;導(dǎo)入 的組件由AutoConfigurationPackages.Registrar.class
將主配置類(@SpringBootApplication標(biāo)注的類)的所有包及下面所有組件掃描到Spring容器;
@Import(AutoConfigurationPackages.Registrar.class);
給容器中導(dǎo)入組件
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于JavaBean編輯器讀取peroperties文件的實(shí)例
下面小編就為大家?guī)硪黄贘avaBean編輯器讀取peroperties文件的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Java中的NoSuchMethodException異常原因以及解決方案詳解
這篇文章主要介紹了Java中的NoSuchMethodException異常原因以及解決方案詳解,NoSuchMethodException是Java反射機(jī)制中的異常,在嘗試通過反射獲取方法時,找不到指定的方法,通常發(fā)生在調(diào)用?Class?對象的方法時,當(dāng)方法名或方法參數(shù)不匹配時拋出該異常,需要的朋友可以參考下2024-02-02詳解Java8的groupBy實(shí)現(xiàn)集合的分組
這篇文章主要介紹了詳解Java8的groupBy實(shí)現(xiàn)集合的分組,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03深入解析Java編程中的StringBuffer與StringBuider
這篇文章主要介紹了Java編程中的StringBuffer與StringBuider,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09ScheduledThreadPoolExecutor巨坑解決
這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02