千家信息网

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

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇内容介绍了"Spring Boot怎么排除自动加载数据源"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有
千家信息网最后更新 2025年01月24日Spring Boot怎么排除自动加载数据源

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

前言

有些老项目使用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);
/**         * 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 configurations = getCandidateConfigurations(annotationMetadata, attributes);                configurations = removeDuplicates(configurations);                Set 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 getExclusions(AnnotationMetadata metadata, AnnotationAttributes attributes) {                Set excluded = new LinkedHashSet<>();                excluded.addAll(asList(attributes, "exclude"));                excluded.addAll(Arrays.asList(attributes.getStringArray("excludeName")));                excluded.addAll(getExcludeAutoConfigurationsProperty());                return excluded;        }

看到了,exclude或者excludeName,当然还有一种方法

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

配置 数据 数据源 原理 业务 内容 更多 知识 项目 实用 学有所成 接下来 代码 会主 前言 功能 原因 参数 困境 官方 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全视频解读 网络安全应该怎么学 安全隐患信息数据库 前景 抑郁症多模态数据库 药典下载软件开发 小学网络安全手抄报内容简短 阿里云盘的服务器地址是什么 台式机服务器 富士康软件开发工程师助理 c 编程入门教学软件开发 sql文件还原数据库 建立自己的云储存服务器 海南企业级服务器价钱 谈谈新时代背景下的网络安全 美国中央级网络安全机构 中国面临网络安全问题有哪些 常用的三大中文全文数据库有啥 t20暖通连接数据库失败 轨道交通网络安全应急预案方案 南沙可靠的网络安全建设 服务器的新手礼包指令怎么弄 抑郁症多模态数据库 用于比赛中的数据库 叶凯是大掌门游戏软件开发人吗 服务器超算卡是什么 电脑设置首选dns服务器在哪里 乱接wifi的网络安全检讨书 .net软件开发平台 未央区网络安全巡查 星网锐捷网络技术公司怎么样
0