spring?boot3自動(dòng)配置與手動(dòng)配置的全過(guò)程
springboot自動(dòng)配置
自動(dòng)配置了大量組件,配置信息可以在application.properties文件中修改。
當(dāng)添加了特定的Starter POM后,springboot會(huì)根據(jù)類路徑上的jar包來(lái)自動(dòng)配置bean(比如:springboot發(fā)現(xiàn)類路徑上的MyBatis相關(guān)類,springboot會(huì)自動(dòng)配置MyBatis相關(guān)的bean)。
springboot使用默認(rèn)配置來(lái)設(shè)置這些功能,開(kāi)發(fā)人員也可以自定義配置來(lái)覆蓋默認(rèn)配置。
這些配置信息如何生效的?
通過(guò)@ConfigurationProperties注解將配置信息注入到組件中的屬性類的。屬性類一般以Properties結(jié)尾。比如tomcat組件的ServerProperties類,就是將配置信息中server開(kāi)頭的配置注入到屬性中,比如server.port=8080會(huì)被綁定到屬性中
@ConfigurationProperties("server")
public class ServerProperties {
private @Nullable Integer port;
private @Nullable InetAddress address;
.....
}自動(dòng)配置是按需加載的
springboot提供很多自動(dòng)配置類,這些自動(dòng)配置不是全部生效,它是按需加載的,導(dǎo)入了哪個(gè)啟動(dòng)器,則該啟動(dòng)器對(duì)應(yīng)的配置類才會(huì)被加載。
任何啟動(dòng)器都會(huì)關(guān)聯(lián)一個(gè)啟動(dòng)器:spring-boot-Starter,它是springboot框架最核心的啟動(dòng)器。
spring-boot-Starter又關(guān)聯(lián)引入spring-boot-auto從figure。所有的自動(dòng)配置類都在這里。
自動(dòng)配置類用來(lái)創(chuàng)建相應(yīng)的組件。
按需加載如何實(shí)現(xiàn)?
使用條件注解可以實(shí)現(xiàn)按需加載。
條件注解基于某些條件決定是否應(yīng)該創(chuàng)建一個(gè)bean。這些注解通常用在自動(dòng)配置類上,以確保只有在特定條件滿足時(shí)才會(huì)應(yīng)用相應(yīng)的配置。
條件注解可以用在類上,也可以用在方法上。
常見(jiàn)的條件注解有:
- @ConditionalOnClass 指定類存在時(shí)才創(chuàng)建bean
- @ConditionalOnMissingClass 指定類不存在時(shí)才創(chuàng)建bean
- @ConditionalOnBean 容器中存在指定bean時(shí)才創(chuàng)建bean
- @ConditionalOnMissingBean 容器中不存在指定bean時(shí)才創(chuàng)建bean
- @ConditionalOnProperty 配置文件中存在指定屬性時(shí),才創(chuàng)建bean
- @ConditionalOnResource 指定資源存在時(shí)才創(chuàng)建bean
- @ConditionalOnWebApplication 應(yīng)用程序是Web應(yīng)用時(shí)才創(chuàng)建bean
- @ConditionalOnNotWebApplication 應(yīng)用程序不是Web應(yīng)用時(shí)才創(chuàng)建bean
修改默認(rèn)的包掃描規(guī)則
修改掃描規(guī)則有2種方式:
在主入口類上添加以下注解的任意一個(gè)都可以修改包掃描規(guī)則(掃描com包及其子孫包)
@ComponentScan("com")@SpringBootApplication(scanBasePackages = "com")
自動(dòng)配置的實(shí)現(xiàn)原理
- 程序從main方法開(kāi)始執(zhí)行,主入口類上使用@SpringBootApplication進(jìn)行標(biāo)注
- @SpringBootApplication是復(fù)合注解,代表以下三個(gè)注解的功能
- a. @SpringBootConfiguration:它被@Configuration標(biāo)注。表明主入口類是一個(gè)配置類,此時(shí)該配置開(kāi)始加載。
- b. @ComponentScan 默認(rèn)掃描主入口類所在包及其子孫包,因此spring-boot-autoconfigure 自動(dòng)配置類是無(wú)法加載的,那么這些自動(dòng)配置類又是怎么生效的呢?
- c. @EnableAutoConfiguration 該注解的作用就是啟用自動(dòng)配置
- @EnableAutoConfiguration 被@Import({AutoConfigurationImportSelector.class})標(biāo)注
? @Import({AutoConfigurationImportSelector.class})的作用是將AutoConfigurationImportSelector作為一個(gè)bean加載到Ioc容器中
? 這個(gè)bean的作用是:負(fù)責(zé)收集和選擇所有符合條件的自動(dòng)配置類。
總結(jié)
- 運(yùn)行環(huán)境準(zhǔn)備階段
- 引入Web啟動(dòng)器
- 最終傳遞引入了自動(dòng)配置的jar包
- 自動(dòng)配置的jar包中有152個(gè)自動(dòng)配置類,到此運(yùn)行環(huán)境準(zhǔn)備完畢
- 運(yùn)行階段
- @EnableAutoConfiguration 啟用自動(dòng)配置,將152個(gè)自動(dòng)配置類全部加載到Ioc容器中。然后根據(jù)開(kāi)發(fā)場(chǎng)景篩選出必須得自動(dòng)配置類
- 自動(dòng)配置類加載了很多組件
- 每個(gè)組件需要的數(shù)據(jù)來(lái)自屬性類
- 屬性類的屬性來(lái)自配置文件
總之一句話。導(dǎo)入啟動(dòng)器,修改配置文件。就可以完成對(duì)應(yīng)功能的開(kāi)發(fā)。
springmvc配置
# 讓springboot的靜態(tài)資源處理失效 spring.web.resources.add-mappings=false # 配置靜態(tài)資源的訪問(wèn)URL spring.mvc.static-path-pattern=/** # 靜態(tài)資源文件存儲(chǔ)位置默認(rèn)配置 spring.web.resources.static-locations=classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
springboot對(duì)靜態(tài)資源是如何處理的?
什么樣的URL ?訪問(wèn)哪個(gè)位置上的資源文件?
webjars
webjars是現(xiàn)在前后端分離中比較重要的一種靜態(tài)資源打包方式。
webjars是一種常用的前端庫(kù)(如jQuery)打包成jar包的形式,方便在java程序中使用。
webjars提供了一種標(biāo)準(zhǔn)化的方式來(lái)管理前端庫(kù),使其更容易集成到j(luò)ava項(xiàng)目中,并且可以利用Maven的依賴管理功能。
<!-- webjars,將前端庫(kù)打成jar包-->
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>vue</artifactId>
<version>3.5.12</version>
</dependency>
默認(rèn)規(guī)則是:當(dāng)請(qǐng)求路徑是/wbjars/**,則會(huì)去classpath:/MEAT-INF/resources/webjars/找。
靜態(tài)資源緩存處理
靜態(tài)資源緩存是指瀏覽器的緩存行為,瀏覽器可以緩存(js、CSS、圖片、聲音、視頻)到瀏覽器中,下一次用戶訪問(wèn)同樣的資源就直接從緩存中獲取,不再?gòu)姆?wù)器獲取,這樣能減少服務(wù)器壓力,提高相應(yīng)效率。
可以通過(guò)配置來(lái)修改默認(rèn)的緩存機(jī)制。
#靜態(tài)資源緩存設(shè)置 #緩存有效期設(shè)置 spring.web.resources.cache.period=3600 # 緩存控制設(shè)置 spring.web.resources.cache.cachecontrol.max-age=20 # 是否啟用最后一次修改時(shí)間的比對(duì) spring.web.resources.cache.use-last-modified=true
靜態(tài)index.html的支持
spring會(huì)自動(dòng)處理位于靜態(tài)資源目錄下的index.html(文件名必須是index.html),使其成為應(yīng)用程序的主頁(yè)。
注意:此時(shí)不能配置靜態(tài)資源訪問(wèn)url(spring.mvc.static-path-pattern),必須使用默認(rèn)的配置
favicon.ico
將favicon.ico放在靜態(tài)資源根目錄下,就會(huì)自動(dòng)生效。
spring boot的web手動(dòng)配置(靜態(tài)資源處理)
編寫代碼的方式
第一種方式 實(shí)現(xiàn)WebMvcConfigurer接口
// 添加這個(gè)注解后,表示不再使用springboot提供的默認(rèn)配置
// @EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 靜態(tài)資源處理需要重寫的方法
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 使用注冊(cè)器registry 綁定 pathPatterns 以及真實(shí)的靜態(tài)資源文件存儲(chǔ)路徑
registry.addResourceHandler("/abc/**") // 配置路徑訪問(wèn)模式
.addResourceLocations("classpath:/static1/", "classpath:/static2/", "classpath:/static3/"); // 配置靜態(tài)資源路徑
}
}第二種方式
@Configuration
public class WebConfig2 {
@Bean
public WebMvcConfigurer addResourceHandlers() {
return new WebMvcConfigurer() {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/abc/**") // 配置路徑訪問(wèn)模式
.addResourceLocations("classpath:/static1/", "classpath:/static2/", "classpath:/static3/"); // 配置靜態(tài)資源路徑
}
};
}
}web請(qǐng)求的路徑匹配
# 前端請(qǐng)求的url 匹配到controller中的某個(gè)方法 # 使用ant風(fēng)格的路徑匹配規(guī)則,默認(rèn)值是path_pattern_matcher # path_pattern_matcher兼容且支持ant風(fēng)格 # 在ant風(fēng)格中** 可以出現(xiàn)在任何位置,但在path_pattern_matcher風(fēng)格中,** 只能出現(xiàn)在末尾 # spring6 下的ant風(fēng)格 ** 也只能出現(xiàn)在末尾 spring.mvc.pathmatch.matching-strategy=ant_path_matcher
到此這篇關(guān)于spring boot3自動(dòng)配置與手動(dòng)配置的文章就介紹到這了,更多相關(guān)spring boot自動(dòng)配置與手動(dòng)配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot多模塊項(xiàng)目中優(yōu)雅實(shí)現(xiàn)自動(dòng)配置的完整指南
- Spring Boot 自動(dòng)配置的底層實(shí)現(xiàn)原理深度解析
- 一文徹底弄懂Spring?Boot自動(dòng)配置
- Spring Boot 自動(dòng)配置原理實(shí)現(xiàn)機(jī)制深度解析(實(shí)戰(zhàn)示例)
- SpringBoot啟動(dòng)過(guò)程與自動(dòng)配置過(guò)程解讀
- SpringBoot實(shí)現(xiàn)自動(dòng)配置全過(guò)程
- 一文詳解SpringBoot如何創(chuàng)建自定義的自動(dòng)配置
- SpringBean管理與Spring Boot自動(dòng)配置原理解析
- SpringBoot實(shí)現(xiàn)自動(dòng)配置的方式詳解
- Spring Boot 自動(dòng)配置原理的使用小結(jié)
相關(guān)文章
java實(shí)現(xiàn)字符與Unicode碼轉(zhuǎn)換(附源碼)
在 Java 開(kāi)發(fā)中,經(jīng)常需要在字符(char 或 String)與其對(duì)應(yīng)的Unicode 碼點(diǎn)(int)之間進(jìn)行相互轉(zhuǎn)換,下面小編就來(lái)和大家詳細(xì)介紹一下具體實(shí)現(xiàn)方法吧2025-07-07
spring?boot?Slf4j日志框架的體系結(jié)構(gòu)詳解
在項(xiàng)目開(kāi)發(fā)中記錄日志是必做的一件事情,springboot內(nèi)置了slf4j日志框架,下面這篇文章主要給大家介紹了關(guān)于spring?boot?Slf4j日志框架的體系結(jié)構(gòu),需要的朋友可以參考下2022-05-05
SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼
本篇文章主要介紹了SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
springboot layui hutool Excel導(dǎo)入的實(shí)現(xiàn)
本文主要介紹了springboot layui hutool Excel導(dǎo)入的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
基于Apache組件分析對(duì)象池原理的實(shí)現(xiàn)案例分析
本文從對(duì)象池的一個(gè)簡(jiǎn)單案例切入,主要分析common-pool2組件關(guān)于:池、工廠、配置、對(duì)象管理幾個(gè)角色的源碼邏輯,并且參考其在Redis中的實(shí)踐,對(duì)Apache組件分析對(duì)象池原理相關(guān)知識(shí)感興趣的朋友一起看看吧2022-04-04

