SpringBoot啟動類@SpringBootApplication注解背后的秘密
在用SpringBoot的項目的時候,會發(fā)現(xiàn)不管干什么都離不開啟動類,他是程序唯一的入口,那么他究竟為我們做了什么?本篇文章主要解析@SpringBootApplication。
一、啟動類
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
二、@SpringBootApplication
@SpringBootApplication: Spring Boot應用標注在某個類上說明這個類是SpringBoot的主配置類,
SpringBoot 就應該運行這個類的main方法來啟動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 { }
點進去會發(fā)現(xiàn)他的注解類當中還有很多注解,就是一個自定義組合注解。
接下來來對他組合的注解一一講解。
1、@Target(ElementType.TYPE)
@Target說明了Annotation(注解)所修飾的對象范圍
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
2、@Retention(RetentionPolicy.RUNTIME)
注解按生命周期來劃分可分為3類:
1、RetentionPolicy.SOURCE:注解只保留在源文件,當Java文件編譯成class文件的時候,注解被遺棄;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時候被遺棄,這是默認的生命周期;
3、RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;
3、@Documented
這個注解只是用來標注生成javadoc的時候是否會被記錄。
在自定義注解的時候可以使用@Documented來進行標注,如果使用@Documented標注了,在生成javadoc的時候就會把@Documented注解給顯示出來。
4、@Inherited
@Inherited是一個標識,用來修飾注解,自定義注解當中會用到
首先自定義一個注解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ATable { public String name() default ""; }
以下是在使用自定義注解的一個場景。
類繼承關系中@Inherited的作用
類繼承關系中,子類會繼承父類使用的注解中被@Inherited修飾的注解
@ATable public class InheritedBase { } public class MyInheritedClass extends InheritedBase { }
接口繼承關系中@Inherited的作用
接口繼承關系中,子接口不會繼承父接口中的任何注解,不管父接口中使用的注解有沒有被@Inherited修飾
@ATable public interface IInheritedInterface { } public interface IInheritedInterfaceChild extends IInheritedInterface { }
類實現(xiàn)接口關系中@Inherited的作用
類實現(xiàn)接口時不會繼承任何接口中定義的注解
@ATable public interface IInheritedInterface { } public class MyInheritedClassUseInterface implements IInheritedInterface { }
5、@SpringBootConfiguration
標注在某個類上,表示這是一個Spring Boot的配置類
點進去會發(fā)現(xiàn),他其實也是一個自定義注解
@Configuration學spring的應該對他不陌生
作用:指定當前類是一個配置類,在使用spring的時候剛開始都是xml配置,也正是這個注解,開啟了類配置方式。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
6、@EnableAutoConfiguration
以前我們需要配置的東西,Spring Boot會幫我們自動配置;
@EnableAutoConfiguration告訴SpringBoot開啟自 動配置功能;這樣自動配置才能生效;
點進去會發(fā)現(xiàn)@Import,說白了他就是借助@Import的支持,收集和注冊特定場景相關的bean定義。
@Import作用:用于導入其他的配置類
而@EnableAutoConfiguration也是借助@Import的幫助,將所有符合自動配置條件的bean定義加載到IoC容器,僅此而已!
@SuppressWarnings("deprecation") @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { }
EnableAutoConfigurationImportSelector:導入哪些組件的選擇器;
會給容器中導入非常多的自動配置類(xxxAutoConfiguration);
大概的流程就是:
Spring Boot在啟動的時候,通過EnableAutoConfigurationImportSelector類,從類路徑下的
META-INF/spring.factories中獲取EnableAutoConfiguration指定的值(就是上方截圖),
以全類名反射的創(chuàng)建方式,將這些值作為自動配置類導入到容器中,自動配置類就生效,
幫我們進行自動配置工作;
以前我們需要自己配置的東西,自動配置類都幫我們配置好了,這也就是使用springboot在使用spring,springmvc不用配置視圖解析器、數(shù)據(jù)庫連接池、事務 等配置的原因。直接開箱即用。
當然springboot也給我提供了修改配置的方法,那就是通過yml或者propertie文件來進行修改springboot為我們配置好的配置默認值。
7、@ComponentScan
作用:用于通過注解指定spring在創(chuàng)建容器時要掃描的包
我們可以通過basePackages等屬性來細粒度的定制@ComponentScan自動掃描的范圍,如果不指定,則默認Spring框架實現(xiàn)會從聲明@ComponentScan所在類的package進行掃描。
@ComponentScan("com.gzl")
這也就是springboot啟動類為什么放在包外的原因。
三、不使用這個注解能否啟動項目
把@SpringBootApplication換成以下三個注解,照樣可以正常啟動。
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); } }
到此這篇關于SpringBoot啟動類@SpringBootApplication注解背后的秘密的文章就介紹到這了,更多相關@SpringBootApplication注解背后的秘密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot使用Redis實現(xiàn)分布式緩存
這篇文章主要介紹了SpringBoot redis分布式緩存實現(xiàn)過程解析,文中通過示例代碼解析的非常詳細,感興趣的同學可以參考閱讀2023-04-04SpringCloud中的openFeign調(diào)用服務并傳參的過程
服務和服務之間通信,不僅僅是調(diào)用,往往在調(diào)用過程中還伴隨著參數(shù)傳遞,接下來重點來看看OpenFeign在調(diào)用服務時如何傳遞參數(shù),感興趣的朋友一起看看吧2023-11-11