Spring Boot 項(xiàng)目啟動(dòng)機(jī)制
1. 前言
很多同學(xué),學(xué)了很久的 Spring ,也用了很久的 Spring ,卻還是不知道 Spring 是什么?Spring 中 XML / 注解 / Java 類三種配置方式,有什么區(qū)別和聯(lián)系。
上面兩個(gè)問題,正是理解 Spring Boot 的關(guān)鍵!
Spring 本質(zhì)上是一個(gè)容器,里面存放的是 Java 對(duì)象,放入容器的 Java 對(duì)象被稱為 Spring 組件(Bean)。
而 XML / 注解 / Java 類三種配置方式,只是形式不同,目的都是在容器中注冊(cè) Bean 。三種方式可以同時(shí)使用,只是需要注意, Bean 命名不要發(fā)生沖突。
當(dāng)我們使用 Spring Boot 時(shí)會(huì)有變化嗎?實(shí)際上,容器還是那個(gè)容器,配置也還是那三種配置。當(dāng)然 Spring Boot 本身就是為了簡化配置,所以基本不再使用 XML 配置方式了。
我們打個(gè)比方, Spring 是插鑰匙啟動(dòng)的轎車,而 Spring Boot 是無鑰匙啟動(dòng)的轎車。功能和原理是幾乎一樣的, Spring Boot 更加簡單方便而已。
2. Spring Boot 是如何啟動(dòng)的
Spring Boot 項(xiàng)目生成后,只有簡簡單單一個(gè)類,簡單優(yōu)雅,賞心悅目!
實(shí)例:
@SpringBootApplication
public class SpringBootHelloApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootHelloApplication.class, args);
}
}
我們來分析下這段代碼, public static void main
是普通的 main 方法,是程序執(zhí)行的入口。
SpringApplication.run
看字面意思就知道,這是 Spring 應(yīng)用的啟動(dòng)方法,運(yùn)行該行代碼后, Spring 應(yīng)用就跑起來了。
這個(gè)方法有兩個(gè)參數(shù), args 是命令行參數(shù),此處沒啥作用;另一個(gè)參數(shù)是 SpringBootHelloApplication.class
,包含類的信息。
這個(gè)類有啥信息???放眼看去,除了一個(gè)類名、一個(gè)靜態(tài)方法外,并無其他。憑這些信息就能啟動(dòng) Spring 應(yīng)用?
等等,好像還有一個(gè)注解 @SpringBootApplication
,該注解是標(biāo)注在類上的,屬于類的信息。嗯,看來 Spring Boot 啟動(dòng)的秘密就在這個(gè)注解上了。
3. 神奇的 @SpringBootApplication 注解
我們來看看這個(gè)注解到底是何方神圣!在 Eclipse 中選中該注解,按 F3 即可查看其定義。
實(shí)例:
@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ù)雜,其實(shí)就是一個(gè)組合注解,包含了多個(gè)注解的功能,咱們來分析一下。
首先是 @SpringBootConfiguration
注解,它繼承自 @Configuration
注解,功能也跟 @Configuration
一樣。它會(huì)將當(dāng)前類標(biāo)注為配置類了,我們?cè)趩?dòng)類中配置 Bean 就可以生效了。
其次是 @ComponentScan
注解,用來指定我們要掃描的包,以便發(fā)現(xiàn) Bean 。注意在默認(rèn)情況下, SpringBoot 掃描該注解標(biāo)注類所在包及其子包。當(dāng)我們的控制器、服務(wù)類等 Bean 放到不同的包中時(shí),就需要通過 @ComponentScan
注解指定這些包,以便發(fā)現(xiàn) Bean 。
最重要的是 @EnableAutoConfiguration
注解,用來啟動(dòng)自動(dòng)配置。開啟自動(dòng)配置后, Spring Boot 會(huì)掃描項(xiàng)目中所有的配置類,然后根據(jù)配置信息啟動(dòng) Spring 容器。
擁有了 @SpringBootConfiguration
,我們就擁有了一個(gè)可以拿來即用的 Spring 容器環(huán)境了。
4. 視頻演示
5. 小結(jié)
Spring Boot 實(shí)際上就是 Spring 應(yīng)用的快速開發(fā)版本,可以一鍵啟動(dòng)整個(gè) Spring 容器供我們使用。
我們運(yùn)行下啟動(dòng)類,可以看到一個(gè)顯眼的圖案,它是 Spring Boot 的啟動(dòng)標(biāo)志。接下來我們就可以,使用 Spring Boot ,來開發(fā)我們的應(yīng)用了!