- 博客(40)
- 资源 (1)
- 收藏
- 关注
原创 Spring Boot 钩子全集实战(五):ApplicationContextInitializer详解
是 Spring Boot 启动流程中连接环境准备与容器刷新的关键桥梁,它与形成“环境 → 容器”的完整扩展链路,是构建企业级高可靠、高安全、高可观测性应用不可或缺的一环。📌关注我,每天 5 分钟,带你从 Java 小白变身编程高手!👉 私信 “SpringBoot 钩子源码” 获取完整源码!
2026-01-08 22:35:31
329
原创 Spring Boot 钩子全集实战(四):`SpringApplicationRunListener.environmentPrepared()` 详解
终极校验:对最终生效的环境做合法性兜底校验,拦截非法部署;上下文传递:实现跨生命周期的启动上下文共享,替代全局变量;环境隔离:强制绑定环境与配置特征,防止配置逃逸;配置增强:根据机器 / 环境特征动态调整运行参数,实现配置自适应。相较于更聚焦于「环境层面的兜底与增强」,是构建生产级高可靠应用的关键扩展点。📌关注我,每天 5 分钟,带你从 Java 小白变身编程高手!👉 私信 “SpringBoot 钩子源码” 获取完整源码!
2025-12-30 21:48:23
759
原创 Spring Boot 钩子全集实战(三):`EnvironmentPostProcessor` 详解
配置中心化:从配置中心拉取配置,解耦配置与代码;配置加密:敏感配置密文存储,运行时动态解密;动态覆盖:基于环境 / 机器标签动态调整配置;配置校验:提前拦截非法配置,保障应用启动成功。相较于更聚焦于配置层面的扩展,是构建 “配置即代码”“配置统一管控” 生产级应用的关键工具。📌关注我,每天 5 分钟,带你从 Java 小白变身编程高手!👉 私信 “SpringBoot 钩子源码” 获取完整源码!
2025-12-20 21:07:15
1072
1
原创 Spring Boot 钩子全集实战(二):`SpringApplicationRunListener.starting()` 详解
starting()是 Spring Boot 启动生命周期中最早可介入的扩展点。此时日志系统已就绪,但配置未加载、容器未创建,是执行底层、非业务、高优先级初始化逻辑的理想时机。starting()虽小,却是构建高可用、可观测、安全可控的 Spring Boot 应用的第一道防线。📌关注我,每天5分钟,带你从 Java 小白变身编程高手!👉 私信"SpringBoot钩子源码" 获取源码!
2025-12-15 21:54:46
624
1
原创 Spring Boot 钩子全集实战(一):构造与配置阶段
简单来说,就是你创建对象到执行run方法之前的这段时间。还没有真正启动 Spring 容器!核心作用是容器刷新前修改上下文,适用于早期全局配置注入;用于监听 Spring 事件,实现启动 / 运行阶段的自定义响应逻辑;setXXX系列是配置 SpringApplication 核心属性,覆盖 Banner、Web 类型、配置文件等基础行为。这些钩子均在执行前调用📌关注我,每天5分钟,带你从 Java 小白变身编程高手!👉 私信"SpringBoot钩子源码" 获取源码!
2025-12-14 22:23:21
1138
1
原创 Spring Boot 启动流程源码解析:从 `main()` 到 Web 服务就绪
你是否曾:答案,都在 的源码里。今天,我们就逐行拆解 Spring Boot 3.x(兼容 2.x)的启动主流程,带你从 方法一路走到内嵌 Tomcat 启动完成!看似简单,实则调用了 的静态方法:二、阶段 1:构造 对象🔑 核心动作:推断 Web 类型:加载扩展点:通过 读取 中的 SPI 实现。这是最核心的方法,我们分步解析: 返回所有 实例(默认是 ) 发布 → 可用于早期日志初始化、APM 埋点步骤 2:准备 Environment(环境)在
2025-12-14 22:22:24
1178
原创 手撸 Spring 简易版 AOP
/ 标记切面类// 前置通知// 切点表达式,如 "com.example.service.UserServiceImpl.getUser"// 后置通知📌 切点表达式简化为全限定方法名(如),不使用 AspectJ 表达式。@OverrideSystem.out.println("业务逻辑:获取用户");
2025-12-11 20:50:02
422
原创 Spring AOP 源码深度解析:从代理创建到通知执行的完整链路
Spring 容器启动]↓@EnableAspectJAutoProxy → 注册 AnnotationAwareAspectJAutoProxyCreator↓Bean 初始化完成 → postProcessAfterInitialization()↓wrapIfNecessary() → 查找匹配的 Advisor↓存在匹配切面?→ 是 → createProxy() → 返回代理对象↓ 否返回原始 Bean↓。
2025-12-11 20:49:18
934
原创 从浏览器输入 URL 到访问到 Controller 方法:Spring MVC 请求处理全流程解析
从 URL 到 Controller,不是“魔法”,而是一套高度模块化、可扩展的请求处理管道。📌关注我,每天5分钟,带你从 Java 小白变身编程高手!
2025-12-08 23:53:41
874
原创 Spring AOP:面向切面编程的优雅解耦之道
AOP 是一种编程范式,用于将与核心业务无关但又广泛使用的功能(如日志、事务)模块化为“切面(Aspect)”,并在运行时动态织入目标方法。概念说明Aspect(切面)横切关注点的模块化,如日志切面、事务切面Join Point(连接点)程序执行过程中的某个点,如方法调用、异常抛出(Spring AOP 仅支持方法级)Pointcut(切入点)匹配哪些连接点要被拦截(通过表达式定义)Advice(通知)切面在特定连接点上执行的动作(前置、后置、环绕等)Weaving(织入)
2025-12-07 22:40:18
521
原创 手撸 Spring 简易版 IOC
/ 对应 Spring 的 @Component// 对应 Spring 的 @Autowired// 对应 Spring 的 @Configuration + @ComponentScan/** * 模拟 Spring 的 BeanDefinition:存储 Bean 的元信息 */// Bean 对应的类// Bean 作用域(默认单例)// 是否懒加载。
2025-12-06 11:34:43
1016
原创 Spring IOC 核心源码解析
对于新手来说,不用一上来就啃全量源码,先抓住和:本文以 Spring 6.x 中基于注解的 IOC 容器入口是。
2025-12-06 11:33:26
530
原创 Spring IoC:控制反转的核心容器机制
IoC 是一种设计原则,用于将对象的创建、组装和生命周期管理交给外部容器,而不是由程序代码直接控制。核心组件核心概念Bean:由 Spring 容器管理的对象:依赖注入,IoC 的具体实现方式配置方式:XML、注解(@Component@Service)、Java 配置类(通过反射 + 配置元数据,自动构建对象图并注入依赖@Service@Override@Component@Autowired步骤操作说明1. 定义 Bean使用@Component。
2025-12-05 00:19:40
543
原创 Java SPI:服务发现的轻量级标准
SPI 是 Java 提供的一种服务发现机制,用于解耦接口定义与具体实现。核心包约定位置:在目录下放置配置文件文件命名:以接口全限定名为文件名文件内容:每行写一个实现类的全限定名通过配置文件 + 类加载器 + 反射,动态加载接口实现步骤操作说明1. 定义接口位于 core 模块2. 实现接口位于 plugin 模块3. 配置文件META-INF/services/全限定接口名内容为实现类全名4. 加载服务返回 Iterable5. 遍历使用自动实例化(调用无参构造)
2025-12-03 20:58:12
419
原创 Java 泛型-编译期的魔法师
Java 的泛型会在编译完成后// true!两者在 JVM 中都是,泛型信息已消失。泛型是 Java 类型系统的重要基石,它用“编译期的严格”换取“运行时的安全”。理解类型擦除是掌握泛型的关键——它解释了为什么泛型不能做某些事,也揭示了 Java 为了向后兼容所做的妥协。📌最佳实践优先使用泛型,提升代码安全性;避免在业务代码中滥用反射破坏泛型;框架开发中善用泛型 + 反射实现通用能力。关注我,每天5分钟,带你从 Java 小白变身编程高手!
2025-12-01 21:18:31
523
原创 重载和重写到底有啥区别?
发生在同一个类中,方法名相同,但参数列表不同(类型、个数、顺序)。// 两个整数相加// 三个整数相加// 两个小数相加方法名必须相同;参数列表必须不同(返回值类型不同不算重载!发生在同一个类或父子类之间(但本质还是“同名不同参”);是编译时多态。❌ 注意:仅靠返回值不同,不能构成重载!比如int f()和double f()会报错!发生在父子类之间,子类重新实现父类的某个方法。// 父类System.out.println("动物发出声音");// 子类。
2025-11-27 20:05:57
540
原创 Java 初学者必看:接口 vs 抽象类,到底有什么区别?
abstract class 奶茶店 {// 已经实现的方法(通用逻辑)public void 微笑服务() {System.out.println("欢迎光临!");// 抽象方法(子类必须实现)public abstract void 制作珍珠奶茶();用abstract关键字声明;可以有普通方法(带实现)和抽象方法(无实现);子类用extends继承,且只能继承一个抽象类;可以有构造器、成员变量、静态方法等。interface 饮品标准 {
2025-11-26 23:11:58
421
原创 别再被面试官问倒了!Java 参数传递的底层逻辑,看完秒懂
类型传递内容能否修改原始值/对象内容基本类型值的副本不能引用类型引用(地址)的副本能修改对象内容不能改变原始引用指向。
2025-11-26 23:10:56
241
1
原创 你以为你懂基本数据类型?这7个坑90%的人都踩过!
运算结果超出范围时,不会报错,而是按 “模 2^n” 回绕(负数用补码表示)。:浮点数在二进制中无法精确表示(类似 1/3 在十进制中是 0.333…大范围类型强制转为小范围类型时,直接丢弃高位字节,导致数据失真。(重复的精确值远少于整数,缓存带来的收益无法抵消成本)!小范围向大范围转换时,可能因中间计算溢出导致结果错误。先回顾下java的8种基本类型及对应的包装类。如果你有疑惑,可以详细阅读本篇文章,了解。显式转换,避免直接类型转换。也有缓存-128~127,:用更大范围类型(如。的那些“隐藏规则”。
2025-11-22 17:56:31
1021
原创 Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录
分布式友好:服务器无需存储 Session,多台服务器可直接共用 Token 验证逻辑;前后端分离适配:通过请求头携带 Token,无需依赖 Cookie,适配移动端、小程序等多端场景;安全性提升:Token 包含过期时间和加密签名,避免身份信息被篡改;扩展性强:Token 可自定义存储用户角色、权限等信息,减少数据库查询次数。至此,恭喜你已具备初级程序员开发水平,可以试着投简历找工作啦。
2025-11-21 21:00:36
1190
原创 Spring Boot 实战:基于 Spring Security 实现接口权限控制
核心配置:通过定义接口权限规则,查询用户信息;权限控制:实现登录验证(未登录返回 401)和角色授权(权限不足返回 403);现在,你的 Spring Boot 项目已经具备企业级的接口权限控制能力 —— 敏感接口只有授权用户才能访问,数据安全得到有效保障!下一篇文章,我会教大家 “Spring Boot 3.5.7 集成 JWT 实现无状态登录”,解决前后端分离项目的 Session 共享问题,让接口更适合分布式部署!👉 关注+私信“Web基础源码”,获取完整工程!有问题评论区见~
2025-11-20 20:28:50
1021
原创 Spring Boot实战:用Knife4j 自动生成接口文档,告别手写时代
新版 Swagger 3.x 注解(当前使用)作用范围说明Controller 类对 Controller 进行分组,标题显示在文档左侧菜单接口方法描述接口功能,summary为简要说明,为详细说明接口参数描述单个参数的含义、是否必填、示例值,支持路径、查询、请求体参数实体类描述实体类的作用,方便文档中展示请求 / 响应结构实体类字段描述字段的含义、示例值,支持标记必填项简洁配置:基于OpenAPI规范配置文档信息,无需旧版启用注解,减少配置冗余;注解升级。
2025-11-19 21:26:23
869
原创 Spring Boot 入门:全局异常处理 + 统一返回格式
在实际开发中,我们会遇到很多 “业务异常”(比如 “余额不足”“手机号已存在”),这些异常不是系统错误,而是业务逻辑不允许的情况。我们可以自定义一个,专门处理这类异常。比如我们想在 “新增用户时,如果手机号已存在,就抛异常”,修改的addUser// @Service:标记这是Service层实现类,Spring自动管理@Service// 注入UserMapper(Spring自动创建实例)@Autowired@Override// 调用Mapper方法@Override。
2025-11-18 20:24:50
1274
原创 Spring Boot 入门:如何连接 MySQL 数据库
Mapper 接口是 MyBatis 的 “入口”,定义查询、新增等方法,不用写实现类(MyBatis 自动生成)。今天我们完成了从 “模拟数据” 到 “真实数据库” 的跨越,学会了:用 SQL 脚本批量创建数据库、表和测试数据,高效且便于团队协作;用 YAML 格式配置 Spring Boot,结构更清晰,减少配置冗余;用 MyBatis 写 Mapper 接口和 XML,灵活控制 SQL 语句;用 ApiFox 测试接口,快速验证数据库操作结果。
2025-11-17 19:15:33
770
原创 如何接收前端参数
传参方式注解 / 方式适用场景示例 URL/JSON路径传参单个、简单参数(如 ID、编号)问号传参多个可选参数(如搜索条件)name=手机&maxPrice=3000请求体传参@RequestBody + 实体类复杂、多字段参数(如注册、提交订单){"name":"小李","age":22,"phone":"13700137000"}
2025-11-16 17:59:19
1076
原创 如何让接口返回 JSON 数据
实体类是 JSON 的 “模板”:定义字段、getter/setter,就能对应 JSON 结构;接口返回值直接写实体类 / List:Spring Boot 自动转 JSON,不用手动处理;两种常见场景:单个对象(返回实体类)、列表(返回 List <实体类>),覆盖 80% 日常开发需求。
2025-11-16 17:57:50
1151
原创 Java API接口从0到1实战:新手也能看懂的编写指南
今天我们从 0 到 1,完成了 3 件事:装好并验证了 JDK、IDEA、Apifox。用 Spring Initializr 创建了第一个 Spring Boot 项目。写了一个 GET 接口,并且成功测试通过。其实 Spring Boot 并不难,关键是多动手实践 —— 你可以试着改一改接口的返回内容,比如把return里的字符串改成你的名字,再运行测试一下;也可以试着新建一个接口,比如路径改成 “/hi”,返回 “Hi,我是 XXX”。
2025-11-14 20:03:36
1703
原创 什么是Web 开发
简单来说,Web(全称 World Wide Web,万维网)是一个基于互联网的 “信息交互系统”—— 它让我们能通过浏览器访问世界各地的网站,查看文字、图片、视频,甚至进行购物、办公、社交等操作。统一的访问方式:无论你在电脑还是手机上,只要输入 “URL 网址”(如.com),就能访问对应的网站,无需考虑服务器在哪里。标准化的技术协议。
2025-11-14 20:02:08
804
原创 10 Java IO 流程入门
打开流:创建流对象,绑定数据源(读)或目标地址(写);操作流:通过流对象的方法读取 / 写入数据;关闭流:释放资源(必须执行!“字节流” 与 “字符流” 的选择仅需根据数据类型判断:文本用字符流,非文本用字节流。对初学者而言,无需记忆所有 IO 类,先练熟 “文件读写” 流程、理解 “流” 的本质,后续学习缓冲流、对象流等场景会更轻松。现在就动手试试上述代码吧 —— 实践才是最好的学习方式!
2025-11-13 21:28:16
1190
原创 09 Java 异常处理
继承Exception(受检异常)或(非受检异常);提供无参构造和带错误信息的构造方法(方便传递异常原因)。// 自定义受检异常(继承Exception)// 无参构造// 带错误信息的构造方法// 调用父类构造,传递错误信息// 自定义非受检异常(继承RuntimeException)// 注册用户:年龄必须在18-60岁之间(受检异常,需throws声明)// 手动抛出自定义异常。
2025-11-12 21:54:20
575
原创 08 Java集合类
Java 集合类是用于存储和操作多个对象的容器,位于java.util包下,主要分为和两大体系,提供了丰富的数据结构和操作方法。
2025-11-11 20:14:59
731
原创 07 Java面向对象基础
类是对象的模板,包含属性(数据)和方法(行为)。修饰符 class 类名 {// 属性(成员变量)数据类型 属性名;// 方法修饰符 返回值类型 方法名(参数列表) {// 方法体示例(定义一个Person// 属性(封装数据)// 方法(封装行为)// 构造方法(用于创建对象时初始化属性)类与对象:类是模板,对象是实例,通过new创建。封装:私有属性 + 公共方法,保护数据并隐藏细节。继承extends实现代码复用,子类可扩展或重写父类。多态。
2025-11-10 21:20:12
1024
原创 06 Java流程控制
核心结论:分支(if/switch)用于根据条件执行不同逻辑,循环(for/while/do-while)用于重复执行代码块,二者结合可覆盖绝大多数程序逻辑场景。
2025-11-09 20:29:43
347
原创 04 数据类型转换
自动转换:小范围 → 大范围,安全无风险,Java 自动处理。强制转换:大范围 → 小范围,需显式声明,可能导致精度损失或溢出,谨慎使用。表达式中会自动提升类型,boolean不参与任何转换。基本类型与包装类通过自动装箱 / 拆箱转换,简化了对象与基本值的交互。根据场景选择合适的转换方式,避免因转换导致的数据异常。
2025-11-07 23:40:56
392
原创 03 Java基本数据类型
选择数据类型时,需平衡范围和内存占用(如小范围整数用byte比int更省内存)。避免浮点精度问题:如0.1 + 0.2的结果不是0.3,而是约。字符类型可用于存储单个字符或编码值,布尔类型仅用于逻辑判断。通过合理使用基本数据类型,能提高程序的性能和内存效率。
2025-11-07 23:38:44
249
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅