返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Boot如何排除自动加载数据源
  • 603
分享到

Spring Boot如何排除自动加载数据源

2024-04-02 19:04:59 603人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录前言1. mongoDB2. mybatis3. 原理讲解总结解决方法前言 有些老项目使用spring mvc里面有写好的数据库连接池,比如Redis/monGodb/mybat

前言

有些老项目使用spring mvc里面有写好的数据库连接池,比如Redis/monGodb/mybatis(Mysql其他oracle同理)。在这些项目迁入Spring Boot框架时,会报错。

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

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包,后来发现我引入了spring-data-mongodb的jar

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

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

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

需要手动排除自动配置的数据源,在SpringBootApplication中exclude


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

启动不再报错连接localhost:27017,业务正常。原理见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);


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


	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-starter-mongodb等这样的starter插件jar,没有配置数据源url;或者旧业务升级spring boot(笔者就是这种情况)

解决方法

不需要的jar不要引入即可解决问题

使用exclude排除,有三种实现方式exclude、excludeName、spring.autoconfigure.exclude

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Spring Boot如何排除自动加载数据源

本文链接: https://lsjlt.com/news/159986.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Boot如何排除自动加载数据源
    目录前言1. mongodb2. mybatis3. 原理讲解总结解决方法前言 有些老项目使用Spring MVC里面有写好的数据库连接池,比如redis/mongodb/mybat...
    99+
    2024-04-02
  • Spring Boot怎么排除自动加载数据源
    本篇内容介绍了“Spring Boot怎么排除自动加载数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言有些老项目使用Spr...
    99+
    2023-06-22
  • Spring Boot如何排除某个类加载注入IOC的操作
    小编给大家分享一下Spring Boot如何排除某个类加载注入IOC的操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Boot 排除某个类加载注入...
    99+
    2023-06-20
  • spring boot启动加载数据原理分析
    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。创建实现接口 CommandLine...
    99+
    2023-05-31
    spring boot 启动
  • Spring Boot 启动加载数据 CommandLineRunner的使用
    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求。 为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现。很简单,只需要一个类就可以,无需其...
    99+
    2023-05-31
    spring boot 加载
  • Spring Boot 排除某个类加载注入IOC的操作
    Spring Boot 排除某个类加载注入IOC 我们项目往往会引入其他项目的依赖,造成功能冲突的类,我们想把这些类排除掉,不注入到我们项目IoC容器中, 只加载自己的类 @Co...
    99+
    2024-04-02
  • 【Java】Spring Boot配置动态数据源
    SpringBoot配置动态数据源 一、动态多数据源的配置 1.1 创建动态数据源 通过实现Spring提供的AbstractRoutingDataSource类,可以实现自己的数据源选择逻辑,从而可...
    99+
    2023-09-15
    java spring boot 开发语言
  • 基于Spring Boot 排除自动配置的4个方法
    Spring Boot 排除自动配置 方法1 使用 @SpringBootApplication 注解,用 exclude 属性进行排除指定的类: @SpringBootAppl...
    99+
    2024-04-02
  • 基于Spring Boot排除自动配置的方法分享
    这篇文章主要讲解了“基于Spring Boot排除自动配置的方法分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于Spring Boot排除自动配置的方法分享”吧!Spring Boot...
    99+
    2023-06-20
  • Spring Boot应用中如何使用Python进行数据加载?
    在现代应用程序的开发中,数据加载是一个非常重要的环节。无论是从数据库中读取数据、从API中获取数据,或者从文件中读取数据,数据加载都是应用程序中必不可少的一个环节。但是,有时候我们需要使用一些非常特殊的数据源来加载数据,比如使用Pytho...
    99+
    2023-10-24
    load linux spring
  • Spring boot中如何配置Mybatis多数据源
    本篇文章为大家展示了Spring boot中如何配置Mybatis多数据源,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。环境准备实验环境:JDK 1.8Spring...
    99+
    2024-04-02
  • spring boot如何实现自定义配置源
    这篇文章给大家分享的是有关spring boot如何实现自定义配置源的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述我们知道,在Spring boot中可以通过xml或者@ImportResource 来引入自...
    99+
    2023-05-30
    springboot
  • 如何解决Spring boot数据源未配置异常
    本篇内容主要讲解“如何解决Spring boot数据源未配置异常”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决Spring boot数据源未配置异常”吧!Spring boot 数据源未...
    99+
    2023-06-20
  • 动态数据源dynamic-datasource-spring-boot-starter怎么使用
    这篇文章主要讲解了“动态数据源dynamic-datasource-spring-boot-starter怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“动态数据源dynamic-da...
    99+
    2023-07-05
  • iscroll如何动态加载数据
    这篇文章将为大家详细讲解有关iscroll如何动态加载数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<div id="wrapp...
    99+
    2024-04-02
  • Spring Boot如何与NumPy集成,加速数据处理?
    随着数据处理的需求越来越高,数据处理的速度也成为了一个关键问题。NumPy是一个高性能的科学计算库,可以在Python中进行矩阵运算、数值分析、图像处理等操作,而Spring Boot则是一个快速构建应用程序的框架,可以帮助开发人员快速构...
    99+
    2023-11-13
    大数据 numy spring
  • 如何添加排除负数
    php小编鱼仔为您介绍如何在编程中添加排除负数的方法。在某些情况下,我们需要对输入的数值进行限制,确保它们不会是负数。这在处理金钱、年龄等需要正数值的场景中尤为重要。通过使用条件语句和...
    99+
    2024-02-10
  • 如何实现自动配置Spring Boot框架
    本篇文章为大家展示了如何实现自动配置Spring Boot框架,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、新建starter的Maven项目我这里以IntelliJ IDEA创建Project...
    99+
    2023-05-31
    springboot 自动配置 spring boo
  • js/jquery如何控制页面动态加载数据和滑动滚动条自动加载事件
    这篇文章主要介绍了js/jquery如何控制页面动态加载数据和滑动滚动条自动加载事件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。页面滚动动...
    99+
    2024-04-02
  • Vue页面加载完成后如何自动加载自定义函数
    目录页面加载完成后自动加载自定义函数createdmountedvue之自执行函数页面加载完成后自动加载自定义函数 created 在模板渲染成html前调用,即通常初始化某些属性值...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作