☰
如何搭建属于自己的第一个项目01
2026/10/2 13:58:25 网站建设 项目流程

前言

**为了让学弟学妹在后端学习时少走弯路,决定写一篇教程(至于多少期我也不好说嘿嘿)也是为我自己的学习进步做记录。我要带你拆解一个后端项目,比如从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 里放的是通用工具类和全局常量,比如统一返回结果 BaseResponse;config 是项目的“总控台”,比如配置跨域、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 在运行时,为你的目标对象生成一个"代理对象",在调用真实方法前后插入额外逻辑。

@Aspect@ComponentpublicclassLogAspect{// 切入点:所有 service 包下的方法@Pointcut("execution(* com.example.service.*.*(..))")publicvoidpointcut(){}@Before("pointcut()")publicvoidbefore(){System.out.println("方法开始执行");}@AfterReturning("pointcut()")publicvoidafter(){System.out.println("方法执行结束");}@Around("pointcut()")publicObjectaround(ProceedingJoinPointpjp)throwsThrowable{longstart=System.currentTimeMillis();Objectresult=pjp.proceed();// 执行目标方法System.out.println("耗时:"+(System.currentTimeMillis()-start));returnresult;}}

@Around 是 AOP 中最强大的通知,它能完全包裹目标方法——在方法执行前后都能插入逻辑,甚至能决定目标方法到底执不执行、改不改返回值。

其他通知(@Before、@After)只能"在边上看着",而 @Around 是"把方法攥在手里"。它是 AOP 里功能最全、控制力最强的通知,几乎所有复杂场景(事务、缓存、重试、性能监控)都靠它实现。代价就是——必须自己调用 proceed(),责任也最大。

三、关于一些通用AOP

1.AuthInterceptor
在请求到达 Controller 之前,校验用户是否登录、有没有权限。没权限直接拦下,返回 401/403。

@Aspect@ComponentpublicclassAuthAspect{@Around("@annotation(RequirePermission)")publicObjectcheck(ProceedingJoinPointpjp)throwsThrowable{// 拿注解上的权限要求Methodmethod=((MethodSignature)pjp.getSignature()).getMethod();RequirePermissionanno=method.getAnnotation(RequirePermission.class);// 校验当前用户权限if(!PermissionUtil.has(anno.value())){thrownewNoPermissionException("无权限");}returnpjp.proceed();// 有权限才执行}}

2.LogInterceptor
记录每次请求的入参、出参、耗时、异常,方便排查问题。

@Aspect@ComponentpublicclassLogAspect{@Around("execution(* com.example.controller..*.*(..))")publicObjectlog(ProceedingJoinPointpjp)throwsThrowable{// 方法名 + 入参Stringmethod=pjp.getSignature().toShortString();Object[]args=pjp.getArgs();System.out.println("调用:"+method+",参数:"+Arrays.toString(args));longstart=System.currentTimeMillis();try{Objectresult=pjp.proceed();System.out.println("返回:"+result+",耗时:"+(System.currentTimeMillis()-start));returnresult;}catch(Throwablee){System.out.println("异常:"+e.getMessage());throwe;// 别吞掉,否则业务感知不到}}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询