引言
OneCode 3.0作為新一代低代碼開發平臺,其架構設計圍繞"工程模塊化"與"UI自主化"兩大核心目標展開。本文將從底層接口到上層應用,全面解析OneCode 3.0的技術架構,包括核心工廠類、工程管理接口、數據倉庫設計以及動態UI組件系統,并通過關鍵代碼實現展示其設計思想與技術細。
一、架構總覽:微內核與插件化設計
OneCode 3.0采用微內核+插件化架構,通過以下核心組件實現高內聚低耦合的系統設計:
- DSMFactory:領域模型接口系統的核心,負責工程元數據管理與多工廠協同
- ESDClient:工程模塊管理的核心交互接口,定義標準化操作契約
- CustomViewFactory:自主UI系統的工廠類,處理動態視圖組件的創建與加載
- CustomModuleComponent:UI組件的具體實現,支持數據綁定與事件處理
- RepositoryInst:數據倉庫管理,維護實體與表的映射關系
二、核心工廠類:DSMFactory的設計與實現
2.1 單例模式與多工廠協同
DSMFactory采用雙重校驗鎖單例模式,確保全局唯一實例,并初始化多個關鍵子工廠:
private DSMFactory() {projectCacheManager = ProjectCacheManager.getInstance();viewManager = ViewManager.getInstance();repositoryManager = RepositoryManager.getInstance();aggregationManager = AggregationManager.getInstance();buildFactory = BuildFactory.getInstance();// 初始化其他工廠...
}
2.2 工程生命周期管理
DSMFactory提供工程的創建、加載、編譯等全生命周期管理:
public void reload() throws JDSException {// 清除緩存projectCacheManager.clean();// 重新加載工程initESDProject();initUserProject();initDSMProject();// 重新編譯類recompileClasses();
}
三、工程模塊管理接口:ESDClient的設計哲學
3.1 接口定位與核心職責
ESDClient作為工程模塊管理的核心交互接口,定義了標準化操作契約,向上承接UI層請求,向下對接底層服務。
3.2 核心方法體系解析
3.2.1 工程生命周期管理
// 工程創建與版本控制
Project createProject(String projectName, String desc, ProjectDefAccess type) throws JDSException;
ProjectVersion createProcessVersion(String projectName) throws JDSException;
void activateProjectVersion(String versionId) throws JDSException;// 工程配置管理
void updateProjectConfig(String projectId, ProjectConfig config) throws JDSException;
void updateDSMConfig(String projectId, DSMProjectConfig config) throws JDSException;
3.2.2 模塊動態編譯與加載
// 模塊創建與編譯
EUModule createCustomModule(String versionName, String className, Map<String, ?> valueMap) throws JDSException;
Set<EUModule> buildPackage(String versionName, String packageName, Map<String, ?> valueMap, ChromeProxy chrome) throws JDSException;// 運行期動態構建
<T extends ModuleComponent> EUModule<T> buildDynCustomModule(Class<T> customClass, Map<String, ?> valueMap, boolean save) throws JDSException;
3.2.3 跨模塊資源協同
// 多資源類型管理
List<FontConfig> getFontByProject(String versionName) throws JDSException;
StyleConfig getStyleConfig(String styleConfigId) throws JDSException;
ImgConfig buildImgConfig(String projectName, String path) throws JDSException;// API服務發現
List<APIPaths> getAPIPathsByProject(String versionName) throws JDSException;
List<XUIAPIConfig> searchLocalService(String versionName, String pattern) throws JDSException;
3.3 架構設計亮點
- 接口隔離原則:通過
@MethodChinaName
注解實現業務語義與技術實現的解耦 - 領域驅動設計:大量使用領域對象作為方法參數,確保業務規則內聚
- 擴展性考量:預留
ChromeProxy
等擴展點,支持高級特性
四、自主UI系統:CustomViewFactory與動態視圖生成
4.1 CustomViewFactory的核心能力
CustomViewFactory負責動態視圖組件的創建與管理,其核心方法包括:
// 動態編譯模塊
public EUModule dynBuild(String versionName, String className, String code, boolean isSave) throws JDSException {// 代碼編譯邏輯JavaFileObject fileObject = new JavaSourceFromString(className, code);Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(fileObject);CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, fileObjects);boolean success = task.call();// ...
}// 創建模塊組件
public ModuleComponent createModuleComponent(EUModule module, MethodConfig methodAPIBean, Map<String, Object> valueMap) {return new CustomModuleComponent(module, methodAPIBean, valueMap);
}
4.2 視圖緩存與性能優化
CustomViewFactory實現了視圖組件的緩存機制,避免重復創建:
private Map<String, ModuleComponent> componentCache = new ConcurrentHashMap<>();public ModuleComponent getCachedComponent(String key) {return componentCache.get(key);
}public void cacheComponent(String key, ModuleComponent component) {componentCache.put(key, component);
}
五、UI組件實現:CustomModuleComponent詳解
5.1 類結構與核心字段
CustomModuleComponent繼承自ModuleComponent,包含豐富的UI組件字段:
public class CustomModuleComponent extends ModuleComponent {private ESDClass esdClass;private Class<?> parentClass;private List<ESDFieldConfig> fieldList;private Component mainComponent;private ToolBar menuBar;private ToolBar bottomBar;private String dataUrl;private ToolBar customToolsBar;private ContextBar contextBar;private MethodConfig methodAPIBean;// ...
}
5.2 構造函數與初始化流程
public CustomModuleComponent(EUModule module, MethodConfig methodAPIBean, Map<String, Object> valueMap) {super(module);this.methodAPIBean = methodAPIBean;this.valueMap = valueMap;this.esdClass = module.getEsdClass();this.parentClass = esdClass.getClazz();this.fieldList = esdClass.getFieldList();// 處理模塊樣式processModuleStyle();// 初始化字段配置initFieldConfig();// 初始化事件initModuleEvent();
}
5.3 事件處理機制
CustomModuleComponent實現了豐富的事件處理能力:
public void initModuleEvent() {// 添加模塊動作addModuleAction();// 添加模塊事件addModuleEvent();// 初始化上下文菜單fillContextAction();// 初始化工具欄fillToolBar();
}public void addModuleAction() {if (methodAPIBean != null && methodAPIBean.getActionList() != null) {for (ActionConfig action : methodAPIBean.getActionList()) {addAction(action);}}
}
六、數據倉庫管理:RepositoryInst的設計與實現
6.1 類結構與核心功能
RepositoryInst繼承自DSMInst,主要負責數據倉庫管理,維護實體與表的映射關系:
public class RepositoryInst extends DSMInst implements Comparable<RepositoryInst> {public String schema = "fdt";public String serverUrl = "http://api.radev.cn";public DSMType dsmType = DSMType.REPOSITORY;public Map<String, TableRef> tableRefMap = new HashMap<>();public Map<String, EntityRef> entityRefMap = new HashMap<>();public Set<String> entityNames = new LinkedHashSet<>();public Set<String> tableNames = new LinkedHashSet<>();// ...
}
6.2 實體與表的映射管理
RepositoryInst維護了實體與數據庫表之間的映射關系:
@JSONField(serialize = false)
public List<ESDClass> getEntityList() {List<JavaSrcBean> repositoryList = this.getRepositoryInst().getJavaEntities();List<ESDClass> entityList = new ArrayList<>();for (JavaSrcBean srcBean : repositoryList) {String className = srcBean.getClassName();try {Class clazz = ClassUtility.loadClass(className);ESDEntity entity = (ESDEntity) clazz.getAnnotation(ESDEntity.class);if (entity != null) {ESDClass esdClass = BuildFactory.getInstance().getClassManager().getRepositoryClass(className, true);if (!entityList.contains(esdClass)){entityList.add(esdClass);}}} catch (ClassNotFoundException e) {// 處理異常} catch (JDSException e) {e.printStackTrace();}}return entityList;
}
6.3 聚合查詢支持
RepositoryInst提供了基于注解的聚合查詢能力:
@JSONField(serialize = false)
public List<ESDClass> getAggBeans(UserSpace userSpace, AggregationType aggregationType) {List<JavaSrcBean> repositoryList = this.getRepositoryInst().getJavaEntities();List<ESDClass> entityList = new ArrayList<>();for (JavaSrcBean srcBean : repositoryList) {String className = srcBean.getClassName();try {Class clazz = ClassUtility.loadClass(className);Aggregation aggregation = (Aggregation) clazz.getAnnotation(Aggregation.class);if (aggregation != null && aggregation.rootClass() != null && (aggregationType == null || aggregation.type().equals(aggregationType))) {// 處理聚合查詢// ...}} catch (ClassNotFoundException e) {// 處理異常}}return entityList;
}
七、核心組件協同關系
7.1 組件交互流程
OneCode 3.0各核心組件之間的交互流程如下:
-
工程加載流程:
- ESDClient接收工程加載請求
- 調用DSMFactory初始化工程元數據
- RepositoryInst加載數據倉庫配置
- CustomViewFactory創建初始UI視圖
-
動態模塊創建流程:
- ESDClient接收模塊創建請求
- CustomViewFactory動態編譯模塊代碼
- 創建CustomModuleComponent實例
- 緩存視圖組件并返回給前端
7.2 組件關系圖
八、工程實踐與最佳實踐
8.1 工程創建與管理
// 創建工程示例
ESDClient client = ESDClientImpl.getInstance();
ConnectInfo connInfo = new ConnectInfo();
connInfo.setUsername("admin");
connInfo.setPassword("password");
client.connect(connInfo);// 創建新工程
Project project = client.createProject("demo-project", "示例工程", ProjectDefAccess.PRIVATE);
String projectId = project.getProjectId();// 創建工程版本
ProjectVersion version = client.createProcessVersion(projectId);
String versionId = version.getVersionId();// 激活工程版本
client.activateProjectVersion(versionId);
8.2 動態模塊創建
// 創建動態模塊示例
Map<String, Object> params = new HashMap<>();
params.put("name", "user-list");
params.put("title", "用戶列表");
params.put("dataUrl", "/api/users");EUModule module = client.createCustomModule(versionId, "UserListModule", params);// 構建模塊UI
ModuleComponent component = client.getCustomModule("UserListModule", versionId, params);// 渲染組件
String html = component.render();
response.getWriter().write(html);
8.3 性能優化建議
- 合理使用緩存:利用CustomViewFactory的組件緩存機制
- 批量操作:使用buildPackage方法批量編譯模塊
- 按需加載:利用ESDClient的loadModules方法按需加載模塊
- 數據庫連接池:配置合適的數據庫連接池參數
九、總結與展望
OneCode 3.0通過微內核+插件化架構,結合動態編譯、注解驅動、數據驅動等技術手段,構建了一個高度靈活和可擴展的低代碼開發平臺。核心工廠類DSMFactory協調各子系統,ESDClient提供標準化接口,CustomViewFactory和CustomModuleComponent實現自主UI系統,RepositoryInst管理數據倉庫,共同構成了OneCode 3.0的技術基石。
未來,OneCode 3.0將在以下方向持續優化:
- 引入AI輔助開發,提升自動化程度
- 增強微前端支持,實現更細粒度的模塊拆分
- 優化編譯性能,縮短模塊加載時間
- 完善插件生態,支持更多行業場景
通過不斷技術創新,OneCode 3.0將持續為開發者提供更高效、更靈活的低代碼開發體驗。