event : events) {
if (event.newValue() != null) {
newEnvs.put(event.name(), event.newValue());
@@ -152,7 +154,7 @@ class PropertiesModule {
}
}
mergeEnvProperties(newEnvs, removedKeys);
- application.onEnvironmentChanged(namespace, events);
+ onEnvironmentChanged(namespace, events);
} finally {
updateLock.unlock();
}
@@ -186,49 +188,49 @@ class PropertiesModule {
newMergeProps.put(k, v);
} else { //其他视为普通配置项
if (key.startsWith("system.property.")) {
- application.envProperties.put(k, v);
+ putEnvValue(k, v);
} else if (key.startsWith("mimetype.property.")) {
- application.envProperties.put(k, v);
+ putEnvValue(k, v);
} else if (key.startsWith("redkale.properties.property.")) {
newMergeProps.put(k, v);
String name = key.substring("redkale.properties.".length());
- application.envProperties.put(name, v);
+ putEnvValue(name, v);
} else if (key.startsWith("redkale.properties.property[")) {
newMergeProps.put(k, v);
String name = key.substring("redkale.properties[".length());
name = name.substring(0, name.indexOf(']'));
- application.envProperties.put(name, v);
+ putEnvValue(name, v);
} else if (key.startsWith("redkale.properties.")) { //支持 -Dredkale.properties.mykey = myvalue
String prefix = "redkale.properties.property[" + propertyIndex.getAndIncrement() + "]";
String name = key.substring("redkale.properties.".length());
newMergeProps.put(prefix + ".name", name);
newMergeProps.put(prefix + ".value", v);
- application.envProperties.put(name, v);
+ putEnvValue(name, v);
} else { //独立的普通配置项文件,比如:config.properties文件中的配置项
String prefix = "redkale.properties.property[" + propertyIndex.getAndIncrement() + "]";
newMergeProps.put(prefix + ".name", k);
newMergeProps.put(prefix + ".value", v);
- application.envProperties.put(k, v);
+ putEnvValue(k, v);
}
}
});
- if (Utility.isNotEmpty(removedKeys)) {
- removedKeys.forEach(application.envProperties::remove);
+ if (removedKeys != null && !removedKeys.isEmpty()) {
+ removedKeys.forEach(this::removeEnvValue);
}
if (!newMergeProps.isEmpty()) {
Properties newDyncProps = new Properties();
newMergeProps.forEach((k, v) -> newDyncProps.put(k.toString(), application.getEnvironment().getPropertyValue(v.toString(), newMergeProps)));
//合并配置
- application.getAppConfig().merge(AnyValue.loadFromProperties(newDyncProps).getAnyValue("redkale"), createMergeStrategy(application));
+ application.getAppConfig().merge(AnyValue.loadFromProperties(newDyncProps).getAnyValue("redkale"), createMergeStrategy());
}
}
/**
* 合并系统配置项的策略
*/
- static final AnyValue.MergeStrategy createMergeStrategy(final Application application) {
+ AnyValue.MergeStrategy createMergeStrategy() {
return (path, key, val1, val2) -> {
- for (ModuleEngine m : application.getModuleEngines()) {
+ for (ModuleEngine m : getModuleEngines()) {
AnyValue.MergeEnum rs = m.mergeAppConfigStrategy(path, key, val1, val2);
if (rs != null) {
return rs;
diff --git a/src/main/java/org/redkale/source/AbstractCacheSource.java b/src/main/java/org/redkale/source/AbstractCacheSource.java
index 651bf6048..9a29ec483 100644
--- a/src/main/java/org/redkale/source/AbstractCacheSource.java
+++ b/src/main/java/org/redkale/source/AbstractCacheSource.java
@@ -4,13 +4,14 @@ package org.redkale.source;
import java.util.*;
import org.redkale.annotation.AutoLoad;
+import org.redkale.annotation.ResourceChanged;
import org.redkale.annotation.ResourceType;
import org.redkale.inject.Resourcable;
import org.redkale.inject.ResourceEvent;
import org.redkale.inject.ResourceFactory;
import org.redkale.service.*;
+import org.redkale.source.spi.CacheSourceProvider;
import org.redkale.util.*;
-import org.redkale.annotation.ResourceChanged;
/**
* CacheSource的S抽象实现类
diff --git a/src/main/java/org/redkale/source/DataNativeSqlParser.java b/src/main/java/org/redkale/source/DataNativeSqlParser.java
index 3a411fea0..c8326d243 100644
--- a/src/main/java/org/redkale/source/DataNativeSqlParser.java
+++ b/src/main/java/org/redkale/source/DataNativeSqlParser.java
@@ -5,6 +5,7 @@ package org.redkale.source;
import java.util.*;
import java.util.function.IntFunction;
+import org.redkale.source.spi.DataNativeSqlParserProvider;
import org.redkale.util.RedkaleClassLoader;
/**
diff --git a/src/main/java/org/redkale/source/DataSources.java b/src/main/java/org/redkale/source/DataSources.java
index fb9d6a3fd..3fcac3944 100644
--- a/src/main/java/org/redkale/source/DataSources.java
+++ b/src/main/java/org/redkale/source/DataSources.java
@@ -10,6 +10,7 @@ import java.net.*;
import java.util.*;
import org.redkale.inject.ResourceFactory;
import org.redkale.service.Service;
+import org.redkale.source.spi.DataSourceProvider;
import org.redkale.util.*;
import static org.redkale.util.Utility.isEmpty;
diff --git a/src/main/java/org/redkale/source/SourceManager.java b/src/main/java/org/redkale/source/SourceManager.java
new file mode 100644
index 000000000..9d4b901e1
--- /dev/null
+++ b/src/main/java/org/redkale/source/SourceManager.java
@@ -0,0 +1,71 @@
+/*
+ *
+ */
+package org.redkale.source;
+
+import java.util.Map;
+
+/**
+ * source组件的基本管理器
+ *
+ *
+ * 详情见: https://redkale.org
+ *
+ * @author zhangjx
+ * @since 2.8.0
+ */
+public interface SourceManager {
+
+ /**
+ *
+ * @param sourceName 资源名
+ *
+ * @return CacheSource
+ */
+ default CacheSource loadCacheSource(final String sourceName) {
+ return loadCacheSource(sourceName, false);
+ }
+
+ /**
+ *
+ * @param sourceName 资源名
+ * @param autoMemory 不存在是否自动创建内存版CacheSource
+ *
+ * @return CacheSource
+ */
+ public CacheSource loadCacheSource(final String sourceName, boolean autoMemory);
+
+ /**
+ * 获取所有CacheSource, 不同资源名可能指向同一个CacheSource
+ *
+ * @return CacheSource集合
+ */
+ public Map getCacheSources();
+
+ /**
+ *
+ * @param sourceName 资源名
+ *
+ * @return DataSource
+ */
+ default DataSource loadDataSource(final String sourceName) {
+ return loadDataSource(sourceName, false);
+ }
+
+ /**
+ * 加载DataSource
+ *
+ * @param sourceName 资源名
+ * @param autoMemory 不存在是否自动创建内存版DataSource
+ *
+ * @return DataSource
+ */
+ public DataSource loadDataSource(final String sourceName, boolean autoMemory);
+
+ /**
+ * 获取所有DataSource, 不同资源名可能指向同一个DataSource
+ *
+ * @return DataSource集合
+ */
+ public Map getDataSources();
+}
diff --git a/src/main/java/org/redkale/source/CacheSourceProvider.java b/src/main/java/org/redkale/source/spi/CacheSourceProvider.java
similarity index 84%
rename from src/main/java/org/redkale/source/CacheSourceProvider.java
rename to src/main/java/org/redkale/source/spi/CacheSourceProvider.java
index 8d9fe8ca1..919d5b271 100644
--- a/src/main/java/org/redkale/source/CacheSourceProvider.java
+++ b/src/main/java/org/redkale/source/spi/CacheSourceProvider.java
@@ -3,8 +3,9 @@
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
-package org.redkale.source;
+package org.redkale.source.spi;
+import org.redkale.source.CacheSource;
import org.redkale.util.*;
/**
diff --git a/src/main/java/org/redkale/source/DataNativeSqlParserProvider.java b/src/main/java/org/redkale/source/spi/DataNativeSqlParserProvider.java
similarity index 83%
rename from src/main/java/org/redkale/source/DataNativeSqlParserProvider.java
rename to src/main/java/org/redkale/source/spi/DataNativeSqlParserProvider.java
index 4a48a702d..08f86891b 100644
--- a/src/main/java/org/redkale/source/DataNativeSqlParserProvider.java
+++ b/src/main/java/org/redkale/source/spi/DataNativeSqlParserProvider.java
@@ -1,8 +1,9 @@
/*
*
*/
-package org.redkale.source;
+package org.redkale.source.spi;
+import org.redkale.source.DataNativeSqlParser;
import org.redkale.util.InstanceProvider;
/**
diff --git a/src/main/java/org/redkale/source/DataSourceProvider.java b/src/main/java/org/redkale/source/spi/DataSourceProvider.java
similarity index 84%
rename from src/main/java/org/redkale/source/DataSourceProvider.java
rename to src/main/java/org/redkale/source/spi/DataSourceProvider.java
index aa1603038..796a334f8 100644
--- a/src/main/java/org/redkale/source/DataSourceProvider.java
+++ b/src/main/java/org/redkale/source/spi/DataSourceProvider.java
@@ -3,8 +3,9 @@
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
-package org.redkale.source;
+package org.redkale.source.spi;
+import org.redkale.source.DataSource;
import org.redkale.util.*;
/**
diff --git a/src/main/java/org/redkale/source/SourceModuleEngine.java b/src/main/java/org/redkale/source/spi/SourceModuleEngine.java
similarity index 94%
rename from src/main/java/org/redkale/source/SourceModuleEngine.java
rename to src/main/java/org/redkale/source/spi/SourceModuleEngine.java
index 44602c123..5343fd6e4 100644
--- a/src/main/java/org/redkale/source/SourceModuleEngine.java
+++ b/src/main/java/org/redkale/source/spi/SourceModuleEngine.java
@@ -1,14 +1,16 @@
/*
*
*/
-package org.redkale.source;
+package org.redkale.source.spi;
import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import java.util.ServiceLoader;
@@ -25,6 +27,18 @@ import org.redkale.inject.ResourceTypeLoader;
import org.redkale.net.Servlet;
import org.redkale.net.sncp.Sncp;
import org.redkale.service.Service;
+import org.redkale.source.AbstractCacheSource;
+import org.redkale.source.AbstractDataSource;
+import org.redkale.source.CacheMemorySource;
+import org.redkale.source.CacheSource;
+import org.redkale.source.DataJdbcSource;
+import org.redkale.source.DataMemorySource;
+import org.redkale.source.DataNativeSqlParser;
+import org.redkale.source.DataSource;
+import org.redkale.source.DataSources;
+import org.redkale.source.DataSqlSource;
+import org.redkale.source.SearchSource;
+import org.redkale.source.SourceManager;
import org.redkale.util.AnyValue;
import org.redkale.util.AnyValueWriter;
import org.redkale.util.InstanceProvider;
@@ -36,7 +50,7 @@ import org.redkale.util.Utility;
*
* @author zhangjx
*/
-public class SourceModuleEngine extends ModuleEngine {
+public class SourceModuleEngine extends ModuleEngine implements SourceManager {
//Source 原始的配置资源, 只会存在redkale.datasource(.|[) redkale.cachesource(.|[)开头的配置项
private final Properties sourceProperties = new Properties();
@@ -117,7 +131,7 @@ public class SourceModuleEngine extends ModuleEngine {
this.resourceFactory.register(DataNativeSqlParser.class, this.nativeSqlParser);
break; //only first provider
}
-
+ resourceFactory.register(SourceManager.class, this);
//--------------------------------- 注册 DataSource、CacheSource ---------------------------------
resourceFactory.register(new DataSourceLoader(), DataSource.class);
resourceFactory.register(new CacheSourceLoader(), CacheSource.class);
@@ -330,6 +344,17 @@ public class SourceModuleEngine extends ModuleEngine {
}
}
+ /**
+ * 获取所有CacheSource, 不同资源名可能指向同一个CacheSource
+ *
+ * @return CacheSource集合
+ */
+ public Map getCacheSources() {
+ Map sources = new HashMap<>();
+ cacheSources.forEach(v -> sources.put(v.resourceName(), v));
+ return sources;
+ }
+
public CacheSource loadCacheSource(final String sourceName, boolean autoMemory) {
cacheSourceLock.lock();
try {
@@ -378,6 +403,17 @@ public class SourceModuleEngine extends ModuleEngine {
}
}
+ /**
+ * 获取所有DataSource, 不同资源名可能指向同一个DataSource
+ *
+ * @return DataSource集合
+ */
+ public Map getDataSources() {
+ Map sources = new HashMap<>();
+ dataSources.forEach(v -> sources.put(v.resourceName(), v));
+ return sources;
+ }
+
public DataSource loadDataSource(final String sourceName, boolean autoMemory) {
dataSourceLock.lock();
try {
diff --git a/src/main/java/org/redkale/util/Environment.java b/src/main/java/org/redkale/util/Environment.java
index 30b70924b..6be2f3a56 100644
--- a/src/main/java/org/redkale/util/Environment.java
+++ b/src/main/java/org/redkale/util/Environment.java
@@ -27,6 +27,10 @@ public class Environment implements java.io.Serializable {
this.properties = properties;
}
+ public Properties newProperties() {
+ return new Properties(properties);
+ }
+
public Set keySet() {
return (Set) properties.keySet();
}
diff --git a/src/main/java/org/redkale/util/RedkaleClassLoader.java b/src/main/java/org/redkale/util/RedkaleClassLoader.java
index 944fba68c..d6f06a843 100644
--- a/src/main/java/org/redkale/util/RedkaleClassLoader.java
+++ b/src/main/java/org/redkale/util/RedkaleClassLoader.java
@@ -56,6 +56,7 @@ public class RedkaleClassLoader extends URLClassLoader {
"org.redkale.convert.ext",
"org.redkale.convert.json",
"org.redkale.convert.proto",
+ "org.redkale.convert.spi",
"org.redkale.inject",
"org.redkale.lock",
"org.redkale.lock.spi",
@@ -70,6 +71,7 @@ public class RedkaleClassLoader extends URLClassLoader {
"org.redkale.schedule.spi",
"org.redkale.service",
"org.redkale.source",
+ "org.redkale.source.spi",
"org.redkale.util",
"org.redkale.watch"
};
diff --git a/src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java b/src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java
index fb4154945..02a316aef 100644
--- a/src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java
+++ b/src/test/java/org/redkale/test/inject/ResourceAnnotationTest.java
@@ -12,8 +12,8 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.reflect.Field;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.JsonConvert;
-import org.redkale.inject.ResourceAnnotationProvider;
import org.redkale.inject.ResourceFactory;
+import org.redkale.inject.spi.ResourceAnnotationProvider;
/**
*