Spring基础@Component、 @Controller等注解的底层实现,通俗易懂前端调用 POST /login 传递用户名密码 → LoginController(@RestController)接收请求; LoginController 调用 userService.login() → SysUserServiceImpl(@Service)处理业务; SysUserServiceImpl 调用 userMapper.selectUserByUserName()(@Mapper)查询数据库; 同时调用 passwordUtils.matches()(@Component)验证密码; SystemConfig(@Configuration)定义的 PasswordUtils 和 BCryptPasswordEncoder 作为 Bean 被注入使用; 最终结果通过 AjaxResult 返回给前端。
Spring基础@Controller、@Service、@Component、@Configuration、@Mapper注解的底层实现,通俗易懂
@Component 注解示例(通用工具类):作用:标记通用工具组件,纳入 Spring 容器管理,提供全局通用能力。相当于通用能力的 “辅助员”
优点:标注通用工具类,纳入 Spring 容器,提供全局可复用能力
package com.ruoyi.common.utils;import org.springframework.stereotype.Component;/** * 密码加密工具类(通用组件) * @Component:通用组件注解,标记无明确分层的工具类,Spring会将其注册为Bean * 被Service层注入使用,提供密码加密的通用能力 */@Componentpublic class PasswordUtils { /** * 模拟BCrypt密码加密(实际项目用Spring Security的BCryptPasswordEncoder) * @param password 明文密码 * @return 加密后的密码 */ public String encrypt(String password) { // 简化示例:实际是不可逆加密,这里模拟 return "encrypted_" + password; } /** * 验证密码是否匹配 * @param rawPassword 明文密码 * @param encodedPassword 加密后的密码 * @return 是否匹配 */ public boolean matches(String rawPassword, String encodedPassword) { return encodedPassword.equals("encrypted_" + rawPassword); }}@Mapper 注解示例(数据层)作用:标记 MyBatis 数据层接口,MyBatis 自动生成动态代理实现类,封装数据库操作。相当于数据库操作的 “记账员”
优点:标注数据层接口,无需实现类,MyBatis 自动生成代理,专注数据库操作
package com.ruoyi.system.mapper;import com.ruoyi.system.domain.SysUser;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;/** * 用户Mapper接口(数据层) * @Mapper:标记为MyBatis数据层组件,MyBatis会为该接口生成动态代理实现类 * 无需手写实现类,SQL可写在注解里或Mapper.xml中 */@Mapperpublic interface SysUserMapper { /** * 根据用户名查询用户信息 * @param userName 用户名 * @return 用户实体 */ SysUser selectUserByUserName(@Param("userName") String userName); /** * 新增用户(示例SQL,实际可写在SysUserMapper.xml中) * @param user 用户实体 * @return 影响行数 */ int insertUser(SysUser user);}@Configuration 注解示例(配置类):作用:标记配置类,通过 @Bean 定义核心组件(替代 XML 配置),集中管理配置逻辑。相当于配置规则的 “店长”
优点:标注配置类,通过@Bean定义核心组件,集中管理配置逻辑,保证 Bean 单例
package com.ruoyi.framework.config;import com.ruoyi.common.utils.PasswordUtils;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;/** * 系统配置类 * @Configuration:标记为配置类,Spring会通过CGLIB代理增强该类,保证@Bean方法返回单例 * 用于定义项目核心组件(如密码加密器、数据源等) */@Configurationpublic class SystemConfig { /** * 定义密码加密器Bean(实际项目用这个,上面的PasswordUtils是简化示例) * @Bean:将方法返回值注册为Spring Bean,默认单例,可被其他组件注入 * @return BCrypt密码加密器 */ @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } /** * 手动注册自定义密码工具类(也可通过@Component自动扫描,二选一) * 演示@Bean的用法:适合需要自定义创建逻辑的Bean */ @Bean public PasswordUtils passwordUtils() { return new PasswordUtils(); }}@Service 注解示例(业务层)作用:标记业务层组件,封装核心业务逻辑,是事务控制的核心层。相当于业务逻辑的 “后厨主管”
优点:标注业务层,封装核心逻辑,支持事务管理,是 Controller 和 Mapper 的中间层
package com.ruoyi.system.service.impl;import com.ruoyi.common.utils.PasswordUtils;import com.ruoyi.system.domain.SysUser;import com.ruoyi.system.mapper.SysUserMapper;import com.ruoyi.system.service.ISysUserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;/** * 用户业务层实现类 * @Service:标记为业务层组件,Spring扫描后注册为Bean,支持依赖注入和事务管理 * 封装用户登录校验、新增用户等核心业务逻辑 */@Servicepublic class SysUserServiceImpl implements ISysUserService { // 注入Mapper(数据层):Spring自动从容器中获取SysUserMapper的代理实例 @Autowired private SysUserMapper userMapper; // 注入通用工具类:Spring自动从容器中获取PasswordUtils Bean @Autowired private PasswordUtils passwordUtils; /** * 用户登录校验业务 * @Transactional:事务注解,Service层是事务控制的最佳位置(这里查询无需事务,仅演示) * @param userName 用户名 * @param password 密码 * @return 校验结果(true=成功,false=失败) */ @Override @Transactional(readOnly = true) // 只读事务,优化性能 public boolean login(String userName, String password) { // 1. 调用Mapper查询用户 SysUser user = userMapper.selectUserByUserName(userName); if (user == null) { return false; } // 2. 调用工具类验证密码 return passwordUtils.matches(password, user.getPassword()); } /** * 新增用户业务(演示事务:新增失败则回滚) * @Transactional:默认REQUIRED,有事务则加入,无则新建 */ @Override @Transactional public boolean addUser(SysUser user) { // 1. 密码加密 user.setPassword(passwordUtils.encrypt(user.getPassword())); // 2. 插入数据库(若插入失败,事务会回滚) int rows = userMapper.insertUser(user); return rows > 0; }}@Controller/@RestController注解示例(控制层):作用:标记控制层组件,处理前端 HTTP 请求,是请求入口,调用业务层处理逻辑。相当于前端请求的 “接待员”
优点:标注请求入口,映射 URL 路径,接收前端参数,调用 Service,返回 JSON 结果
package com.ruoyi.system.controller;import com.ruoyi.common.core.domain.AjaxResult;import com.ruoyi.system.service.ISysUserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;/** * 登录控制层(请求入口) * @RestController:=@Controller + @ResponseBody,返回JSON数据(而非视图) * 处理前端登录请求,调用Service层完成业务逻辑,返回结果给前端 */@RestControllerpublic class LoginController { // 注入业务层组件:Spring自动从容器中获取SysUserServiceImpl实例 @Autowired private ISysUserService userService; /** * 登录接口 * @PostMapping("/login"):映射POST请求到/login路径,接收前端JSON参数 * @param loginBody 登录参数(用户名+密码) * @return AjaxResult:统一返回结果(成功/失败) */ @PostMapping("/login") public AjaxResult login(@RequestBody LoginBody loginBody) { // 1. 调用Service层校验登录 boolean success = userService.login(loginBody.getUserName(), loginBody.getPassword()); if (success) { // 2. 登录成功:生成Token(简化示例,实际用JWT) return AjaxResult.success("登录成功", "token_123456"); } else { // 3. 登录失败:返回错误信息 return AjaxResult.error("用户名或密码错误"); } } /** * 内部静态类:接收前端登录参数 */ public static class LoginBody { private String userName; private String password; // getter/setter(Lombok可简化,这里手动写) public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }}配套实体类(SysUser)和统一返回类(AjaxResult)
// 1. 用户实体类(com.ruoyi.system.domain.SysUser)package com.ruoyi.system.domain;import lombok.Data;/** * 用户实体类(对应数据库sys_user表) */@Data // Lombok:自动生成getter/setter/toStringpublic class SysUser { private Long userId; // 用户ID private String userName; // 用户名 private String password; // 密码(加密后) private String nickName; // 昵称}// 2. 统一返回结果类(com.ruoyi.common.core.domain.AjaxResult)package com.ruoyi.common.core.domain;import lombok.Data;/** * 统一返回结果(前后端交互标准) */@Datapublic class AjaxResult { private int code; // 状态码:200=成功,500=失败 private String msg; // 提示信息 private Object data; // 返回数据 // 成功静态方法 public static AjaxResult success(String msg, Object data) { AjaxResult result = new AjaxResult(); result.setCode(200); result.setMsg(msg); result.setData(data); return result; } // 失败静态方法 public static AjaxResult error(String msg) { AjaxResult result = new AjaxResult(); result.setCode(500); result.setMsg(msg); return result; }}业务层接口(ISysUserService)
package com.ruoyi.system.service;import com.ruoyi.system.domain.SysUser;/** * 用户业务层接口(规范业务方法) */public interface ISysUserService { /** * 登录校验 */ boolean login(String userName, String password); /** * 新增用户 */ boolean addUser(SysUser user);}核心调用链路(对应生活案例)
前端请求 → @RestController(接待员) → @Service(后厨主管) → @Mapper(记账员)/@Component(辅助员) → 数据库/工具类
这 5 个注解的底层核心是「Spring 组件注册机制」,差异在于「语义定位」和「专属功能」;
生活类比核心:
@Controller = 接待员(接订单)→ @Service = 后厨主管(做业务)→ @Mapper = 记账员(查库存)→ @Configuration = 店长(定规则)→ @Component = 辅助员(打杂);
通过这些注解实现:请求从 @Controller 进入,经 @Service 处理业务,调用 @Mapper 操作数据库,所有组件的创建规则由 @Configuration 定义,通用能力由 @Component 提供。

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有