上篇我們說到 springboot 和 SSM 框架的區別,今天我們就看看 springboot 到底為我們做了哪些事情,讓我們開發變得如此簡單。
springboot 中起着重要作用的是 starter,starter 主要有兩個作用:
1.引入相關的 jar 包
2.自動完成 bean 的配置
當我們創建 springboot 項目時選擇 mybatis,mysql 組件,可以看到 pom 文件幫我們加入了對應的 starter。
可別小看這些 starter,正是它們幫我們引入了相關的 jar 包,雖然項目里只有這幾個依賴,但可以看到 maven 已經幫我們下載了這么多 jar 包
我們知道,雖然創建 ssm 項目的步驟很繁瑣,卻都是必不可少的,我們就以 mybatis starter 為例,一步一步來看 springboot 是如何幫我們完成這些配置的。
1,springboot 通過條件依賴注解解決了 bean 之間的沖突
如下圖所示,我們看到 ConditionalOnClass ,ConditionalOnSingleCandidate 指明了這個 bean 依賴括號里的 bean 存在,就意味着先有括號里的 bean,才去實例化我們需要的這個 bean,利用這個功能,bean 之間的依賴順序得到了很好的解決,這些是 springboot 新加的功能
2,bean 需要的參數可以在 yml / properties文件里配置
上圖我們可以看到,在 application.properties 文件中配置了數據庫連接地址,登錄名,密碼,以及 mybatis 的一些參數,但這些參數是怎么被讀取的呢 ?
在 MybatisAutoConfiguration.class 文件中,有這么一個注解
我們接下來看一看 MybatisProperties.class 里面有什么
有沒有發現,這里面的屬性,就是我們在 yml/properties 里配置的一些參數,所以下次想知道 mybatis 可以配置什么參數,我們就可以進這個文件里看看有哪些屬性了
當然你肯定發現,我們在 yml/properties 配置參數時,編譯器會幫我們自動補全,這個主要是掃描一個 json 文件
3,bean 配置通過 spring.factories 文件加載
當我們啟動項目時,會掃描 jar 包 META-INF 文件夾下的 spring.factories 文件,就會去加載對應的配置文件
starter 幫我們做了這部分內容,我們就可以考慮,把一些通用的組件,制成一個屬於我們自己的 starter
1.首先我們要再重申一下 starter 的兩個重要作用
a. 引入相關的 jar;
b. 自動配置;
2. starter 的命名規范
a. spring 提供的 starter:
spring-boot-starter-XXX-x.y.z.jar
spring-boot-XXX-autoconfigure-x.y.z.jar
b. 第三方提供的 jar
XXX-spring-boot-starter-x.y.z.jar
XXX-spring-boot-autoconfigure-x.y.z.jar
3. 自己制作第三方 starter 的步驟
a.准備第三方的 jar
新建一個 maven 工程,寫好需要的功能,執行 maven install,打成 jar 包
b.制作 starter
(1)新建一個 springboot 工程,引入剛打成的 jar 包,為了生成配置元信息,引入一個依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
(2)編寫自動配置類
這是我寫的一個簡單的配置類,CommonProperties 文件是我們需要的參數,如下圖所示,我們想配置這些參數時,就在 yml/properties 文件中以 com.common 開頭即可
(3)在 resource 下新建 META-INF 文件夾,在該文件夾下建 spring.properties 文件,確定spring要加載,啟用這個配置
這樣,啟動項目時,就會加載編寫的配置類,生成需要的 bean。
把這個項目打成 jar 包,我們的第一個 starter 就做好了,在自己項目中引入我們做好的 jar 包,就可以開始使用啦,是不是很簡單,springboot 使用 starter 簡化了我們的配置,還讓我們可以自己制作 starter,把自己常用的一些功能制成可以通用的 jar 包,實在為我們的開發提供了很大的便利,我們不僅要會使用它,還要明白里面的原理,這樣面對問題時,才能很快找到問題所在。
這篇文章真的拖了好久才寫完,接下來再接再厲,共同進步!