前面的web項(xiàng)目,簡(jiǎn)短幾行代碼零配置文件辛掠,就能夠啟動(dòng)一個(gè)web工程,這是如何實(shí)現(xiàn)的呢释牺?
實(shí)質(zhì)上萝衩,SpringBoot幫我們做了很多自動(dòng)化的配置,這些配置是一個(gè)個(gè)配置組建共同構(gòu)成的
DemoApplication.java代碼如下
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
DemoApplication.java中核心內(nèi)容:
- @SpringBootApplication注解
- SpringApplication.run方法
接下來没咙,我們就通過源碼SpringBoot究竟是怎樣的完成自動(dòng)化配置的猩谊,看看這里面究竟藏著怎樣的秘密。
要分析SpringBoot源碼祭刚,首先得搭建一個(gè)SpringBoot源碼工程牌捷,步驟如下
- 在github上墙牌,下載springboot源碼并解壓
- 安裝maven依賴
- 在idea中打開springboot源碼工程
SpringBoot 2.2.X 以前是采用maven構(gòu)建的,2.3.X以后是采用gradle構(gòu)建的暗甥,這里我使用maven喜滨,所以采用2.2.X來分析
1、@SpringBootApplication注解分析
點(diǎn)擊@SpringBootApplication源碼撤防,可以看到這個(gè)注解是一個(gè)組合注解
我將核心注解與基礎(chǔ)注解之前添加了一根分割線虽风,并在核心注解上加了說明,核心注解如下
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
1.1寄月、@SpringBootConfiguration
點(diǎn)擊@SpringBootConfiguration
可以看到只有一個(gè)org.springframework.context.annotation.@Configuration注解辜膝,此注解所標(biāo)記的類,會(huì)在Spring容器初始化的時(shí)候被掃描到漾肮,并解析其中的配置內(nèi)容(例如@Bean標(biāo)記的方法等)
1.2厂抖、@EnableAutoConfiguration
點(diǎn)擊@EnableAutoConfiguration
此注解上面又有兩個(gè)核心注解
- @AutoConfigurationPackage
- @Import(AutoConfigurationImportSelector.class)
1.2.1、@AutoConfigurationPackage源碼如下:
只有一個(gè)核心注解:
- @Import(AutoConfigurationPackages.Registrar.class)
借助@Import導(dǎo)入了AutoConfigurationPackages.Registrar類到IOC容器克懊,
通過AutoConfigurationPackages.Registrar來注冊(cè)了一個(gè)類型為BasePackages的bean忱辅,其屬性中保存了basePackageName。1.2.2中會(huì)分析@Import谭溉。
1.2.2墙懂、@Import注解
@Import注解只有基礎(chǔ)注解,并有一個(gè) value()屬性夜只,用來接收一個(gè)Class垒在。
查看@Import注釋
譯:用于導(dǎo)入一個(gè)或多個(gè)組件類(通常是@Configuration所標(biāo)記的類)蒜魄。其特性與Spring XML 中的 <import/>標(biāo)簽類似扔亥, 可以導(dǎo)入 @Configuration標(biāo)記的類、ImportSelector 和 ImportBeanDefinitionRegistrar 的實(shí)現(xiàn)類谈为,以及普通Component組建(從 4.2 開始旅挤;類似于 AnnotationConfigApplicationContext.register)。
在導(dǎo)入的@Configuration 類中聲明的@Bean 定義伞鲫,可以通過@Autowired 來注入使用粘茄。 要么bean 本身可以被autowired,要么定義bean配置類實(shí)例可以被autowired秕脓。 后一種可以@Configuration 標(biāo)記的配置類方法之間進(jìn)行顯式的柒瓣、IDE 友好的導(dǎo)航跳轉(zhuǎn)》图埽可以標(biāo)記在類上或其他注解上芙贫。如果需要導(dǎo)入 XML 或其他非@Configuration bean 定義資源,請(qǐng)改用@ImportResource 注解傍药。
翻譯水平有限磺平,將就著看吧。簡(jiǎn)而言之:這是一個(gè)用于導(dǎo)入其他組建或者配置類的注解。
1.3 @ComponentScan
@SpringBootApplication中是這樣使用的:
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})
@ComponentScan全路徑是org.springframework.context.annotation.@ComponentScan育韩,其本身是spring ioc中定義的宵晚,用于定義IOC容器初始化時(shí)應(yīng)該掃描并加載哪些包中的組建或配置類。
@Filter用于排除所指定的需要被掃描的包中的某些類菠劝。
至此赊舶,@SpringBootApplication注解相關(guān)代碼就分析完了。