<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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用來指定掃描的組建所在的包路徑或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讓SpringBoot可以根據類路徑中的jar包依賴可以為專案進行一些自動設定。這也是SpringBoot最核心的功能。當然,前提條件是依賴需要按照starter的規則來構建。
比如,我們新增了web的starter,那麼SpringBoot就會自動新增Tomcat和SpringMVC的依賴,然後又會進行一些相應的預設設定。但有些依賴需要我們自己去設定一些內容,比如雖然引入了data-jpa的starter,但是如果我們不設定對應的資料來源,程式肯定沒辦法正常啟動。
自動設定有它的便捷之處,但在某些情況下,我們可能並不需要一些自動設定。比如,雖然引入了data-jpa的依賴,但此刻並不需要連線資料庫。那麼,就可以通過註解將此自動設定進行關閉。@SpringBootApplication為我們提供了相應的功能。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
面試中可能會被問到:為什麼我們要使用SpringBoot?
你可能會說:因為SpringBoot用java設定替代了xml設定,或因為它內建Tomcat,可以直接打成jar包,通過java -jar快速啟動等;但這都不是重點,重點是剛剛說的@EnableAutoConfiguration實現的功能:自動設定。基於程式設計的一個共識:約定優於設定。這也正是SpringBoot的核心。
回想一下,在使用SpringBoot的過程中,當用到某個元件,只需引入相應的依賴(starter)。此時SpringBoot已經幫我們把相關的依賴引入,設定好最基本的引數。然後我們根據需要再在application.yml檔案中設定一些明確的引數(比如:資料庫地址、使用者名稱等),就完成了一個元件的整合,可以專注業務程式碼的編寫了。
/** * @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。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45