From 1e49fa50b53b99350cf27071e52a805fa75c5399 Mon Sep 17 00:00:00 2001 From: Redkale Date: Thu, 8 Dec 2022 19:36:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96AnyValue.merge=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/boot/Application.java | 2 +- .../org/redkale/boot/PropertiesAgent.java | 2 ++ src/main/java/org/redkale/util/AnyValue.java | 36 +++++++++++++++---- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/redkale/boot/Application.java b/src/main/java/org/redkale/boot/Application.java index 1d7154f9d..8efe5c45e 100644 --- a/src/main/java/org/redkale/boot/Application.java +++ b/src/main/java/org/redkale/boot/Application.java @@ -642,7 +642,7 @@ public final class Application { } } - //------------------------------------ 读取配置中心 ------------------------------------ + //------------------------------------ 读取配置项 ------------------------------------ final AnyValue resources = config.getAnyValue("resources"); if (resources != null) { resourceFactory.register(RESNAME_APP_GRES, AnyValue.class, resources); diff --git a/src/main/java/org/redkale/boot/PropertiesAgent.java b/src/main/java/org/redkale/boot/PropertiesAgent.java index 3d57ee8fe..484e14fe7 100644 --- a/src/main/java/org/redkale/boot/PropertiesAgent.java +++ b/src/main/java/org/redkale/boot/PropertiesAgent.java @@ -8,6 +8,8 @@ import org.redkale.util.*; /** * 配置源Agent, 在init方法内需要实现读取配置信息,如果支持配置更改通知,也需要在init里实现监听 + * + * 配置项优先级: 本地配置 < 配置中心 < 环境变量 * * * 详情见: https://redkale.org diff --git a/src/main/java/org/redkale/util/AnyValue.java b/src/main/java/org/redkale/util/AnyValue.java index 65d0c9fd4..a8e536586 100644 --- a/src/main/java/org/redkale/util/AnyValue.java +++ b/src/main/java/org/redkale/util/AnyValue.java @@ -27,6 +27,15 @@ public abstract class AnyValue { */ public static final String XML_TEXT_NODE_NAME = ""; + /** + * merge两节点是否覆盖的判断函数 + * + */ + public static interface MergeReplacePredicate { + + public boolean test(String name, AnyValue val1, AnyValue val2); + } + /** * 可读写的AnyValue默认实现类 * @@ -167,12 +176,13 @@ public abstract class AnyValue { /** * 将另一个对象合并过来 * - * @param node0 代合并对象 + * @param node0 代合并对象 + * @param predicate 判断是否覆盖的函数 * * @return AnyValue */ @Override - public DefaultAnyValue merge(AnyValue node0) { + public DefaultAnyValue merge(AnyValue node0, MergeReplacePredicate predicate) { if (node0 == null) return this; if (node0 == this) throw new IllegalArgumentException(); DefaultAnyValue node = (DefaultAnyValue) node0; @@ -193,9 +203,11 @@ public abstract class AnyValue { for (AnyValue item : ns) { if (item == null) continue; if (en.value.parentArrayIndex == ((DefaultAnyValue) item).parentArrayIndex) { - item.merge(en.value); - ok = true; - break; + if (predicate == null || predicate.test(en.name, en.value, item)) { + item.merge(en.value, predicate); + ok = true; + break; + } } } if (!ok) { @@ -969,7 +981,19 @@ public abstract class AnyValue { * * @return AnyValue */ - public abstract AnyValue merge(AnyValue node); + public AnyValue merge(AnyValue node) { + return merge(node, null); + } + + /** + * 将另一个对象合并过来 + * + * @param node 代合并对象 + * @param predicate 判断是否覆盖的函数 + * + * @return AnyValue + */ + public abstract AnyValue merge(AnyValue node, MergeReplacePredicate predicate); /** * 回调子节点