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

Spring?Boot如何排除自動加載數(shù)據(jù)源

 更新時間:2021年12月15日 15:56:25   作者:fenglllle  
這篇文章主要介紹了Spring?Boot如何排除自動加載數(shù)據(jù)源,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言

有些老項目使用Spring MVC里面有寫好的數(shù)據(jù)庫連接池,比如redis/mongodb/mybatis(mysql其他Oracle同理)。在這些項目遷入spring boot框架時,會報錯。

原因是我們業(yè)務寫好了連接池,但spring boot在jar包存在的時候會主動加載spring boot的autoconfiguration創(chuàng)建連接池,但我們并未配置Spring Boot參數(shù),也不需要配置。

1. mongodb

mongodb自動配置錯誤如下:

org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
Caused by: java.net.ConnectException: Connection refused (Connection refused)

但是我沒有引入spring-boot-starter-data-mongodb的jar包,后來發(fā)現(xiàn)我引入了spring-data-mongodb的jar

檢查spring-boot-starter-data-mongodb的jar,包括3部分,如下:

我的jar包都有,相當于這些jar拼裝成了 spring-boot-starter-data-mongodb

在Spring Boot中自動引入了自動配置功能

需要手動排除自動配置的數(shù)據(jù)源,在SpringBootApplication中exclude

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

啟動不再報錯連接localhost:27017,業(yè)務正常。原理見Spring Boot官方文檔

2. mybatis

mybatis同理

Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded data

***************************
APPLICATION FAILED TO START
***************************

Description:

Cannot determine embedded database driver class for database type NONE

Action:

If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).

需要排除

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

3. 原理講解

原理是EnableAutoConfiguration

進一步跟蹤:

AutoConfigurationImportSelector這個類有自動加載與排除的邏輯

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());
}

注意加載代碼

getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
/**
	 * Return the {@link AutoConfigurationEntry} based on the {@link AnnotationMetadata}
	 * of the importing {@link Configuration @Configuration} class.
	 * @param autoConfigurationMetadata the auto-configuration metadata
	 * @param annotationMetadata the annotation metadata of the configuration class
	 * @return the auto-configurations that should be imported
	 */
	protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}


里面

getExclusions(annotationMetadata, attributes);
/**
	 * Return any exclusions that limit the candidate configurations.
	 * @param metadata the source metadata
	 * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation
	 * attributes}
	 * @return exclusions or an empty set
	 */
	protected Set<String> getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		Set<String> excluded = new LinkedHashSet<>();
		excluded.addAll(asList(attributes, "exclude"));
		excluded.addAll(Arrays.asList(attributes.getStringArray("excludeName")));
		excluded.addAll(getExcludeAutoConfigurationsProperty());
		return excluded;
	}

看到了,exclude或者excludeName,當然還有一種方法

private List<String> getExcludeAutoConfigurationsProperty() {
		if (getEnvironment() instanceof ConfigurableEnvironment) {
			Binder binder = Binder.get(getEnvironment());
			return binder.bind(PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE, String[].class).map(Arrays::asList)
					.orElse(Collections.emptyList());
		}
		String[] excludes = getEnvironment().getProperty(PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE, String[].class);
		return (excludes != null) ? Arrays.asList(excludes) : Collections.emptyList();
	}

通過application.properties文件配置spring.autoconfigure.exclude

private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude";

總結(jié)

出現(xiàn)這種錯誤多半發(fā)生在引入了spring-boot-starter-mongodb等這樣的starter插件jar,沒有配置數(shù)據(jù)源url;或者舊業(yè)務升級spring boot(筆者就是這種情況)

解決方法

不需要的jar不要引入即可解決問題

使用exclude排除,有三種實現(xiàn)方式exclude、excludeName、spring.autoconfigure.exclude

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 詳解常用的Spring Bean擴展接口

    詳解常用的Spring Bean擴展接口

    本篇文章主要介紹了一些常用的Spring Bean擴展接口以及它們的簡單用法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • JAVA 集成 PF4J 插件框架的應用場景分析

    JAVA 集成 PF4J 插件框架的應用場景分析

    PF4J是一個強大的Java插件框架,允許開發(fā)者將應用程序分解為可擴展的模塊,本文介紹了PF4J的基本概念和如何在Java項目中集成,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-03-03
  • Spring Security UserDetails實現(xiàn)原理詳解

    Spring Security UserDetails實現(xiàn)原理詳解

    這篇文章主要介紹了Spring Security UserDetails實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • springmvc 參數(shù)綁定總結(jié)

    springmvc 參數(shù)綁定總結(jié)

    本篇文章主要介紹了詳解springmvc 參數(shù)綁定,詳細的介紹了springmvc各種參數(shù)綁定的情況,具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • IDEA創(chuàng)建Java項目文件并運行教程解析

    IDEA創(chuàng)建Java項目文件并運行教程解析

    這篇文章主要介紹了IDEA創(chuàng)建Java項目文件并運行教程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Java中Redis存儲String類型會有亂碼的問題及解決方案

    Java中Redis存儲String類型會有亂碼的問題及解決方案

    在java中使用Redis存儲String類型的數(shù)據(jù)時,會出現(xiàn)亂碼,我寫了一條存儲key為name,值為虎哥的字符串,然后獲取一下這個key為name的值,打印得到的值,下面通過實例代碼介紹Java中Redis存儲String類型會有亂碼的問題及解決方案,一起看看吧
    2024-04-04
  • java實現(xiàn)簡單學生管理系統(tǒng)項目

    java實現(xiàn)簡單學生管理系統(tǒng)項目

    這篇文章主要介紹了java實現(xiàn)簡單學生管理系統(tǒng)項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Spring Boot實戰(zhàn)之發(fā)送郵件示例代碼

    Spring Boot實戰(zhàn)之發(fā)送郵件示例代碼

    本篇文章主要介紹了Spring Boot實戰(zhàn)之發(fā)送郵件示例代碼,具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • application作用域?qū)崿F(xiàn)用戶登錄擠掉之前登錄用戶代碼

    application作用域?qū)崿F(xiàn)用戶登錄擠掉之前登錄用戶代碼

    這篇文章主要介紹了application作用域?qū)崿F(xiàn)用戶登錄擠掉之前登錄用戶代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 如何把VS Code打造成Java開發(fā)IDE

    如何把VS Code打造成Java開發(fā)IDE

    這篇文章主要介紹了如何把VS Code打造成Java開發(fā)IDE,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論

婺源县| 庄河市| 琼结县| 封开县| 五莲县| 文山县| 电白县| 永川市| 灯塔市| 凤山县| 尼勒克县| 衡南县| 万荣县| 周口市| 天等县| 五台县| 章丘市| 奉节县| 喀喇沁旗| 祁阳县| 巴里| 晋城| 石狮市| 金川县| 武山县| 吉林省| 苏尼特左旗| 班玛县| 岗巴县| 汝城县| 获嘉县| 上高县| 黎川县| 镶黄旗| 高青县| 石楼县| 平泉县| 隆德县| 沙坪坝区| 双江| 错那县|