- 博客(1244)
- 资源 (1)
- 收藏
- 关注
原创 瞧瞧别人家的判空,那叫一个优雅!
这篇文章介绍了Java中优雅处理空指针异常的多种方法。从传统多层判空嵌套的弊端出发,重点讲解了Java8的Optional类、Spring工具类、Lombok注解等现代化解决方案,并提供了空对象模式、断言拦截、AOP拦截等工程级优化思路。通过对比实际业务场景中的新旧代码,展示了如何使用链式调用、函数式编程等方式简化判空逻辑,提升代码可读性和健壮性。文章还分享了Guava工具包和防御式编程技巧,为开发者提供了处理空指针问题的完整工具箱。
2025-12-06 05:15:00
204
原创 为什么要尽量将MySQL表字段要设置为NOT NULL?
MySQL表字段设置为NOT NULL的优化建议背后有多重考量:查询性能上,NOT NULL可让数据库优化查询逻辑;存储空间上,避免NULL值列表可节省每行1字节以上;索引效率方面,NULL值会复杂化比较运算和索引使用;聚合函数处理NULL时可能产生失真;代码逻辑上可减少空值判断;还能在数据库层强制数据一致性。当然,业务上确实需要表示"不存在"状态的字段仍应允许NULL。最佳实践是尽量使用NOT NULL,仅在必要时允许NULL,以兼顾性能与业务需求。
2025-12-04 03:15:00
1016
原创 为什么Spring不建议使用@Autowired?@Resource才是王道
Spring官方更推荐使用@Resource而非@Autowired进行依赖注入。主要原因包括:1) @Resource遵循JSR-250标准,注入机制更明确(先按名称再按类型);2) 能更好处理多实现类场景;3) 避免循环依赖问题。实际应用中,构造器注入是首选方案,其次才是@Resource注解,而@Autowired字段注入已被官方视为不推荐做法。从Spring Boot 2.6开始,官方甚至考虑默认禁用循环依赖,进一步推动更健康的代码设计模式。
2025-12-03 05:15:00
374
原创 别再重复造轮子!SpringBoot 内置的 20个高效工具类
SpringBoot内置20个高效工具类,覆盖数据处理、HTTP请求、缓存异步、校验日志、测试调试等场景。包括StringUtils处理字符串判空拼接、RestTemplate/WebClient实现HTTP请求、@Cacheable/@Async简化缓存异步、@Validated参数校验、MockMvc测试Controller等。这些工具类与Spring生态深度集成,可替代Apache Commons等第三方库,避免重复造轮子。还包含冷门实用功能如BannerCustomizer定制启动Banner,帮助
2025-12-02 08:47:34
401
原创 CompletableFuture的5大坑!
摘要: 本文深入探讨了Java中CompletableFuture的5大使用陷阱。首先介绍了默认线程池的隐患,指出其不适合IO密集型任务且可能导致内存溢出,并给出了正确配置线程池的方案。其次分析了异常"神秘消失"问题,这是由于CompletableFuture的异常处理机制导致异常被包装在ExecutionException中。文章通过代码示例对比了错误和正确用法,并附上线程池工作流程对比图,帮助开发者避免这些常见陷阱。
2025-12-02 05:15:00
1265
原创 Mybatis-Plus的竞争对手来了,试试 MyBatis-Flex
MyBatis-Flex是一个新兴的MyBatis增强框架,提供了比MyBatis-Plus更轻量级、灵活且功能丰富的ORM解决方案。它通过SqlProvider实现,无第三方依赖和拦截器,具有极高性能。支持多表查询、逻辑删除、数据脱敏等功能,且全部免费。相比MyBatis-Plus,MyBatis-Flex更易调试,支持复合主键和多种数据库方言。本文展示了其基本用法,包括CRUD操作和多条件查询,证明它是一个值得尝试的ORM框架替代方案。
2025-12-01 05:15:00
726
原创 为什么阿里巴巴代码开发规范推荐@Transactional需要指定回滚的异常?
阿里巴巴代码规范推荐@Transactional指定回滚异常的原因是:Spring默认只在遇到RuntimeException时回滚事务,对检查型异常(如IOException)不会自动回滚。这可能导致业务异常时数据不一致,比如转账操作中钱已扣除但外部系统调用失败的情况。最佳实践是显式声明rollbackFor属性,如@Transactional(rollbackFor=Exception.class),确保所有异常类型都能触发回滚,保证事务的原子性。这种主动声明的方式能避免因异常处理不当导致的数据问题。
2025-11-29 05:15:00
1153
原创 Java通用枚举还能这样做?前后端终于不扯皮了!
本文介绍了一种实现前后端通用枚举的优雅方案,通过定义IBaseEnum接口和两种枚举返回类型(名称和JSON)来解决前后端状态值同步问题。方案提供简单枚举(IBaseEnumSimple)和JSON枚举两种实现方式,利用@JsonValue和@JsonCreator注解实现自动序列化/反序列化,并内置了枚举查找、匹配等通用方法。通过自定义反序列化器DictSimpleDeserializer,实现了枚举值的灵活转换,使前后端可以共享同一份枚举定义,避免频繁的状态值同步,提高了开发效率。
2025-11-28 05:15:00
216
原创 为超过10亿条记录的订单表新增字段
10亿级大表安全新增字段方案 核心方案对比 1. MySQL 8.0+ Instant ADD COLUMN(推荐) 毫秒级完成(仅修改元数据) 需满足:列在末尾、有默认值/可为空 不重建表、不锁表 2. gh-ost工具(MySQL 5.6/5.7) 在线无锁变更(创建影子表+binlog同步) 支持限速、可监控 需要额外工具部署 实际应用建议 若使用MySQL 8.0+,优先选择Instant方式 旧版本建议通过云服务或gh-ost实现 传统DDL仅适合业务绝对低峰期 两种方案都能有效解决10亿级大表加
2025-11-27 05:15:00
1817
原创 别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
SpringCloud Gateway 内置过滤器速查手册 本文总结了 SpringCloud Gateway 30 个内置过滤器的使用场景和配置示例,大幅减少重复代码编写。主要分为请求和响应两大类: 请求相关:包含 11 个过滤器,如添加/移除请求头(AddRequestHeader/RemoveRequestHeader)、修改请求参数(AddRequestParameter)、请求体缓存(CacheRequestBody)等,支持请求头映射、大小限制等功能。 响应相关:包含 5 个过滤器,如添加/修改
2025-11-26 23:45:00
693
原创 这20条SQL优化方案,让你的数据库查询速度提升10倍
本文提供了20条SQL优化方案,从基础优化、索引优化、高级技巧到数据库设计优化四个方面全面提升查询性能。主要建议包括:避免SELECT *查询、合理选择EXISTS/IN语句、优化WHERE子句、正确使用索引、处理深度分页问题、采用批量操作、优化JOIN查询、使用覆盖索引、选择合适数据类型以及谨慎使用NULL值等。通过这些优化措施,可以有效减少数据库负载,提升查询响应速度,部分场景下性能可提升10倍以上。文章特别强调了针对不同场景选择合适优化方案的重要性,以及平衡数据库读写性能的关键设计原则。
2025-11-24 05:15:00
70
原创 MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
MySQL 8.0带来了多项SQL优化黑科技,包括窗口函数简化复杂查询、降序索引优化排序性能、Generated Column加速JSON查询、Invisible Index安全测试索引、Hint强制执行计划、Resource Group资源控制以及LATERAL JOIN处理复杂关联。这些新特性相比传统优化方法,能显著提升查询效率和系统稳定性,同时为开发人员提供了更灵活的优化手段。掌握这些技巧不仅能解决实际性能问题,还能在面试中展现专业深度。
2025-11-23 05:15:00
43
原创 你们公司的 QPS 是怎么统计出来的?这 5 种常见方法我踩过一半的坑
QPS统计方法总结与避坑指南 本文介绍了5种常见的QPS统计方法,适用于不同业务场景: 网关层统计:适合微服务全局视角,如Nginx和Spring Cloud Gateway实现 应用层埋点:使用Spring AOP实现细粒度的接口级统计 监控系统集成:利用Prometheus等工具实时采集指标 日志分析:通过ELK等工具进行离线统计 分布式链路追踪:结合SkyWalking等工具实现全链路QPS监控 关键经验: 不同场景需要不同统计粒度(全局/接口/方法级) 网关统计需过滤健康检查等无效请求 分布式环境下
2025-11-22 05:15:00
41
原创 面试官:如何决定使用 HashMap 还是 TreeMap?
摘要: HashMap与TreeMap的核心区别在于数据结构、排序性和性能。HashMap基于哈希表实现,提供O(1)的快速访问,但无序;TreeMap基于红黑树,保持键的有序性,但操作复杂度为O(log n)。选择依据:若需极速访问且不关心顺序(如缓存、去重),选HashMap;若需范围查询、顺序遍历或自动排序(如股票价格排序),则用TreeMap。高级考量包括内存开销、哈希碰撞风险及持续有序的效率优势。面试中,理解两者的适用场景及性能差异是关键加分项。
2025-11-21 11:00:11
27
原创 同事混用@Transactional和TransactionTemplate被我怼了,三种事务管理到底怎么选?
Spring事务管理有三种方式:1️⃣ @Transactional注解(简单但存在内部调用失效等问题);2️⃣ TransactionTemplate(可控性强但代码略复杂);3️⃣ 直接使用TransactionManager(最灵活但易出错)。日常开发推荐优先使用@Transactional,需要精细控制时选择TransactionTemplate,特殊场景才考虑TransactionManager。文中通过用户导入案例分析了各方式的适用场景及常见陷阱,特别是@Transactional在内部方法调用
2025-11-21 05:15:00
28
原创 玩转EasyExcel,看这一篇就够了!!(合并导入 自定义导出 动态表头 合并单元格)
本文介绍了使用EasyExcel处理Excel导入导出的实用技巧。通过引入EasyExcel依赖,开发者可以轻松实现高效、低内存占用的Excel操作。文章提供了多种常见场景的代码示例,包括基础导出、本地文件导出、多Sheet页导出以及自定义表头功能。重点展示了如何利用注解定义模型、设置响应参数,以及通过工具类方法实现不同导出需求(如合并单元格、动态表头等)。这些"即用即贴"的代码片段解决了传统Excel处理中常见的性能问题和复杂格式处理难题,让Java开发者能够优雅地完成Excel数据交
2025-11-20 05:15:00
357
原创 一个Java工程师的17个日常效率工具
Java工程师效率工具精选 本文总结了Java开发者常用的17个效率工具,涵盖IDE增强、调试分析、代码质量、API开发、数据库管理和构建部署等多个方面。核心工具包括: IDE增强:IntelliJ IDEA终极版配合Key Promoter X、Lombok等插件提升编码效率 调试分析:Arthas在线诊断、JProfiler性能剖析、Charles抓包工具 代码质量:SonarQube静态分析、ArchUnit架构测试、JaCoCo覆盖检测 API开发:Postman接口测试、OpenAPI代码生成 数
2025-11-19 05:15:00
542
原创 MessageChannel-通信机制
本文介绍了MessageChannel这一前端双向通信机制。作为postMessage的替代方案,MessageChannel提供了更高效的低延迟通信方式,特别适用于Web Workers和多线程场景。文章详细讲解了MessageChannel的基本用法,包括对象创建、消息发送接收,以及其在Web Workers中的高级应用。虽然兼容性存在限制(不支持IE),但MessageChannel在现代浏览器中为双向通信提供了更优解决方案,有效解决了postMessage的延迟问题,是多线程通信的理想选择。
2025-11-18 05:15:00
268
原创 JDK17 前后写法对比:差点没认出是 Java
Java 17新特性大幅提升开发体验:record简化POJO定义,自动生成构造器和方法;switch表达式支持返回值与模式匹配,避免传统陷阱;文本块(""")优雅处理多行字符串;instanceof模式匹配消除冗余类型转换;密封类(sealed)精确控制继承范围。这些特性使Java代码更简洁安全,特别适合Web开发中的数据建模(DTO/Response)、状态处理(订单/支付结果)、SQL/模板生成等场景,显著减少样板代码,提升可读性和类型安全性。
2025-11-17 05:15:00
830
原创 高性能场景为什么推荐使用PostgreSQL,而非MySQL?
摘要:PostgreSQL在高性能场景下相比MySQL具有显著优势:1)采用进程池模型,支持更高并发连接;2)提供多元索引策略(B-Tree、GIN、BRIN等),高效处理复杂查询;3)优化器更强大,支持CTE和并行查询;4)原生支持数组、JSONB等复杂数据类型;5)MVCC实现更先进,减少锁竞争。这些特性使PostgreSQL更适合处理大数据量、高并发和复杂查询场景。
2025-11-16 05:15:00
869
原创 JPG 与 JPEG 有什么区别?是不是一样的?
JPG和JPEG本质上是相同的图片格式,区别仅源于历史原因。JPEG是图片压缩标准名称,而".jpeg"和".jpg"都是其文件扩展名。早期Windows系统因8.3文件名格式限制将".jpeg"缩短为".jpg",而macOS/Linux保留了完整后缀。如今两者在技术层面完全相同,采用相同的压缩标准,具有一致的画质和兼容性。用户可随意选用,仅需注意在特定场景下保持后缀统一便于管理。简单来说,JPG就是JPEG的缩写形式,实质并
2025-11-15 05:15:00
980
原创 别再被VO、BO、PO、DTO、DO绕晕!今天用一段代码把它们讲透
本文清晰解释了软件开发中常见的几种对象模型(PO、DO、BO、DTO、VO)的区别和应用场景。文章通过"用户下单买奶茶"的业务案例,形象展示了这些对象在系统中的流转过程:PO是数据库映射对象,DO封装核心业务逻辑,BO编排多个DO完成用例,DTO用于服务间数据传输,VO则面向前端展示。文中提供了各类对象的代码示例,并强调它们的核心目的是"隔离变化"——不同层级关注点分离,使系统更具扩展性。最后用一句话总结:"数据库里叫PO,业务里是DO,编排靠BO,网络走D
2025-11-14 05:15:00
1173
原创 Java 8都出了这么多年,Optional还是没人用?到底卡在哪了?
Java 8引入的Optional未被广泛使用的原因包括:开发习惯难以改变、错误使用方式增加复杂度、团队缺乏统一标准以及与框架集成问题。Optional的正确应用场景主要在方法内部链式处理和返回值表达空值语义,而不适合用作参数类型、实体类属性或集合元素。要让团队接受Optional,需要制定返回值规范、提供工具方法,并通过代码评审引导。虽然Optional能提升代码可读性和安全性,但仍存在深层嵌套处理、性能开销等局限性。合理使用Optional能让代码更清晰,但需要团队共识和规范支持。
2025-11-13 11:17:27
345
原创 Spring生态的缓存方案:多级缓存架构实现(Caffeine + Redis)
摘要:Spring生态中的多级缓存架构(Caffeine+Redis)实现方案分析。Spring Cache作为抽象层,提供统一缓存API,支持@Cacheable等注解简化开发。本地缓存首选Caffeine(基于W-TinyLFU算法),性能优于Guava;Redis则适用于分布式缓存场景。建议组合使用Caffeine(本地高频访问)和Redis(跨节点共享),通过@CacheEvict实现缓存一致性控制。高级技巧包括:复合键生成策略、条件缓存控制、批量缓存清理及事务性缓存处理。多级缓存架构能有效平衡性能
2025-11-09 05:15:00
1582
原创 什么是Spring的循环依赖
摘要:Spring循环依赖是指多个Bean相互依赖导致初始化失败的问题,常见于构造函数或setter注入场景。文章通过ServiceA和ServiceB相互依赖的示例,分析了循环依赖的形成过程及Spring容器的死锁问题,并提供了两种解决方案:优先推荐使用setter方法注入避免循环依赖,或使用@Lazy注解延迟初始化来解决构造函数注入的循环依赖问题。这些方法是掌握Spring高级特性的重要知识点。(148字)
2025-11-07 05:15:00
310
原创 spring三级缓存以及如何解决循环依赖
Spring 三级缓存机制通过三个层级(singletonObjects、earlySingletonObjects、singletonFactories)解决循环依赖问题。核心思路是:当实例化Bean时,先创建对象并放入三级缓存;在依赖注入阶段,若发现循环依赖,可以从二级缓存获取未完全初始化的Bean;最终完成初始化后移入一级缓存。这种机制允许Spring在Bean未完全初始化时就提供引用,从而打破循环依赖链。需要注意的是,这种方式仅适用于单例Bean且不支持构造函数注入的循环依赖场景。
2025-11-06 05:15:00
602
原创 Spring事务失效的原因
Spring事务失效常见原因包括:1)非事务方法直接调用事务方法导致代理失效;2)事务传播行为设置不当,如使用PROPAGATION_SUPPORTS可能不会开启新事务;3)异常处理不当,捕获异常未重新抛出导致事务无法回滚;4)事务管理器配置错误,如未正确设置数据源。解决方法包括通过代理调用事务方法、选择合适的传播行为、正确处理异常以及正确配置事务管理器。这些问题的本质在于对Spring事务代理机制和工作原理理解不足。
2025-11-05 05:15:00
858
原创 spring bean是否为线程安全的?
Spring Bean线程安全性分析 Spring Bean的线程安全性取决于其作用域和状态设计: 单例Bean(默认):线程不安全,需通过同步机制(synchronized/Lock)、原子类(AtomicInteger)或无状态设计保证安全 无状态Bean:不包含可变共享状态时线程安全 原型Bean(prototype):每次请求新实例,天然线程安全 典型问题:单例Bean中的可变状态(如计数器)在多线程环境下需特殊处理。解决方案包括使用同步方法、线程安全集合或改为原型作用域。 关键点:合理选择作用域,
2025-11-04 05:15:00
546
原创 Spring中用到的设计模式
Spring框架广泛应用了多种设计模式,包括工厂模式(BeanFactory)、单例模式(Bean管理)、代理模式(AOP)、模板方法模式(JdbcTemplate)、观察者模式(事件机制)和适配器模式(HandlerAdapter)。这些模式使Spring具备松耦合、易扩展的特性,如工厂模式统一创建对象、代理模式实现事务管理、观察者模式处理事件监听。理解这些模式有助于深入掌握Spring的设计思想和工作原理。
2025-11-03 05:15:00
1658
原创 Spring启动过程中做缓存预热
文章摘要:本文介绍了在Spring启动过程中实现缓存预热的5种方法:1) 使用ApplicationListener监听ContextRefreshedEvent或ApplicationReadyEvent事件;2) 通过@PostConstruct注解在Bean初始化后执行;3) 实现CommandLineRunner或ApplicationRunner接口;4) 使用@Scheduled注解定时执行;5) 实现InitializingBean接口。每种方法都提供了代码示例,开发者可根据实际场景选择合适的
2025-11-02 05:15:00
243
原创 spring中常用注解
Spring框架提供了多种常用注解来简化开发,主要包括: 组件注解:@Component(通用)、@Service(业务层)、@Controller(控制层)、@Repository(数据层)和@RestController(REST API) 依赖注入:@Autowired自动装配,@Qualifier指定具体Bean 配置相关:@Configuration声明配置类,@Bean定义Bean 其他重要注解:@Primary指定优先Bean,@Scope定义Bean作用域 这些注解通过声明式配置大大简化了S
2025-11-01 05:15:00
1229
原创 SpringMVC的执行流程
SpringMVC执行流程摘要 Spring MVC的执行流程主要包含6个关键步骤:1) DispatcherServlet作为前端控制器拦截所有请求;2) HandlerMapping查找匹配的控制器;3) HandlerAdapter调用控制器方法;4) Controller处理业务并返回视图名;5) ViewResolver解析视图路径;6) View渲染返回响应。整个过程通过组件协作完成请求处理,开发者只需关注Controller和View的开发,其他组件由框架自动管理,这种分层设计简化了Web开发
2025-10-31 05:15:00
737
原创 Spring事务的隔离级别
摘要:Spring事务的隔离级别定义了事务间的隔离程度,防止并发问题。主要包含五种级别:DEFAULT(使用数据库默认)、READ_UNCOMMITTED(允许脏读)、READ_COMMITTED(防止脏读)、REPEATABLE_READ(防止不可重复读)和SERIALIZABLE(最高级别,防止所有并发问题)。通过@Transactional注解设置隔离级别,开发者可根据业务需求选择合适级别,在数据一致性和性能之间取得平衡。代码示例展示了不同级别在实际场景中的应用方式。
2025-10-30 05:15:00
1534
原创 Spring事务的实现方式和原理
摘要:Spring事务管理通过AOP和事务管理器实现,核心是事务管理器(如DataSourceTransactionManager)负责事务的生命周期管理。使用@Transactional注解配置事务属性(传播行为、隔离级别等),Spring通过AOP代理在方法调用前后插入事务逻辑。事务同步机制确保资源正确同步。示例展示了JPA事务管理器的配置和事务代理的实现原理,体现了Spring事务的声明式管理特点。
2025-10-29 05:15:00
586
原创 JDK动态代理和CGLIB动态代理的区别
摘要:JDK动态代理和CGLIB动态代理是两种常用代理技术。JDK代理基于反射机制,仅能代理实现接口的类;CGLIB通过生成子类实现代理,可代理无接口类。JDK代理性能较好,适用于接口实现类;CGLIB适用于无接口类或需代理类方法的情况。代码示例展示了两种代理的具体实现方式:JDK需实现InvocationHandler,CGLIB需实现MethodInterceptor。选择代理方式应根据业务需求决定,有接口优先JDK,无接口则用CGLIB。
2025-10-28 10:27:19
412
原创 说下Spring事务传播机制
Spring事务传播机制定义了方法调用时事务的处理方式,主要包括7种行为:REQUIRED(默认,存在加入/不存在新建)、SUPPORTS(存在加入/不存在非事务)、MANDATORY(存在加入/不存在抛异常)、REQUIRES_NEW(总是新建事务)、NOT_SUPPORTED(非事务执行)、NEVER(非事务且存在事务抛异常)、NESTED(嵌套事务)。通过@Transactional注解可指定传播行为,如REQUIRES_NEW会开启独立事务,失败不影响原事务。合理选用传播机制能确保事务正确性和数据一
2025-10-27 05:15:00
556
原创 Spring AOP在项目中的应用场景
Spring AOP在项目中主要应用于横切关注点的管理,常见场景包括: 日志记录:通过切面统一记录方法调用、参数和返回值,无需修改业务代码 事务管理:集中处理事务的开启、提交和回滚,避免重复代码 性能监控:使用环绕通知测量方法执行时间 这些AOP应用通过将横切逻辑与业务逻辑分离,提高了代码的可维护性和复用性,同时保持了业务代码的简洁性。示例展示了如何通过定义切点和通知来拦截特定方法执行,实现日志、事务和性能监控等通用功能。
2025-10-26 05:15:00
402
原创 谈谈你对AOP的理解
AOP(面向切面编程)是Spring框架的重要特性,通过将横切关注点(如日志、事务)从业务逻辑中分离,提高代码模块化和可维护性。文中以UserService为例,展示了如何通过定义切面(@Aspect)和切入点(@Pointcut)实现方法执行前后的日志记录,而无需修改业务代码。AOP的核心优势在于解耦代码、提升可维护性和扩展性,使开发者能集中管理横切关注点。通过@EnableAspectJAutoProxy启用AOP支持,Spring实现了这一编程范式。
2025-10-25 05:15:00
661
原创 谈谈你对Spring IOC的理解
Spring IoC(控制反转)是Spring框架的核心,通过反转对象控制权来降低代码耦合度。传统方式中类直接创建依赖对象,而IoC由Spring容器管理依赖注入。示例展示了UserService通过@Autowired自动注入Logger依赖,由Spring容器配置Bean。IoC的优势包括解耦、可扩展(如更换Logger实现)和生命周期管理。Spring IoC使系统更灵活、可维护,是构建现代应用的重要设计原则。
2025-10-24 05:15:00
907
原创 SpringBean的初始化过程
Spring Bean的初始化过程是Spring框架中的一个重要环节。文章通过UserService示例展示了三种初始化方式:1)通过@Bean的initMethod属性指定初始化方法;2)实现InitializingBean接口重写afterPropertiesSet方法;3)使用@PostConstruct注解标记初始化方法。初始化过程包括实例化Bean、依赖注入和调用初始化方法三个主要步骤,其中初始化方法适合执行加载配置等准备工作。这三种方式都能确保Bean在使用前处于正确状态,开发者可根据项目需求选
2025-10-23 05:15:00
801
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅