diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java index 6d4fb7e9..960864db 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java +++ b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java @@ -59,6 +59,7 @@ import org.ssssssss.magicapi.datasource.service.DataSourceEncryptProvider; import org.ssssssss.magicapi.datasource.web.MagicDataSourceController; import org.ssssssss.magicapi.function.service.FunctionMagicDynamicRegistry; import org.ssssssss.magicapi.jsr223.LanguageProvider; +import org.ssssssss.magicapi.modules.DynamicModule; import org.ssssssss.magicapi.utils.Mapping; import org.ssssssss.script.MagicResourceLoader; import org.ssssssss.script.MagicScript; @@ -291,7 +292,11 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon applicationContext.getBeansWithAnnotation(MagicModule.class).values().forEach(module -> { String moduleName = AnnotationUtils.findAnnotation(module.getClass(), MagicModule.class).value(); logger.info("注册模块:{} -> {}", moduleName, module.getClass()); - MagicResourceLoader.addModule(moduleName, module); + if(module instanceof DynamicModule){ + MagicResourceLoader.addModule(moduleName, new DynamicModuleImport(module.getClass(), ((DynamicModule) module)::getDynamicModule)); + } else { + MagicResourceLoader.addModule(moduleName, module); + } }); MagicResourceLoader.getModuleNames().stream().filter(importModules::contains).forEach(moduleName -> { logger.info("自动导入模块:{}", moduleName); diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicModuleConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicModuleConfiguration.java index 593bc7ff..4b34371d 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicModuleConfiguration.java +++ b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicModuleConfiguration.java @@ -1,6 +1,5 @@ package org.ssssssss.magicapi.spring.boot.starter; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; @@ -18,7 +17,6 @@ import org.ssssssss.magicapi.core.config.MagicAPIProperties; import org.ssssssss.magicapi.core.config.Page; import org.ssssssss.magicapi.core.interceptor.DefaultResultProvider; import org.ssssssss.magicapi.core.interceptor.ResultProvider; -import org.ssssssss.magicapi.core.model.Options; import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource; import org.ssssssss.magicapi.jsr223.JSR223LanguageProvider; import org.ssssssss.magicapi.modules.db.ColumnMapperAdapter; @@ -37,8 +35,6 @@ import org.ssssssss.magicapi.modules.http.HttpModule; import org.ssssssss.magicapi.modules.servlet.RequestModule; import org.ssssssss.magicapi.modules.servlet.ResponseModule; import org.ssssssss.magicapi.modules.spring.EnvModule; -import org.ssssssss.script.MagicResourceLoader; -import org.ssssssss.script.functions.DynamicModuleImport; import javax.sql.DataSource; import java.nio.charset.StandardCharsets; @@ -159,13 +155,6 @@ public class MagicModuleConfiguration { sqlModule.setDialectAdapter(dialectAdapter); sqlModule.setLogicDeleteColumn(properties.getCrud().getLogicDeleteColumn()); sqlModule.setLogicDeleteValue(properties.getCrud().getLogicDeleteValue()); - MagicResourceLoader.addModule("db", new DynamicModuleImport(SQLModule.class, context -> { - String dataSourceKey = context.getString(Options.DEFAULT_DATA_SOURCE.getValue()); - if (StringUtils.isEmpty(dataSourceKey)) return sqlModule; - SQLModule newSqlModule = sqlModule.cloneSQLModule(); - newSqlModule.setDataSourceNode(dynamicDataSource.getDataSource(dataSourceKey)); - return newSqlModule; - })); return sqlModule; } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/modules/DynamicModule.java b/magic-api/src/main/java/org/ssssssss/magicapi/modules/DynamicModule.java new file mode 100644 index 00000000..17f09b05 --- /dev/null +++ b/magic-api/src/main/java/org/ssssssss/magicapi/modules/DynamicModule.java @@ -0,0 +1,11 @@ +package org.ssssssss.magicapi.modules; + +import org.ssssssss.script.MagicScriptContext; + +import java.beans.Transient; + +public interface DynamicModule { + + @Transient + T getDynamicModule(MagicScriptContext context); +} diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/modules/db/SQLModule.java b/magic-api/src/main/java/org/ssssssss/magicapi/modules/db/SQLModule.java index 3f0adccc..b7c00fbb 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/modules/db/SQLModule.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/modules/db/SQLModule.java @@ -3,6 +3,8 @@ package org.ssssssss.magicapi.modules.db; import org.apache.commons.lang3.StringUtils; import org.springframework.jdbc.core.*; import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.ssssssss.magicapi.core.model.Options; +import org.ssssssss.magicapi.modules.DynamicModule; import org.ssssssss.magicapi.modules.db.dialect.DialectAdapter; import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource; import org.ssssssss.magicapi.datasource.model.MagicDynamicDataSource.DataSourceNode; @@ -18,6 +20,7 @@ import org.ssssssss.magicapi.modules.db.provider.PageProvider; import org.ssssssss.magicapi.modules.db.table.NamedTable; import org.ssssssss.magicapi.core.interceptor.ResultProvider; import org.ssssssss.magicapi.utils.ScriptManager; +import org.ssssssss.script.MagicScriptContext; import org.ssssssss.script.annotation.Comment; import org.ssssssss.script.functions.DynamicAttribute; import org.ssssssss.script.parsing.ast.statement.ClassConverter; @@ -38,7 +41,7 @@ import java.util.stream.Stream; * @author mxd */ @MagicModule("db") -public class SQLModule implements DynamicAttribute { +public class SQLModule implements DynamicAttribute, DynamicModule { static { try { Field[] fields = Types.class.getFields(); @@ -695,6 +698,16 @@ public class SQLModule implements DynamicAttribute { return boundSql.copy(pageSql); } + @Transient + @Override + public SQLModule getDynamicModule(MagicScriptContext context) { + String dataSourceKey = context.getString(Options.DEFAULT_DATA_SOURCE.getValue()); + if (StringUtils.isEmpty(dataSourceKey)) return this; + SQLModule newSqlModule = cloneSQLModule(); + newSqlModule.setDataSourceNode(dynamicDataSource.getDataSource(dataSourceKey)); + return newSqlModule; + } + static class MagicKeyHolder extends GeneratedKeyHolder { private final boolean useGeneratedKeys;