SpringBoot啟動(dòng)類@SpringBootApplication注解背后的秘密
在用SpringBoot的項(xiàng)目的時(shí)候,會(huì)發(fā)現(xiàn)不管干什么都離不開啟動(dòng)類,他是程序唯一的入口,那么他究竟為我們做了什么?本篇文章主要解析@SpringBootApplication。
一、啟動(dòng)類
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
二、@SpringBootApplication
@SpringBootApplication: Spring Boot應(yīng)用標(biāo)注在某個(gè)類上說(shuō)明這個(gè)類是SpringBoot的主配置類,
SpringBoot 就應(yīng)該運(yùn)行這個(gè)類的main方法來(lái)啟動(dòng)SpringBoot應(yīng)用;
相關(guān)配置啟動(dòng)都是由該注解來(lái)幫我們完成的,點(diǎn)進(jìn)去了解一下
@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 { }
點(diǎn)進(jìn)去會(huì)發(fā)現(xiàn)他的注解類當(dāng)中還有很多注解,就是一個(gè)自定義組合注解。
接下來(lái)來(lái)對(duì)他組合的注解一一講解。
1、@Target(ElementType.TYPE)
@Target說(shuō)明了Annotation(注解)所修飾的對(duì)象范圍
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
2、@Retention(RetentionPolicy.RUNTIME)
注解按生命周期來(lái)劃分可分為3類:
1、RetentionPolicy.SOURCE:注解只保留在源文件,當(dāng)Java文件編譯成class文件的時(shí)候,注解被遺棄;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時(shí)候被遺棄,這是默認(rèn)的生命周期;
3、RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;
3、@Documented
這個(gè)注解只是用來(lái)標(biāo)注生成javadoc的時(shí)候是否會(huì)被記錄。
在自定義注解的時(shí)候可以使用@Documented來(lái)進(jìn)行標(biāo)注,如果使用@Documented標(biāo)注了,在生成javadoc的時(shí)候就會(huì)把@Documented注解給顯示出來(lái)。
4、@Inherited
@Inherited是一個(gè)標(biāo)識(shí),用來(lái)修飾注解,自定義注解當(dāng)中會(huì)用到
首先自定義一個(gè)注解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ATable { public String name() default ""; }
以下是在使用自定義注解的一個(gè)場(chǎng)景。
類繼承關(guān)系中@Inherited的作用
類繼承關(guān)系中,子類會(huì)繼承父類使用的注解中被@Inherited修飾的注解
@ATable public class InheritedBase { } public class MyInheritedClass extends InheritedBase { }
接口繼承關(guān)系中@Inherited的作用
接口繼承關(guān)系中,子接口不會(huì)繼承父接口中的任何注解,不管父接口中使用的注解有沒(méi)有被@Inherited修飾
@ATable public interface IInheritedInterface { } public interface IInheritedInterfaceChild extends IInheritedInterface { }
類實(shí)現(xiàn)接口關(guān)系中@Inherited的作用
類實(shí)現(xiàn)接口時(shí)不會(huì)繼承任何接口中定義的注解
@ATable public interface IInheritedInterface { } public class MyInheritedClassUseInterface implements IInheritedInterface { }
5、@SpringBootConfiguration
標(biāo)注在某個(gè)類上,表示這是一個(gè)Spring Boot的配置類
點(diǎn)進(jìn)去會(huì)發(fā)現(xiàn),他其實(shí)也是一個(gè)自定義注解
@Configuration學(xué)spring的應(yīng)該對(duì)他不陌生
作用:指定當(dāng)前類是一個(gè)配置類,在使用spring的時(shí)候剛開始都是xml配置,也正是這個(gè)注解,開啟了類配置方式。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
6、@EnableAutoConfiguration
以前我們需要配置的東西,Spring Boot會(huì)幫我們自動(dòng)配置;
@EnableAutoConfiguration告訴SpringBoot開啟自 動(dòng)配置功能;這樣自動(dòng)配置才能生效;
點(diǎn)進(jìn)去會(huì)發(fā)現(xiàn)@Import,說(shuō)白了他就是借助@Import的支持,收集和注冊(cè)特定場(chǎng)景相關(guān)的bean定義。
@Import作用:用于導(dǎo)入其他的配置類
而@EnableAutoConfiguration也是借助@Import的幫助,將所有符合自動(dòng)配置條件的bean定義加載到IoC容器,僅此而已!
@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { }
EnableAutoConfigurationImportSelector:導(dǎo)入哪些組件的選擇器;
會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(xxxAutoConfiguration);
大概的流程就是:
Spring Boot在啟動(dòng)的時(shí)候,通過(guò)EnableAutoConfigurationImportSelector類,從類路徑下的
META-INF/spring.factories中獲取EnableAutoConfiguration指定的值(就是上方截圖),
以全類名反射的創(chuàng)建方式,將這些值作為自動(dòng)配置類導(dǎo)入到容器中,自動(dòng)配置類就生效,
幫我們進(jìn)行自動(dòng)配置工作;
以前我們需要自己配置的東西,自動(dòng)配置類都幫我們配置好了,這也就是使用springboot在使用spring,springmvc不用配置視圖解析器、數(shù)據(jù)庫(kù)連接池、事務(wù) 等配置的原因。直接開箱即用。
當(dāng)然springboot也給我提供了修改配置的方法,那就是通過(guò)yml或者propertie文件來(lái)進(jìn)行修改springboot為我們配置好的配置默認(rèn)值。
7、@ComponentScan
作用:用于通過(guò)注解指定spring在創(chuàng)建容器時(shí)要掃描的包
我們可以通過(guò)basePackages等屬性來(lái)細(xì)粒度的定制@ComponentScan自動(dòng)掃描的范圍,如果不指定,則默認(rèn)Spring框架實(shí)現(xiàn)會(huì)從聲明@ComponentScan所在類的package進(jìn)行掃描。
@ComponentScan("com.gzl")
這也就是springboot啟動(dòng)類為什么放在包外的原因。
三、不使用這個(gè)注解能否啟動(dòng)項(xiàng)目
把@SpringBootApplication換成以下三個(gè)注解,照樣可以正常啟動(dòng)。
package com.gzl.cn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
到此這篇關(guān)于SpringBoot啟動(dòng)類@SpringBootApplication注解背后的秘密的文章就介紹到這了,更多相關(guān)@SpringBootApplication注解背后的秘密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Redis實(shí)現(xiàn)分布式緩存
這篇文章主要介紹了SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼解析的非常詳細(xì),感興趣的同學(xué)可以參考閱讀2023-04-04關(guān)于快速測(cè)試API接口的一個(gè)新技能
這篇文章主要給大家介紹了關(guān)于快速測(cè)試API接口的一個(gè)新技能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06SpringCloud中的openFeign調(diào)用服務(wù)并傳參的過(guò)程
服務(wù)和服務(wù)之間通信,不僅僅是調(diào)用,往往在調(diào)用過(guò)程中還伴隨著參數(shù)傳遞,接下來(lái)重點(diǎn)來(lái)看看OpenFeign在調(diào)用服務(wù)時(shí)如何傳遞參數(shù),感興趣的朋友一起看看吧2023-11-11java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)
這篇文章主要介紹了JS求多個(gè)數(shù)組的重復(fù)數(shù)據(jù)的辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Java設(shè)計(jì)模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03Javafx簡(jiǎn)單實(shí)現(xiàn)【我的電腦資源管理器】效果
這篇文章主要介紹了Javafx簡(jiǎn)單實(shí)現(xiàn)【我的電腦資源管理器】效果,涉及Javafx操作系統(tǒng)文件模擬資源管理器的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09java設(shè)置session過(guò)期時(shí)間的實(shí)現(xiàn)方法
這篇文章主要介紹了java設(shè)置session過(guò)期時(shí)間的實(shí)現(xiàn)方法,以實(shí)例形式詳細(xì)講述了具體實(shí)現(xiàn)過(guò)程,非常具有參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10MyBatis-Plus?實(shí)體類注解的實(shí)現(xiàn)示例
MyBatis-Plus作為MyBatis的增強(qiáng)版,提供了一系列實(shí)用的注解,如@TableName、@TableId、@TableField等,旨在簡(jiǎn)化數(shù)據(jù)庫(kù)和Java實(shí)體類之間的映射及CRUD操作,通過(guò)這些注解,開發(fā)者可以輕松實(shí)現(xiàn)表映射、字段映射、邏輯刪除、自動(dòng)填充和樂(lè)觀鎖等功能2024-09-09