springboot自动加载新的配置(springboot动态添加数据源)

技术Spring Boot怎么排除自动加载数据源本篇内容介绍了“Spring Boot怎么排除自动加载数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧

本篇内容介绍了”跳脚怎么排除自动加载数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

有些老项目使用弹簧手动音量调节里面有写好的数据库连接池,比如redis/mongodb/mybatis(mysql其他神谕同理)。在这些项目迁入板簧罩框架时,会报错。

原因是我们业务写好了连接池,但板簧罩在冲突包存在的时候会主动加载板簧罩的自动配置创建连接池,但我们并未配置Spring Boot参数,也不需要配置。

1. mongodb

mongodb自动配置错误如下:

连接到服务器本地主机时,监视器线程中出现异常:33363636366

打开套接字时出现异常

由: Java。净。connectionexception :连接被拒绝(连接被拒绝)引起

但是我没有引入spring-boot-starter-data-MongoDB的冲突包,后来发现我引入了spring-data-mongodb的冲突

检查spring-boot-starter-data-MongoDB的罐子,包括3部分,如下:

SpringBoot怎么排除自动加载数据源

我的冲突包都有,相当于这些冲突拼装成了spring-boot-starter-data-MongoDB

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

SpringBoot怎么排除自动加载数据源

SpringBoot怎么排除自动加载数据源

需要手动排除自动配置的数据源,在回弹应用中排除

@回弹应用程序(排除={MongoAutoConfiguration.class,MongoDataAutoconfiguration。类})启动不再报错连接localhost:27017,业务正常。原理见Spring Boot官方文档

SpringBoot怎么排除自动加载数据源

2. mybatis

mybatis同理

未能自动配置数据源: “弹簧。数据源。网址”未指定,并且没有嵌入数据********************

应用程序无法启动

***************************

描述:

无法确定数据库类型没有人的嵌入式数据库驱动程序类

操作:

如果您想要一个嵌入式数据库,请将一个受支持的数据库放在类路径中。如果您有要从特定配置文件加载的数据库设置,您可能需要激活它(当前没有任何配置文件处于活动状态)。

需要排除

@回弹应用(排除=nb

sp;{DataSourceAutoConfiguration.class})

3. 原理讲解

原理是EnableAutoConfiguration

Spring Boot怎么排除自动加载数据源

进一步跟踪:

Spring Boot怎么排除自动加载数据源

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";

“Spring Boot怎么排除自动加载数据源”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/149830.html

(0)

相关推荐

  • 宫寒不孕症状,不孕的原因就只是“宫寒”吗

    技术宫寒不孕症状,不孕的原因就只是“宫寒”吗日常生活中我们经常会听到有人说怀不上孩子是因为“宫寒”宫寒不孕症状,这其实是一个误区。不孕是有多种原因导致的生育状态障碍,男女双方因素都有,在这里我们主要谈论女性因素导致的不孕

    生活 2021年10月27日
  • 织梦火车站和discuz哪个好(织梦模板和discuz区别)

    技术织梦是如何与discuz论坛整合一起应用本篇文章为大家展示了织梦是如何与discuz论坛整合一起应用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  成功在DedeCMS 5

    攻略 2021年12月22日
  • 风衣怎么搭配好看,风衣里面怎么搭配比较好看

    技术风衣怎么搭配好看,风衣里面怎么搭配比较好看风衣外套是春秋季节必备的时尚单品,但是风衣虽经典,但不是什么人都能HOLD住的,风衣搭配不到位,根本无美感可言,很多人不清楚风衣里面穿什么好看,下面就一起看看风衣里面的搭配技

    生活 2021年10月30日
  • 接头发,接头发需要多少钱,求真实答案

    技术接头发,接头发需要多少钱,求真实答案这个具体要看你接什么价位的,我是说假发的发质,有全假的合成纤维发,有半真半假的一半纤维一半真发,有全真的受损发,有全真的健康发等接头发。有一块钱一束,三块一束,八块一束。一般五块钱

    生活 2021年10月31日
  • with是介词吗,on和with不都是介词吗

    技术with是介词吗,on和with不都是介词吗这两个字都是介系词with是介词吗。介词(preposition 简写prep.)又称作前置词,表示名词、代词等与句中其他词的关系,在句中不能单独作句子成分。介词后面一般有

    生活 2021年10月29日
  • 4k 10bit hdr 视频使用 svp 插帧, madvr 渲染教程

    技术4k 10bit hdr 视频使用 svp 插帧, madvr 渲染教程 4k 10bit hdr 视频使用 svp 插帧, madvr 渲染教程1 技术选型
    1.1 为什么用 MPC-BE 而不是

    礼包 2021年11月22日