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