1. 若依框架模块化开发概述
若依(RuoYi)作为国内主流的企业级快速开发框架,其模块化设计思想贯穿整个架构体系。我在多个商业项目中使用若依框架时发现,合理的模块划分能显著提升代码可维护性。当我们需要新增业务功能时,创建独立模块是最佳实践,这不同于简单的package分包,而是遵循Spring Boot的模块化标准。
传统单体架构下常见的"大泥球"问题,通过模块化可以有效避免。比如最近开发的供应链管理系统,就将订单、仓储、物流拆分为独立模块,每个模块包含完整的controller-service-mapper结构。这种划分使得团队成员可以并行开发,也便于后期微服务化改造。
2. 环境准备与项目分析
2.1 开发环境配置建议
推荐使用IntelliJ IDEA 2022+版本进行开发,其内置的Spring Boot支持能自动识别模块结构。在开始前需要确认:
- JDK版本需与若依父pom保持一致(通常为1.8或11)
- Maven版本建议3.6.3以上
- 数据库连接池配置正确(检查application.yml中的druid配置)
踩坑提示:曾遇到因本地Maven缓存导致的依赖冲突,建议每次创建新模块前执行
mvn clean install -U
2.2 项目结构深度解析
典型的若依项目包含以下核心模块:
ruoyi-admin // 主启动模块 ruoyi-common // 通用工具类 ruoyi-system // 系统基础模块 ruoyi-quartz // 定时任务新建模块应当与这些核心模块保持平级。通过分析父pom的<modules>配置,可以理解现有的模块依赖关系。
3. 创建新模块完整流程
3.1 使用Maven原型创建
在项目根目录右键选择New→Module,选择Maven类型,输入模块名(如ruoyi-crm)。关键配置项:
- GroupId: 保持与父项目一致(com.ruoyi)
- ArtifactId: 模块名称(全小写中划线格式)
- Version: 继承父pom版本
创建完成后需手动在父pom的<modules>中添加新模块名。这是很多初学者容易遗漏的关键步骤。
3.2 基础结构搭建
新建模块需要包含标准目录结构:
src/main/java/com/ruoyi/[模块名] ├── config // 配置类 ├── controller // 控制层 ├── domain // 实体类 ├── mapper // 数据层 ├── service // 服务层 └── utils // 模块特有工具建议复制system模块的pom依赖,根据实际需求删减。特别注意需要保留:
<dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> </dependency>3.3 模块配置要点
- 启动类注解配置:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class CrmApplication { public static void main(String[] args) { SpringApplication.run(CrmApplication.class, args); } }- 数据源配置建议:
- 小型模块可共享system数据源
- 大型业务模块建议独立数据源,需在application.yml添加:
# 数据源配置 datasource: crm: url: jdbc:mysql://localhost:3306/ry_crm?useSSL=false username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver4. 模块集成与权限控制
4.1 主模块集成配置
在ruoyi-admin的application.yml中添加模块扫描路径:
spring: application: name: ruoyi-admin profiles: active: dev autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 新增模块包扫描 scan: base-packages: com.ruoyi.*.module4.2 权限体系对接
若依的权限控制基于@PreAuthorize注解,新模块需要:
- 在SysMenu表中添加菜单项
- 配置角色菜单关联
- 控制器添加权限注解:
@PreAuthorize("@ss.hasPermi('crm:customer:list')") @GetMapping("/list") public TableDataInfo list(Customer customer) { //... }实战技巧:使用若依代码生成器可以自动创建带权限控制的CRUD代码,大幅提升开发效率
5. 常见问题解决方案
5.1 依赖冲突排查
模块间依赖冲突是高频问题,推荐使用mvn dependency:tree分析。典型冲突场景:
- 不同模块引入同一jar的不同版本
- 传递性依赖与显式声明冲突
解决方案是在父pom的 中统一版本管理。
5.2 热部署失效处理
当新增模块后出现热部署失效,检查以下配置:
- IDEA的Build→Compiler→Build project automatically已勾选
- application.yml添加:
devtools: restart: enabled: true additional-paths: src/main/java5.3 跨模块调用规范
避免循环依赖是模块设计的红线。推荐做法:
- 公共代码抽到common模块
- 使用事件驱动(ApplicationEvent)解耦
- 必要调用通过FeignClient(前后端分离版)
6. 高级应用场景
6.1 多数据源实战
对于需要独立数据库的大型模块,配置步骤如下:
- 创建DataSource配置类:
@Configuration @MapperScan(basePackages = "com.ruoyi.crm.mapper", sqlSessionTemplateRef = "crmSqlSessionTemplate") public class CrmDataSourceConfig { // 详细配置参考ruoyi-quartz模块 }- 在Service层通过@DS注解切换数据源:
@Service @DS("crm") public class CustomerServiceImpl implements CustomerService { //... }6.2 定时任务集成
若依内置Quartz支持,新模块添加定时任务:
- 实现Job接口:
public class CrmSyncJob implements Job { @Override public void execute(JobExecutionContext context) { // 业务逻辑 } }- 通过SysJob表配置任务参数
- 在模块中添加JobLog表对应实体
6.3 前端集成方案
前后端分离版本需要注意:
- 在api目录下新建模块对应的js文件
- 配置vue-router动态路由
- 权限标识需与后端保持一致
// 前端API调用示例 export function listCustomer(query) { return request({ url: '/crm/customer/list', method: 'get', params: query }) }7. 性能优化建议
- 模块启动加速:
- 合理使用@Lazy延迟初始化
- 控制自动配置类扫描范围
- 非必要组件改为运行时注入
- 数据库访问优化:
- 模块独立数据源时配置连接池参数
- 二级缓存建议使用Redis集中管理
- 复杂查询使用@Async异步处理
- 日志分离方案:
<!-- 在logback-spring.xml中添加 --> <appender name="CRM_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logs/crm/crm.log</file> <!-- 其他配置 --> </appender> <logger name="com.ruoyi.crm" level="DEBUG" additivity="false"> <appender-ref ref="CRM_FILE"/> </logger>在最近的一个电商平台项目中,通过模块化改造使系统启动时间从58秒降至23秒。关键是把数十个定时任务拆分为独立模块,并采用按需加载策略。这印证了良好的模块划分不仅能提升开发效率,对运行时性能也有显著改善。