ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何搭建属于自己的第一个项目01

如何搭建属于自己的第一个项目01 前言**为了让学弟学妹在后端学习时少走弯路决定写一篇教程至于多少期我也不好说嘿嘿也是为我自己的学习进步做记录。我要带你拆解一个后端项目比如从github上下载一个项目如何看哪些是必须修改的内容理清楚后端需要什么基础的模块哪些代码是通用的模板更加适合后端学完脑子一团麻不知道从哪开始梳理什么项目适合自己做的同学们。相信我看完你一定会有收获的。即使在AI时代有一个自己的开发模板也是至关重要的在此基础上再使用agent开发也会事半功倍。注部分内容参考了鱼皮大佬的教程也是受他的启发开始写教程的感谢恩师鱼皮。废话不多说进入今天的正题吧。一、分析整体再看配置拿到一个项目首先要先进行jdk的选择目前很多项目使用jdk21都可以跑起来对于新项目不太建议使用更靠前的jdk了会与springboot等依赖冲突我在版本不适配这里踩过很多坑依赖报错优先检查自己的jdk版本是不是不匹配。然后是整体观察项目分析每一个文件中都是存放什么内容的。咱们顺着这个目录树自上而下把每个“抽屉”里装的东西给你掏出来看看。首先项目最外层是典型的 Maven 结构.idea 是 IDEA 的本地配置.mvn 和 doc、sql 分别是 Maven 包装器、项目文档和数据库初始化脚本这些属于工程配套不是代码核心。真正的主战场在 src/main/java 下的 com.yupi.springbootinit 这个包路径里。最核心的业务骨架是 controller、service 和 mapper 这三层。 controller 是项目的“前台接待”所有外部请求比如前端发来的 HTTP 请求都先打到这儿它负责校验参数、然后指挥 service 干活。service 是“业务大脑”真正的逻辑——比如用户注册、文章发布、调用第三方接口——都写在这里它通常还会细分为接口和实现类。而 mapper 则是“仓库管理员”专门负责和数据库打交道执行增删改查的 SQL 语句这一层通常和 model 里的实体类一一对应。model 文件夹里装的就是数据库表对应的 Java 对象Entity以及前端传过来、要返回给前端的各种请求/响应对象DTO/VO。围绕着这三层还有一些“辅助工种”。common 里放的是通用工具类和全局常量比如统一返回结果 BaseResponseconfig 是项目的“总控台”比如配置跨域、Swagger 接口文档、拦截器、线程池等constant 专门放各种枚举和常量避免代码里出现魔法值exception 负责全局异常处理让报错更优雅utils 则是零散的工具方法比如日期转换、文件上传。annotation 和 aop 是“高级玩法”前者定义自定义注解比如权限校验后者用切面编程在方法执行前后插入逻辑比如打日志、做鉴权这两者经常搭配使用。剩下几个包则带着明显的业务特征。 job 是定时任务比如每天凌晨统计一下公众号的阅读量manager 通常是对第三方服务的封装比如调用微信 API、调用 AI 接口把外部调用和内部业务解耦wxmp 一看就是微信公众号WeChat MP相关的专属模块比如处理消息推送、菜单管理esdao 则是 Elasticsearch 的数据访问层说明这个项目用到了 ES 做全文搜索和 mapper 是“两套数据库班子”。最底下那个 MainApplication 是 Spring Boot 的启动入口整个项目从这里“点火”跑起来。最后resources 文件夹里装的是配置文件比如 application.yml和静态资源test 则是单元测试的代码。整体看下来这个项目结构清晰、职责分明是一个非常适合拿来学习“企业级后端怎么组织代码”的样板。接下来就是进行全局配置界面进行相关修改。datasource:url中的数据库要改成自己的相应的username与password也要修改。同理如果项目有其他类型的数据库也应改成自己的。server: port: 按需更改。二、AOP------与核心业务无关的不可或缺的功能模块AOP是Spring的重难点基本每个项目都绕不开。可能很多同学有印象但是忘记了先复习一下必须要知道的。Aspect Oriented Programming是面向切面编程。把那些和业务无关、但到处都要用的代码比如日志、事务、权限检查从业务代码里抽出来统一处理。publicvoidtransfer(){System.out.println(开始记录日志);// 日志// 开启事务 // 事务checkPermission();// 权限// ↓↓↓ 真正的业务逻辑 ↓↓↓doTransfer();// ↑↑↑ 真正的业务逻辑 ↑↑↑// 提交事务System.out.println(结束记录日志);}问题日志、事务、权限这些代码 和业务无关却到处都是重复且难维护。AOP 的目标让业务代码只管业务其他杂活交给 AOP。|概念| 解释 ||切面|一个功能模块比如日志切面、事务切面|| 切入点 | 实际选择要插入的位置用表达式筛选 ||通知 |插入的动作方法前/后/环绕执行什么 || 织入 | 把切面代码织进目标对象的过程 |AOP 的底层就是 动态代理。Spring 在运行时为你的目标对象生成一个代理对象在调用真实方法前后插入额外逻辑。AspectComponentpublicclassLogAspect{// 切入点所有 service 包下的方法Pointcut(execution(* com.example.service.*.*(..)))publicvoidpointcut(){}Before(pointcut())publicvoidbefore(){System.out.println(方法开始执行);}AfterReturning(pointcut())publicvoidafter(){System.out.println(方法执行结束);}Around(pointcut())publicObjectaround(ProceedingJoinPointpjp)throwsThrowable{longstartSystem.currentTimeMillis();Objectresultpjp.proceed();// 执行目标方法System.out.println(耗时(System.currentTimeMillis()-start));returnresult;}}Around 是 AOP 中最强大的通知它能完全包裹目标方法——在方法执行前后都能插入逻辑甚至能决定目标方法到底执不执行、改不改返回值。其他通知Before、After只能在边上看着而 Around 是把方法攥在手里。它是 AOP 里功能最全、控制力最强的通知几乎所有复杂场景事务、缓存、重试、性能监控都靠它实现。代价就是——必须自己调用 proceed()责任也最大。三、关于一些通用AOP1.AuthInterceptor在请求到达 Controller 之前校验用户是否登录、有没有权限。没权限直接拦下返回 401/403。AspectComponentpublicclassAuthAspect{Around(annotation(RequirePermission))publicObjectcheck(ProceedingJoinPointpjp)throwsThrowable{// 拿注解上的权限要求Methodmethod((MethodSignature)pjp.getSignature()).getMethod();RequirePermissionannomethod.getAnnotation(RequirePermission.class);// 校验当前用户权限if(!PermissionUtil.has(anno.value())){thrownewNoPermissionException(无权限);}returnpjp.proceed();// 有权限才执行}}2.LogInterceptor记录每次请求的入参、出参、耗时、异常方便排查问题。AspectComponentpublicclassLogAspect{Around(execution(* com.example.controller..*.*(..)))publicObjectlog(ProceedingJoinPointpjp)throwsThrowable{// 方法名 入参Stringmethodpjp.getSignature().toShortString();Object[]argspjp.getArgs();System.out.println(调用method参数Arrays.toString(args));longstartSystem.currentTimeMillis();try{Objectresultpjp.proceed();System.out.println(返回result耗时(System.currentTimeMillis()-start));returnresult;}catch(Throwablee){System.out.println(异常e.getMessage());throwe;// 别吞掉否则业务感知不到}}}
返回列表