diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/ResourceUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/ResourceUtil.java
index 32da2fbdf..a73615076 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/ResourceUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/resource/ResourceUtil.java
@@ -278,7 +278,12 @@ public class ResourceUtil {
}
/**
- * 获取同名的所有资源
+ * 获取同名的所有资源
+ * 资源的加载顺序是:
+ *
+ * - 1. 首先在本项目下查找资源文件
+ * - 2. 按照classpath定义的顺序,去对应路径或jar包下寻找资源文件
+ *
*
* @param resource 资源名
* @param classLoader {@link ClassLoader},{@code null}表示使用默认的当前上下文ClassLoader
@@ -330,11 +335,26 @@ public class ResourceUtil {
* @param resourceName 资源名,可以是相对classpath的路径,也可以是绝对路径
* @param classLoader {@link ClassLoader},{@code null}表示使用默认的当前上下文ClassLoader
* @param charset 编码,对XML无效,默认UTF-8
+ * @param isOverride 是否覆盖模式
*/
public static void loadAllTo(final Properties properties, final String resourceName,
- final ClassLoader classLoader, final Charset charset) {
+ final ClassLoader classLoader, final Charset charset, final boolean isOverride) {
+ if(isOverride){
+ for (final Resource resource : getResources(resourceName, classLoader)) {
+ loadTo(properties, resource, charset);
+ }
+ return;
+ }
+
+ // 非覆盖模式下,读取配置文件后逐个检查key
+ final Properties tmpProps = new Properties();
for (final Resource resource : getResources(resourceName, classLoader)) {
- loadTo(properties, resource, charset);
+ loadTo(tmpProps, resource, charset);
+ tmpProps.forEach((name, value)->{
+ if(!properties.containsKey(name)){
+ properties.put(name, value);
+ }
+ });
}
}
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/spi/KVServiceLoader.java b/hutool-core/src/main/java/org/dromara/hutool/core/spi/KVServiceLoader.java
index 7d92f4aa2..6506dc525 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/spi/KVServiceLoader.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/spi/KVServiceLoader.java
@@ -98,12 +98,16 @@ public class KVServiceLoader extends AbsServiceLoader {
*/
@Override
public void load() {
+ // 解析同名的所有service资源
+ // 按照资源加载优先级,先加载和解析的资源优先使用,后加载的同名资源丢弃
final Properties properties = new Properties();
ResourceUtil.loadAllTo(
properties,
pathPrefix + serviceClass.getName(),
classLoader,
- charset);
+ charset,
+ // 非覆盖模式
+ false);
this.serviceProperties = properties;
}
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java b/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java
index 929d8a6ae..0523844d4 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/spi/ListServiceLoader.java
@@ -100,6 +100,7 @@ public class ListServiceLoader extends AbsServiceLoader {
@Override
public void load() {
// 解析同名的所有service资源
+ // 按照资源加载优先级,先加载和解析的资源优先使用,后加载的同名资源丢弃
final MultiResource resources = ResourceUtil.getResources(
pathPrefix + serviceClass.getName(),
this.classLoader);