最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別

 更新時間:2023年08月04日 10:05:13   作者:flydean程序那些事  
這篇文章主要介紹了SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別,@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合,需要的朋友可以參考下

@EnableAutoConfiguration 注解 和 @Configuration注解的區(qū)別

在Spring Boot中,我們會使用@SpringBootApplication來開啟Spring Boot程序。

在之前的文章中我們講到了@SpringBootApplication相當(dāng)于@EnableAutoConfiguration,@ComponentScan,@Configuration三者的集合。

其中@Configuration用在類上面,表明這個是個配置類,如下所示:

@Configuration
public class MySQLAutoconfiguration {
    ...
}

而@EnableAutoConfiguration則是開啟Spring Boot的自動配置功能。

什么是自動配置功能呢?

簡單點說就是Spring Boot根據(jù)依賴中的jar包,自動選擇實例化某些配置。

接下來我們看一下@EnableAutoConfiguration是怎么工作的。

先看一下@EnableAutoConfiguration的定義:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};
	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};
}

注意這一行: @Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector實現(xiàn)了ImportSelector接口,并會在實例化時調(diào)用selectImports。下面是其方法:

public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
				annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

這個方法中的getCandidateConfigurations會從類加載器中查找所有的META-INF/spring.factories,并加載其中實現(xiàn)了@EnableAutoConfiguration的類。

有興趣的朋友可以具體研究一下這個方法的實現(xiàn)。

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
		MultiValueMap<String, String> result = cache.get(classLoader);
		if (result != null) {
			return result;
		}
		try {
			Enumeration<URL> urls = (classLoader != null ?
					classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
					ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
			result = new LinkedMultiValueMap<>();
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				UrlResource resource = new UrlResource(url);
				Properties properties = PropertiesLoaderUtils.loadProperties(resource);
				for (Map.Entry<?, ?> entry : properties.entrySet()) {
					String factoryTypeName = ((String) entry.getKey()).trim();
					for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
						result.add(factoryTypeName, factoryImplementationName.trim());
					}
				}
			}
			cache.put(classLoader, result);
			return result;
		}
		catch (IOException ex) {
			throw new IllegalArgumentException("Unable to load factories from location [" +
					FACTORIES_RESOURCE_LOCATION + "]", ex);
		}
	}

我們再看一下spring-boot-autoconfigure-2.2.2.RELEASE.jar中的META-INF/spring.factories。

spring.factories里面的內(nèi)容是key=value形式的,我們重點關(guān)注一下EnableAutoConfiguration:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
...

這里只列出了一部分內(nèi)容,根據(jù)上面的代碼, 所有的EnableAutoConfiguration的實現(xiàn)都會被自動加載。這就是自動加載的原理了。

如果我們仔細去看具體的實現(xiàn):

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter(JmxAutoConfiguration.class)
@ConditionalOnProperty(prefix = "spring.application.admin", value = "enabled", havingValue = "true",
		matchIfMissing = false)
public class SpringApplicationAdminJmxAutoConfiguration {

可以看到里面使用了很多@Conditional*** 的注解,這種注解的作用就是判斷該配置類在什么時候能夠起作用。

到此這篇關(guān)于SpringBoot中@EnableAutoConfiguration和@Configuration的區(qū)別的文章就介紹到這了,更多相關(guān)@EnableAutoConfiguration和@Configuration內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Feign簡單使用詳解

    Spring Cloud Feign簡單使用詳解

    本篇文章主要介紹了Spring Cloud Feign簡單使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Mybatis使用update更新值為null時不生效問題解決

    Mybatis使用update更新值為null時不生效問題解決

    這篇文章主要介紹了Mybatis使用update更新值為null時不生效問題解決,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • PageHelper引發(fā)的幽靈數(shù)據(jù)問題解析

    PageHelper引發(fā)的幽靈數(shù)據(jù)問題解析

    這篇文章主要為大家介紹了PageHelper引發(fā)的幽靈數(shù)據(jù)問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java中Executor接口用法總結(jié)

    Java中Executor接口用法總結(jié)

    這篇文章主要介紹了Java中Executor接口用法,較為詳細的總結(jié)了Executor接口的定義、創(chuàng)建及用法,需要的朋友可以參考下
    2015-06-06
  • Java包裝類之自動裝箱與拆箱

    Java包裝類之自動裝箱與拆箱

    這篇文章主要介紹了Java包裝類之自動裝箱與拆箱,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java Char的簡單工具類CharUtil分享

    Java Char的簡單工具類CharUtil分享

    下面小編就為大家分享一篇Java Char的簡單工具類CharUtil,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • java8保姆級lambda表達式教程

    java8保姆級lambda表達式教程

    這篇文章主要介紹了Java8之后的Lambda表達式的用法,lambda表達式將大量替代匿名內(nèi)部類的使用,簡化代碼的同時,更突出了原來匿名內(nèi)部類中最重要的那部分包含真正邏輯的代碼,需要的朋友可以參考下
    2023-03-03
  • Java實現(xiàn)線性表的順序存儲

    Java實現(xiàn)線性表的順序存儲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)線性表的順序存儲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Spring Hibernate實現(xiàn)分頁功能

    Spring Hibernate實現(xiàn)分頁功能

    這篇文章主要為大家詳細介紹了Spring Hibernate實現(xiàn)分頁功能的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Intellij搭建springmvc常見問題解決方案

    Intellij搭建springmvc常見問題解決方案

    這篇文章主要介紹了Intellij搭建springmvc常見問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10

最新評論

阆中市| 温宿县| 沿河| 华蓥市| 九江市| 武宁县| 安平县| 玛多县| 叶城县| 乐业县| 昂仁县| 淄博市| 秦皇岛市| 金昌市| 屏边| 五华县| 财经| 牟定县| 平潭县| 林口县| 宿迁市| 堆龙德庆县| 武胜县| 石柱| 邢台县| 白山市| 宝坻区| 牟定县| 镇平县| 新疆| 澄迈县| 伊川县| 博野县| 琼海市| 苏尼特右旗| 永年县| 洛隆县| 涟水县| 桓台县| 黄冈市| 铜山县|