1276 字
6 分钟
RuoYi 阶段二:Spring Boot 基础与项目结构
NOTE

本文是 RuoYi 学习路线的阶段二,聚焦 Spring Boot 基础。学完本篇你应该能:

  1. 理解 IoC 和依赖注入的原理
  2. 掌握 Spring Boot 常用注解
  3. 知道 RuoYi 是如何组织代码的

前端视角:Spring Boot 像什么?#

Spring Boot前端类比
IoC 容器React Context / Vue Provide-Inject
@AutowireduseContext() / inject()
@Component注册全局组件
@Service业务逻辑层(类似 Redux actions)
@Controller路由处理器
@Configuration配置文件
自动配置Vite 插件自动注入

Spring Boot 核心概念#

1. IoC(控制反转)与 DI(依赖注入)#

传统方式(自己 new 对象):

// 传统方式:自己创建依赖
public class UserController {
private UserService userService = new UserServiceImpl(); // 硬编码依赖
public void getUser() {
userService.findById(1);
}
}

Spring 方式(容器管理对象):

// Spring 方式:容器注入依赖
@RestController
public class UserController {
@Autowired
private UserService userService; // 容器自动注入
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
TIP

IoC 的核心思想:不要自己创建对象,让容器帮你创建和管理。

类比前端:就像 React 的 Context,你不需要在每个组件里传递 props,而是从 Context 中获取。

2. Bean 的生命周期#

实例化 -> 属性赋值 -> 初始化 -> 使用 -> 销毁
↑ ↑ ↑ ↑
| | | |
new() @Autowired @PostConstruct @PreDestroy

Spring Boot 常用注解#

组件注解#

注解说明RuoYi 中的使用
@Component通用组件工具类
@Service业务逻辑层SysUserServiceImpl
@Repository数据访问层MyBatis Mapper
@Controller控制器层SysUserController
@RestControllerREST 控制器返回 JSON 的接口

依赖注入注解#

注解说明
@Autowired按类型自动注入
@Qualifier按名称指定注入
@ResourceJSR-250 标准注入
@Value注入配置文件值

Web 注解#

注解说明
@RequestMapping通用请求映射
@GetMappingGET 请求
@PostMappingPOST 请求
@PutMappingPUT 请求
@DeleteMappingDELETE 请求
@PathVariable路径参数
@RequestParam查询参数
@RequestBody请求体

RuoYi 中的实际应用#

Controller 层示例#

src/main/java/com/ruoyi/web/controller/system/SysUserController.java
package com.ruoyi.web.controller.system;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysUserService;
/**
* 用户信息
*
* @author ruoyi
*/
@Controller
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
private String prefix = "system/user";
@Autowired
private ISysUserService userService;
@RequiresPermissions("system:user:view")
@GetMapping()
public String user() {
return prefix + "/user";
}
@RequiresPermissions("system:user:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(SysUser user) {
startPage();
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@RequiresPermissions("system:user:add")
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(@Validated SysUser user) {
return toAjax(userService.insertUser(user));
}
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:user:edit")
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(@Validated SysUser user) {
return toAjax(userService.updateUser(user));
}
@Log(title = "用户管理", businessType = BusinessType.DELETE)
@RequiresPermissions("system:user:remove")
@PostMapping("/remove")
@ResponseBody
public AjaxResult remove(String ids) {
return toAjax(userService.deleteUserByIds(ids));
}
}

Service 层示例#

src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
package com.ruoyi.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysUserService;
/**
* 用户 业务层处理
*
* @author ruoyi
*/
@Service
public class SysUserServiceImpl implements ISysUserService {
@Autowired
private SysUserMapper userMapper;
@Override
public List<SysUser> selectUserList(SysUser user) {
return userMapper.selectUserList(user);
}
@Override
public SysUser selectUserById(Long userId) {
return userMapper.selectUserById(userId);
}
@Override
@Transactional
public int insertUser(SysUser user) {
// 新增用户信息
int rows = userMapper.insertUser(user);
// 新增用户岗位关联
insertUserPost(user);
// 新增用户与角色管理
insertUserRole(user);
return rows;
}
@Override
@Transactional
public int updateUser(SysUser user) {
// 删除用户与角色关联
userMapper.deleteUserRoleByUserId(user.getUserId());
// 新增用户和角色管理
insertUserRole(user);
// 删除用户与岗位关联
userMapper.deleteUserPostByUserId(user.getUserId());
// 新增用户与岗位管理
insertUserPost(user);
return userMapper.updateUser(user);
}
@Override
@Transactional
public int deleteUserByIds(String ids) {
return userMapper.deleteUserByIds(Convert.toStrArray(ids));
}
}

配置类示例#

src/main/java/com/ruoyi/framework/config/ShiroConfig.java
package com.ruoyi.framework.config;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.Filter;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Shiro 配置
*
* @author ruoyi
*/
@Configuration
public class ShiroConfig {
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置 Realm
securityManager.setRealm(userRealm());
return securityManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
// 配置过滤链
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
filterChainDefinitionMap.put("/**", "authc");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
}

自动配置原理#

Spring Boot 的自动配置是通过 @EnableAutoConfiguration 实现的:

// Spring Boot 启动时会扫描 META-INF/spring.factories
// 加载所有自动配置类
// 例如:DataSourceAutoConfiguration
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
// 自动配置数据源
}

RuoYi 排除了默认的数据源自动配置:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication {
// 使用 Druid 自定义数据源
}

项目分层架构#

┌─────────────────────────────────────────┐
│ Controller 层 │
│ (接收请求、参数校验、返回响应) │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Service 层 │
│ (业务逻辑、事务控制、数据组装) │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Mapper 层 │
│ (数据库操作、SQL 执行) │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Database │
│ (MySQL 数据存储) │
└─────────────────────────────────────────┘

RuoYi 包结构规范#

包名职责示例
controller接收 HTTP 请求SysUserController
service业务逻辑接口ISysUserService
service.impl业务逻辑实现SysUserServiceImpl
mapper数据库访问接口SysUserMapper
domain实体类SysUser
domain.vo视图对象UserVO
domain.dto数据传输对象UserDTO

复习卡片#

// Spring Boot 核心注解记忆
// @SpringBootApplication - 启动类
// @RestController - REST 控制器
// @Service - 业务层
// @Repository - 数据层
// @Autowired - 自动注入
// @RequestMapping - 请求映射
// IoC 核心思想
// 不要自己 new,让容器帮你管理
// 分层架构
// Controller -> Service -> Mapper -> Database
// RuoYi 包结构
// com.ruoyi.system.controller
// com.ruoyi.system.service
// com.ruoyi.system.mapper
// com.ruoyi.system.domain
概念说明
IoC控制反转,对象由容器创建
DI依赖注入,容器自动装配依赖
BeanSpring 管理的对象实例
自动配置Spring Boot 根据依赖自动配置 Bean
TIP

下一步:阶段三:MyBatis 与数据库操作

在阶段三中,我们将深入理解 MyBatis 的工作原理,以及 RuoYi 是如何进行数据库操作的。

RuoYi 阶段二:Spring Boot 基础与项目结构
http://117.72.32.87/blog/posts/ruoyi-roadmap-02-springboot-basics/
作者
Ethan
发布于
2026-09-07
许可协议
CC BY-NC-SA 4.0