中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot自動配置的實現原理是什么

發布時間:2022-08-16 09:39:15 來源:億速云 閱讀:181 作者:iii 欄目:開發技術

這篇文章主要介紹“SpringBoot自動配置的實現原理是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringBoot自動配置的實現原理是什么”文章能幫助大家解決問題。

一、什么是springboot自動配置

SpringBoot通過@EnableAutoConfiguration注解開啟自動配置,對jar包下的spring.factories文件進行掃描,這個文件中包含了可以進行自動配置的類,當滿足@Condition注解指定的條件時,便在依賴的支持下進行實例化,注冊到Spring容器中。

通俗的來講,我們之前在寫ssm項目時候,配置了大量坐標和配置內容,搭環境的過程在項目開發中占據了大量時間,SpringBoot的最大的特點就是簡化了各種xml配置內容,所以springboot的自動配置就是用注解來對一些常規的配置做默認配置,簡化xml配置內容,使你的項目能夠快速運行。

springboot核心配置原理:

  • 自動配置類都存放在spring-boot-autoconfigure-版本號.jar下的org.springframework.boot.autoconfigure中

  • 當我們在application.properties中配置debug=true后啟動容器。可以看到服務器初始化的初始化配置

  • DispatcherServletAutoConfigratio注冊前端控制器

  • EmbeddedServletContainerAutoConfiguration注冊容器類型

  • HttpMessageConvertersAutoConfiguration注冊json或者xml處理器

  • JacksonAutoConfiguration注冊json對象解析器

  • 如果加入其他功能的依賴,springBoot還會實現這些功能的自動配置

SpringBoot自動配置的實現原理是什么

二、Starter組件

Starter組件是可被加載在應用中的Maven依賴項項。只有在Maven配置中添加對應的依賴配置,即可使用對應的Starter組件。例如,添加spring-boot-starter-web依賴,就可以用于構建RESTAPI服務,其包含了SpringMVC和Tomcat內嵌容器。

一個完整的Starter組件包括以下兩點:

  • 提供自動配置功能的自動配置模塊

  • 提供依賴關系管理崗功能的組件模塊,即封裝了組件所有功能,開箱即用。

spring-boot-starter-web依賴源碼

package org.springframework.boot.autoconfigure.web.servlet;
@Configuration
@ConditionalOnClass({ServletRequest.class})
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class})
public class ServletWebServerFactoryAutoConfiguration {
    ......
}
@

三、三大注解

@SpringBootConfiguration:繼承自Configuration,支持JavaConfig的方式進行配置。

@EnableAutoConfiguration:本文重點講解,主要用于開啟自動配置。

@ComponentScan:自動掃描組件,默認掃描該類所在包及其子包下所有帶有指定注解的類,將它們自動裝配到bean容器中,會被自動裝配的注解包括@Controller、@Service、@Component、@Repository等。也可以指定掃描路徑。

四、@EnableAutoConfiguration

這個注解是幫助我們自動加載默認配置的,它里面有兩個關鍵注解@AutoConfigurationPackage和@Import,我們來詳細了解@Import注解。

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//檢查自動配置功能是否開啟,默認開啟
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		//加載自動配置的元信息
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//獲取候選配置類
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		//去掉重復的配置類
		configurations = removeDuplicates(configurations);
		//獲得注解中被exclude和excludeName排除的類的集合
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		//檢查被排除類是否可實例化、是否被自動注冊配置所使用,不符合條件則拋出異常
		checkExcludedClasses(configurations, exclusions);
		//從候選配置類中去除掉被排除的類
		configurations.removeAll(exclusions);
		//過濾
		configurations = filter(configurations, autoConfigurationMetadata);
		//將配置類和排除類通過事件傳入到監聽器中
		fireAutoConfigurationImportEvents(configurations, exclusions);
		//最終返回符合條件的自動配置類的全限定名數組
		return StringUtils.toStringArray(configurations);

@Import(AutoConfigurationImportSelector.class)注解,這里導入AutoConfigurationImportSelector類。這個類中有一個非常重要的方法&mdash;&mdash;selectImports(),它幾乎涵蓋了組件自動裝配的所有處理邏輯,包括獲得候選配置類、配置類去重、排除不需要的配置類、過濾等,最終返回符合條件的自動配置類的全限定名數組。

五、SpringFactoriesLoader

spring-core包里定義了SpringFactoriesLoader類,這個類實現了檢索META-INF/spring.factories文件,并獲取指定接口的配置的功能。在這個類中定義了兩個對外的方法:

  • loadFactories根據接口類獲取其實現類的實例,這個方法返回的是對象列表。

  • loadFactoryNames根據接口獲取其接口類的名稱,這個方法返回的是類名的列表。

上面的兩個方法的關鍵都是從指定的ClassLoader中獲取spring.factories文件,并解析得到類名列表,具體代碼如下:

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    try {
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<String> result = new ArrayList<String>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
            String factoryClassNames = properties.getProperty(factoryClassName);
            result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
}

由代碼可知,在這個方法中會遍歷整個ClassLoader中所有jar包下的spring.factories文件。也就是說我們可以在自己的jar中配置spring.factories文件,不會影響到其它地方的配置,也不會被別人的配置覆蓋。

spring.factories的是通過Properties解析得到的,所以我們在寫文件中的內容都是安裝下面這種方式配置的:

com.xxx.interface=com.xxx.classname

關于“SpringBoot自動配置的實現原理是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新野县| 黔江区| 合江县| 昭通市| 深州市| 济阳县| 和顺县| 海宁市| 浙江省| 城口县| 霍山县| 饶河县| 乐亭县| 琼结县| 吉安县| 定远县| 双柏县| 芜湖县| 田林县| 孝义市| 余江县| 罗平县| 关岭| 孟津县| 宾阳县| 屏边| 申扎县| 江阴市| 义乌市| 稷山县| 杂多县| 高陵县| 汤阴县| 仙桃市| 肥乡县| 开江县| 铜梁县| 商都县| 会东县| 吉林市| 甘洛县|