一、Code First模式概述
Code First模式是OneCode平台支持的三种核心开发模式之一,它以开发者编写的Java代码为基础,通过注解驱动的方式构建领域模型,并自动同步生成DSM(领域特定模型)数据模型。这种模式特别适合具有较强编程基础且对业务逻辑有清晰规划的开发者,能够充分发挥原生Java的灵活性和OneCode平台的代码生成能力,实现"代码即设计"的开发理念。
与View First(拖拽优先)和Model First(模型优先)模式相比,Code First模式具有以下特点:
- 开发自由度高:直接使用Java语言编写业务逻辑,支持复杂业务规则实现
- 注解驱动开发:通过特定注解将代码与DSM模型关联,实现双向绑定
- 原生代码可控:生成的代码完全可见,支持开发者进行深度定制
- 无缝集成Spring生态:基于Spring Boot框架,兼容所有Spring生态组件
二、适用场景与技术架构
2.1 适用场景
Code First模式特别适合以下开发场景:
- 复杂业务逻辑系统开发
- 需要深度定制化的企业级应用
- 已有Java代码库的迁移与集成
- 对性能要求较高的核心业务模块
- 专业开发团队的协作开发
2.2 技术架构
Code First模式采用分层架构设计,主要包含以下核心层次:
表现层(UI)←→控制层(Controller)←→服务层(Service)←→数据访问层(Repository)
↑ ↑ ↑ ↑
└───────────┴───────────────┴───────────────┘
↓
DSM元数据层
↓
代码生成器
- 表现层:负责UI组件渲染与用户交互,通过注解配置视图、表单、网格等界面元素
- 控制层:基于Spring MVC实现请求处理与事件响应,通过注解绑定URL与业务逻辑
- 服务层:封装核心业务逻辑,提供数据处理与功能实现
- 数据访问层:处理与数据库的交互操作
- DSM元数据层:存储模型描述信息,实现代码与模型的双向映射;
三、开发环境准备
3.1 环境要求
- JDK 8+及Maven 3.6+环境
- OneCode SDK 3.0+(包含DSM模型处理器)
- Trae IDE(推荐)或IntelliJ IDEA(需安装OneCode插件)
- Spring Boot 2.5+开发环境
3.2 项目初始化
通过Maven坐标引入OneCode核心依赖:
<dependency>
<groupId>com.onecode</groupId>
<artifactId>onecode-esd</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.onecode</groupId>
<artifactId>onecode-common-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
四、开发步骤详解
4.1 创建领域模型
使用Java注解定义领域实体,通过@Entity、@Field等注解描述实体属性及关系:
package com.ds.admin.db.provider.entity;
import com.onecode.esd.annotation.Entity;
import com.onecode.esd.annotation.Field;
import com.onecode.esd.annotation.PrimaryKey;
@Entity(displayName = "数据库连接配置", description = "存储数据库连接信息的实体")
public class Provider {
@PrimaryKey
@Field(displayName = "配置ID", type = "string", length = 32)
private String providerId;
@Field(displayName = "数据库名称", type = "string", required = true)
private String dbName;
@Field(displayName = "连接URL", type = "string", required = true)
private String url;
@Field(displayName = "用户名", type = "string", required = true)
private String username;
@Field(displayName = "密码", type = "password", required = true)
private String password;
@Field(displayName = "驱动类名", type = "string", defaultValue = "com.mysql.cj.jdbc.Driver")
private String driverClass;
// Getters and setters
// ... existing code ...
}
4.2 编写服务层代码
创建Service接口及实现类,使用@Service、@Transactional等注解声明服务及事务属性:
package com.ds.admin.db.provider.service;
import com.onecode.esd.annotation.Service;
import com.onecode.esd.annotation.AIContext;
import com.ds.admin.db.provider.entity.Provider;
import java.util.List;
@Service(displayName = "数据库配置服务")
@AIContext(tags = {"database", "configuration"}, description = "管理数据库连接配置的服务")
public interface ProviderService {
/**
* 获取所有数据库配置
*/
List<Provider> getAllProviders();
/**
* 根据ID获取数据库配置
*/
Provider getProviderById(String providerId);
/**
* 保存或更新数据库配置
*/
Provider saveProvider(Provider provider);
/**
* 删除数据库配置
*/
void deleteProvider(String providerId);
}
4.3 实现控制器层
创建REST接口控制器,使用@Controller、@RequestMapping等注解定义API端点:
package com.ds.admin.db.provider;
import com.onecode.esd.annotation.Controller;
import com.onecode.esd.annotation.RequestMapping;
import com.onecode.esd.annotation.MethodChinaName;
import com.onecode.esd.annotation.APIEventAnnotation;
import com.ds.admin.db.provider.service.ProviderService;
import com.ds.admin.db.provider.entity.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping(path = "/db/provider/")
@APIEventAnnotation(module = "database", businessType = "provider_config")
public class ProviderInfoService {
@Autowired
private ProviderService providerService;
@MethodChinaName("获取数据库配置")
@RequestMapping(path = "getProvider", method = RequestMethod.GET)
public Provider getProvider(@RequestParam String providerId) {
return providerService.getProviderById(providerId);
}
@MethodChinaName("更新数据库配置")
@RequestMapping(path = "updateProviderInfo", method = RequestMethod.POST)
public Provider updateProviderInfo(@RequestBody Provider provider) {
return providerService.saveProvider(provider);
}
// ... existing code ...
}
4.4 配置与DSM模型同步
在application.properties中配置DSM模型同步参数:
# DSM模型同步配置
onecode.dsm.sync.enabled=true
onecode.dsm.sync.mode=code_first
onecode.dsm.namespace=com.ds.admin.db
onecode.dsm.output.dir=src/main/resources/dsm
执行Maven命令触发DSM模型生成:
mvn clean compile com.onecode:onecode-maven-plugin:generate-dsm
4.5 测试与调试
通过OneCode Server启动服务并进行调试:
mvn spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=dev
使用Trae IDE的API测试工具验证接口功能:
GET http://localhost:8080/db/provider/getProvider?providerId=mysql_dev
Accept: application/json
五、核心注解详解
Code First模式通过丰富的注解实现代码与模型的绑定,常用核心注解包括:
| 注解 | 作用域 | 说明 |
|---|---|---|
@Entity | 类 | 标记Java类为领域实体,生成对应的DSM实体模型 |
@Field | 属性 | 描述实体属性,定义字段类型、长度、约束等 |
@Service | 接口/类 | 声明服务组件,用于服务注册与发现 |
@Controller | 类 | 标记控制器组件,定义API请求入口 |
@RequestMapping | 类/方法 | 定义HTTP请求路径与方法映射 |
@MethodChinaName | 方法 | 指定方法的中文名称,用于文档生成 |
@APIEventAnnotation | 类/方法 | 定义API事件元数据,用于权限控制 |
@AIContext | 类/方法 | 提供AI能力上下文信息,支持智能开发 |
六、最佳实践
6.1 代码组织规范
推荐采用DDD领域驱动设计思想组织代码结构:
com.ds.admin.db
├── provider # 模块名称
│ ├── entity # 领域实体
│ ├── repository # 数据访问
│ ├── service # 业务服务
│ │ ├── impl # 服务实现
│ ├── controller # API控制器
│ ├── dto # 数据传输对象
│ └── config # 模块配置
6.2 注解使用原则
- 遵循"最小注解原则",仅添加必要的元数据注解
- 业务逻辑通过代码实现,避免过度依赖注解配置
- 使用
@AIContext为复杂业务方法添加上下文描述,提升AI辅助开发效果 - 为所有对外API方法添加
@MethodChinaName,便于生成中文文档
6.3 性能优化建议
- 对频繁访问的服务方法添加缓存注解
@Cacheable - 使用
@Async注解实现异步处理长时间任务 - 合理设置事务边界,避免大事务影响性能
- 复杂查询通过
@Query注解自定义SQL优化
七、与其他模式对比
| 特性 | Code First | View First | Model First |
|---|---|---|---|
| 入口方式 | Java代码 | 可视化拖拽 | 数据模型 |
| 适用人群 | 专业开发者 | 业务分析师 | 架构师 |
| 灵活性 | ★★★★★ | ★★★☆☆ | ★★★★☆ |
| 开发效率 | ★★★☆☆ | ★★★★★ | ★★★★☆ |
| 学习曲线 | 较陡 | 平缓 | 中等 |
| 复杂业务支持 | 优秀 | 有限 | 良好 |
| 代码可控性 | 完全可控 | 部分可控 | 间接可控 |
八、常见问题解决
Q1: 代码修改后DSM模型未更新?
A1: 检查onecode.dsm.sync.enabled配置是否为true,执行mvn compile触发模型同步,或在Trae IDE中使用"Sync DSM Model"快捷操作。
Q2: 自定义注解不被识别?
A2: 需要在META-INF/spring.factories中注册自定义注解处理器,或继承OneCode提供的AbstractAnnotationProcessor基类。
Q3: 如何实现多数据源支持?
A3: 使用@DS注解指定数据源,配合DynamicDataSourceConfig配置类实现多数据源动态切换:
@Service
public class MultiDataSourceService {
@DS("mysql")
public List<Provider> getMysqlProviders() {
// ...
}
@DS("postgresql")
public List<Provider> getPgProviders() {
// ...
}
}
九、总结
Code First模式为OneCode平台提供了强大的原生开发能力,通过Java代码与注解驱动的方式,既保留了开发者熟悉的编码体验,又能充分利用平台的模型驱动优势。这种模式特别适合复杂业务系统的开发,能够帮助团队在保证代码质量的同时提升开发效率。
随着OneCode 3.0的发布,Code First模式进一步增强了与AI辅助开发的集成,通过@AIContext等注解提供的上下文信息,Trae IDE能够为开发者提供更精准的代码建议和自动补全,实现"人机协同"的开发新范式。对于专业开发团队而言,Code First模式将成为构建企业级应用的首选方式。