前后端交互ajax(Spring基础@Component、 @Controller等注解的底层实现,通俗易懂)

前后端交互ajax(Spring基础@Component、 @Controller等注解的底层实现,通俗易懂)
Spring基础@Component、 @Controller等注解的底层实现,通俗易懂

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(辅助员) → 数据库/工具类

  • 前端调用 POST /login 传递用户名密码 → LoginController(@RestController)接收请求;
  • LoginController 调用 userService.login() → SysUserServiceImpl(@Service)处理业务;
  • SysUserServiceImpl 调用 userMapper.selectUserByUserName()(@Mapper)查询数据库;
  • 同时调用 passwordUtils.matches()(@Component)验证密码;
  • SystemConfig(@Configuration)定义的 PasswordUtils 和 BCryptPasswordEncoder 作为 Bean 被注入使用;
  • 最终结果通过 AjaxResult 返回给前端。
  • 这 5 个注解的底层核心是「Spring 组件注册机制」,差异在于「语义定位」和「专属功能」;

    生活类比核心:

    @Controller = 接待员(接订单)→ @Service = 后厨主管(做业务)→ @Mapper = 记账员(查库存)→ @Configuration = 店长(定规则)→ @Component = 辅助员(打杂);

    通过这些注解实现:请求从 @Controller 进入,经 @Service 处理业务,调用 @Mapper 操作数据库,所有组件的创建规则由 @Configuration 定义,通用能力由 @Component 提供。

    前后端交互ajax(Spring基础@Component、 @Controller等注解的底层实现,通俗易懂)

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

    相关阅读