專業(yè)鄭州做網(wǎng)站的公司百度關(guān)鍵詞seo優(yōu)化
1、我們需要從主啟動(dòng)類的@SpringBootApplication注解開始分析:
@SpringBootApplication是一個(gè)復(fù)合注解,進(jìn)入以后看到主要包括以下三個(gè)注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}
復(fù)制
2、這三個(gè)注解的功能如下:
@SpringBootConfiguration:底層還是一個(gè)@Configuration,代表當(dāng)前是一個(gè)配置類。
@ComponentScan:指定組件掃描的類型和范圍。
@EnableAutoConfiguration:開啟自動(dòng)配置,這個(gè)注解是自動(dòng)配置的重點(diǎn)
3、進(jìn)入@EnableAutoConfiguration可看到:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
復(fù)制
@AutoConfigurationPackage作用:自動(dòng)配置包,指定類默認(rèn)的包規(guī)則。具體來說就是利用Registrar將指定包(主啟動(dòng)類所在包)下的一系列組件導(dǎo)入到容器中。
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
復(fù)制
@Import(AutoConfigurationImportSelector.class)作用:
1、利用getAutoConfigurationEntry(annotationMetadata);給容器中批量導(dǎo)入一些組件 2、調(diào)用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)獲取到所有需要導(dǎo)入到容器中的配置類 3、利用工廠加載 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的組件 4、從META-INF/spring.factories位置來加載一個(gè)文件。默認(rèn)掃描我們當(dāng)前系統(tǒng)里面所有META-INF/spring.factories位置的文件。
重點(diǎn)就是掃描spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面的META-INF/spring.factories,文件里面寫死了spring-boot一啟動(dòng)就要給容器中加載的所有配置類,總共127個(gè)。(!!!注意:這個(gè)個(gè)數(shù)的話,不同的版本是不同的,spring-boot-autoconfigure-2.6.4.jar是133個(gè)!!!)
4、按需開啟自動(dòng)配置項(xiàng)
雖然這127個(gè)場景的所有自動(dòng)配置在啟動(dòng)的時(shí)候默認(rèn)全部加載。但不會(huì)全部生效。最終某一個(gè)xxxxAutoConfiguration會(huì)按照條件裝配規(guī)則(@Conditional)進(jìn)行生效,實(shí)現(xiàn)按需開啟。
5、修改默認(rèn)配置
springboot非常細(xì)心和人性化,為了防止有些用戶的配置不符合規(guī)范,springboot會(huì)通過代碼將其強(qiáng)制規(guī)范,如下面文件上傳解析器的例子,若用戶定義的上傳解析器的名字不是multipartResolver,經(jīng)過下面的代碼后,會(huì)強(qiáng)制命名為multipartResolver:
@Bean
@ConditionalOnBean(MultipartResolver.class) //容器中有這個(gè)類型組件
@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中沒有這個(gè)名字 multipartResolver 的組件
public MultipartResolver multipartResolver(MultipartResolver resolver) {//給@Bean標(biāo)注的方法傳入了對(duì)象參數(shù),這個(gè)參數(shù)的值就會(huì)從容器中找。//SpringMVC multipartResolver。防止有些用戶配置的文件上傳解析器不符合規(guī)范// Detect if the user has created a MultipartResolver but named it incorrectlyreturn resolver;
}
復(fù)制
6、用戶可自定義組件的配置
SpringBoot默認(rèn)會(huì)在底層配好所有的組件。但是如果用戶自己配置了的話,就以用戶的優(yōu)先。
7、總結(jié):
- SpringBoot先加載所有的自動(dòng)配置類 xxxxxAutoConfiguration
- 每個(gè)自動(dòng)配置類按照條件進(jìn)行生效,默認(rèn)都會(huì)綁定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件進(jìn)行了綁定
- 生效的配置類就會(huì)給容器中裝配很多組件
- 只要容器中有這些組件,相當(dāng)于這些功能就有了
- 定制化配置
- 用戶直接自己@Bean替換底層的組件。
- 用戶直接去配置文件進(jìn)行修改。