自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 收藏
  • 关注

原创 为什么要写RedisUtil这个类

直接使用 RedisTemplate使用 RedisUtil需要记住各种 opsForXxx() 方法提供业务语义明确的方法需要手动处理异常异常已统一处理散落在各业务类中集中管理 Redis 操作灵活性高一致性高适合简单场景适合中大型项目所以我们的理解没有错,直接使用确实可以完成所有操作,但在实际项目中,使用RedisUtil这样的工具类能带来更好的可维护性、一致性和开发效率。

2025-07-03 10:41:56 529

原创 Spring Data Redis 常用接口和类

选择合适的客户端:生产环境推荐使用Lettuce,它支持异步和反应式编程合理配置序列化:根据数据类型选择合适的序列化方式使用连接池:特别是高并发场景下合理使用事务:注意Redis事务与关系型数据库事务的区别考虑缓存策略:合理设置过期时间,避免内存浪费监控连接状态:实现健康检查机制异常处理:妥善处理Redis连接异常和超时情况键命名规范:使用统一的命名规范,如"业务:类型:ID"格式这些接口和类的合理使用可以充分发挥Redis的高性能特性,同时保持代码的可维护性和扩展性。

2025-07-03 10:30:05 503

原创 设计模式篇:灵活多变的策略模式

最后,策略模式不仅仅是一种编码技巧,它体现了"分而治之"的古老智慧。作为行为型设计模式的代表,策略模式让我们能够定义一系列算法,并将每个算法封装起来,使它们可以相互替换。的模式,在软件设计中同样普遍存在。System.out.println("计算最快路线...考虑实时路况");System.out.println("计算最快路线...考虑实时路况");设计模式的最高境界是"无招胜有招"——不是机械地套用模式,而是理解其思想后自然地融入设计中。System.out.println("请先设置路线策略");

2025-07-03 10:10:14 860

原创 设计模式篇:理解工厂模式

当你需要一辆汽车时,你会怎么做?是亲自去采矿炼钢、制造零件、组装车辆,还是直接走进一家汽车4S店告诉销售员你需要的车型?显然,我们都会选择后者。在软件设计中,扮演的正是这个"4S店"的角色 - 它帮助我们以一种更优雅的方式创建对象,而无需关心对象构建的复杂细节。作为最常用的创建型设计模式之一,工厂模式在Spring、Hibernate等主流框架中随处可见。本文将带你深入理解工厂模式的核心思想、实现方式及其在实际开发中的应用价值。

2025-07-03 09:48:55 496

原创 锁是什么?分布式锁又是什么?他们为什么被发明出来?有什么用?

就在你点击“购买”按钮的瞬间,成千上万的用户也在做同样的事情。资源本身是分布式的(如共享数据库中的某一行记录、分布式文件系统中的一个文件、缓存集群中的一个Key)或需要跨节点协同(如主节点选举、全局唯一ID生成)。性能较差(锁操作是数据库IO),对数据库压力大,可靠性高度依赖DB,锁释放依赖应用层(需设置超时),不是最佳实践。只有拿到锁(钥匙/令牌)的线程,才能进入被锁保护的代码区域(临界区)进行操作。确保在分布式环境下,对共享资源(如数据库行、缓存Key、文件)的操作是互斥的,避免超卖、重复处理等。

2025-07-01 11:46:55 734

原创 说ConcurrentHashMap线程安全机制

ConcurrentHashMap是Java并发包中线程安全的Map实现,其线程安全机制经历了JDK7和JDK8两次重大演进。下面我将从底层实现角度详细解析其线程安全原理。

2025-05-21 15:36:02 932

原创 JVM类加载机制

Override// 1. 读取类文件字节码// 2. 调用defineClass。

2025-05-19 11:27:11 1015

原创 JVM的内存划分

区域线程私有存储内容常见异常程序计数器✅字节码行号无虚拟机栈✅方法栈帧(局部变量、操作数栈等)本地方法栈✅Native方法栈帧堆❌对象实例、数组方法区(元空间)❌类信息、常量、静态变量直接内存❌堆外内存(NIO直接缓冲区)

2025-05-19 11:25:42 835

原创 JVM之GC常见的垃圾回收器

特点:单线程、STW(Stop-The-World)区域:新生代(复制算法)适用场景:客户端模式(如)、单核CPU参数:总结:简单高效,但停顿时间长。特点:Serial 的多线程版本区域:新生代(复制算法)适用场景:配合CMS使用(JDK8及之前)参数:总结:多线程提升GC效率,但仍有STW。特点:多线程、关注吞吐量()区域:新生代(复制算法)适用场景:后台计算型任务(如批量处理)参数:总结:适合不关心延迟,追求高吞吐的场景。特点:Serial 的老年代版本区域:老年代(标记-整理算法)适用场景:与Para

2025-05-19 11:10:53 787

原创 JVM的垃圾回收机制

垃圾回收(Garbage Collection, GC)是JVM自动管理内存的机制,主要负责:分配内存确保被引用的对象保持在内存中回收不再被引用的对象占用的内存。

2025-05-19 10:47:59 1127

原创 HashMap 与 HashTable 的区别

特性HashMapHashTable线程安全不安全安全(synchronized)null键值允许不允许性能更高较低迭代器Iterator继承类Dictionary初始容量1611扩容方式2n2n+1推荐使用场景单线程/高并发替代遗留系统。

2025-05-12 09:57:35 556

原创 Vue3中emits和emit

/ 返回 true 表示校验通过。,Vue 会知道这些是自定义事件,不会尝试将其作为原生 DOM 事件处理。,Vue 仍然可以接收事件,但会发出警告(如你的代码所示)。emits: ['事件1', '事件2', ...]'事件名': (payload) => {,Vue 会认为你可能误写了事件名,发出警告。,提高代码可读性,并避免 Vue 的警告。:让其他开发者一眼看出组件会触发哪些事件。,避免警告,并让组件的接口更清晰。

2025-05-08 14:28:59 833

原创 Java中的super与this关键字

使用super主要是为了在子类中明确访问父类的成员,避免与子类成员混淆使用this主要是为了在类内部明确访问当前对象的成员,避免与局部变量混淆两者都可以用于构造器调用,但都必须位于构造器的第一行在静态上下文中,两者都不能使用。

2025-04-27 11:59:15 856

原创 Ollama 在本地分析文件夹中的文件

使用 Ollama 在本地分析文件夹中的文件,通常需要结合模型的能力(如 LLaMA、CodeLLaMA 等)和文件预处理步骤。ollama run llama3 "$(cat combined_content.txt) 请分析上述内容并总结要点。Ollama 目前不支持直接上传文件夹,需先将文件内容合并为单一上下文。:模型有 token 限制(如 LLaMA3 约 8k),大文件需分块处理。response = query_engine.query("你的问题")>>> 请根据这些内容回答我的问题...

2025-04-27 11:53:02 1038

原创 参数校验有什么意义

(Parameter Validation)是一个非常重要的环节,其目的是保证传入方法的参数符合预期,防止因无效或不合法的参数导致程序异常、错误或不可预测的行为。(Parameter Validation)是一个非常重要的环节,其目的是保证传入方法的参数符合预期,防止因无效或不合法的参数导致程序异常、错误或不可预测的行为。在实际开发中,参数校验是保障代码质量和系统稳定性的关键步骤,特别是在多系统集成或分布式环境下的复杂场景中,参数校验的重要性更加突出。

2025-04-27 11:49:00 958

原创 布隆过滤器(Bloom Filter)简介

的巧妙设计,以极小内存实现高效存在性判断,是解决缓存穿透的经典方案。:有一定的误判率(False Positive,可能误报存在),且。若业务允许少量误判(如爬虫去重),可接受较高误判率以节省内存。:占用内存极少,查询效率高(O(k),k为哈希函数数量)。(如MurmurHash、SHA-1),确保均匀分布。对元素执行所有哈希函数,将对应的位数组位置设为1。若需精确判断(如金融场景),需结合数据库二次验证。:越大误判率越低,但占用内存越多。),并注意其局限性(误判、不可删除)。存在(可能有误判)。

2025-04-27 11:26:47 658

原创 AMQP(高级消息队列协议)标准

AMQP(高级消息队列协议)是一个开放的、应用层的协议,用于在不同的应用程序或系统之间进行可靠的消息传递。它允许软件组件之间通过消息队列进行通信,支持异步处理、解耦和流量控制等功能。

2025-04-24 09:08:09 250

原创 为什么Spring中@Bean注解默认创建单例Bean

在Spring框架中,使用@Bean注解定义的对象默认确实是单例的,这是由Spring容器的设计哲学和实际需求决定的。下面我从多个角度解释这一设计选择的原因和机制。

2025-04-23 21:32:34 844

原创 RabbitMQ 的专业术语

所有绑定队列均收到同一消息,适用于系统通知广播。

2025-04-22 17:35:30 958

原创 路由逻辑由 Exchange 和 Binding(绑定) 决定” 的含义

在 RabbitMQ 中,“路由”指的是。

2025-04-22 17:34:12 949

原创 开发常用注解大全(陆续整理版)

Aspect和@Component通常是成对使用的,以确保切面类被Spring AOP框架识别和管理。@Order只有在需要多个切面时才会使用,用于控制切面的执行顺序。因此,虽然这三个注解可以一起使用,但@Order是可选的,取决于是否需要控制多个切面的执行顺序。@Pointcut定义切入点表达式。@Around声明这是一个环绕通知。

2025-04-20 16:36:33 334

原创 JWT(JSON Web Token)和JWT(JSON Web Token)过滤器是什么意思

JWT 是一种开放标准(RFC 7519),用于在网络应用间安全传递信息的紧凑型令牌。它以 JSON 对象形式传递声明(Claims),通过数字签名(如 HMAC 或 RSA)确保信息的完整性和可信性。JWT 过滤器是 Web 应用中用于处理 JWT 的中间件,通常实现为 Servlet 过滤器(如 Java 中的。接口),负责拦截请求、解析 JWT 并完成身份验证和授权。JWT 由三部分构成,以点(

2025-04-20 12:06:48 868

原创 通俗解释环绕通知(@Around)

(返回结果)

2025-04-20 10:34:40 311

原创 Bean有什么用?Bean的作用域

​:Bean 就是让对象“听话”,让程序员专注写业务代码,不用操心对象的“吃喝拉撒”。

2025-04-19 21:03:18 297

原创 BeanFactory和ApplicationContext区别

是它的扩展版,支持 AOP、事件、国际化等企业级特性。,只提供最基本的 Bean 管理功能(创建、依赖注入)。启动稍慢,但运行时性能更好(因为依赖检查提前完成)。,并增加了企业级功能(AOP、事件、国际化等)。// 2. 发布事件(在Service层)

2025-04-19 20:53:19 1035

原创 BeanFactory和FactoryBean的区别

return new User("用户" + System.currentTimeMillis());// 拿到的是User对象。// 另一个新User。// 非单例,每次getBean是新对象。public User getObject() { // 实际返回的对象。,用来创建复杂的、不能直接 new 的对象(如 MyBatis 的。

2025-04-19 20:49:02 601

原创 IOC容器初始化过程

/ 2. 扫描@Componet/@Service等注解,生成BeanDefinition。// 4. 实例化UserService及其依赖的UserDao。:容器启动时初始化所有单例Bean(默认行为):找到配置文件(XML/注解)的位置。:注入依赖(递归处理依赖的依赖)// 1. 定位配置(注解方式):第一次获取Bean时初始化(// 例如加载XML配置文件。

2025-04-19 20:45:42 674

原创 什么是依赖注入

/ 还要手动传进去。@Autowired // Spring自动把UserDao“送”进来。@Autowired // 构造方法注入(Spring 4.3+ 可省略注解)(心得:刚开始觉得“注入”这个词高大上,其实就是“自动给对象喂数据” 😂):测试时可以直接注入Mock对象(比如模拟数据库)。缺点:容易导致循环依赖(A依赖B,B又依赖A)。:修改依赖时只需调整配置,不用改业务代码。// 自己new对象,相当于自己做汉堡。优点:适合可选依赖(比如有默认实现)。优点:避免循环依赖,对象不可变(

2025-04-19 20:43:09 463

原创 IOC的好处

自己不用操心怎么组装。这样开发更快、改需求更稳,特别适合团队协作!告诉Spring“我要用这个”,它自动帮你组装好,直接拿来用就行。现在:只需改一个配置(比如注解或配置文件),其他代码完全不用动。(就像换外卖商家,只需改APP上的订单,不用重新学做菜)(就像试吃新菜,不用真做,直接让厨师给你样品尝)(就像点外卖,不用自己买菜做饭,直接等吃)现在:直接用Spring的测试工具,或者。总结来说,IOC让代码像“拼乐高”——,还要手动塞进去它依赖的。注入假数据,省时省力。

2025-04-19 20:40:42 182

原创 什么是IOC

IOC 即控制反转(Inversion of Control),它是一种面向对象编程中的设计原则,在 Spring 框架里有着核心地位。下面我会详细解释它的概念、作用和实现方式。

2025-04-19 20:35:53 267

原创 Spring通知类型

环绕通知是功能最强大的通知类型,它可以在目标方法执行前后都进行增强。环绕通知负责决定是否继续执行目标方法,或者直接返回一个结果。这些通知类型在 Spring AOP 中能够灵活地组合使用,以此实现诸如日志记录、事务管理、权限控制等功能。不管目标方法是否正常结束,在其执行之后都会运行的通知。一般用于资源清理等操作。在目标方法执行之前运行的通知。通常用于执行一些初始化操作或者权限检查。在目标方法正常返回结果之后运行的通知。可以访问目标方法的返回值。当目标方法抛出异常时运行的通知。能够访问抛出的异常。

2025-04-19 20:32:51 303

原创 Spring AOP相关术语

切面(Aspect):模块化的横切关注点。连接点(Join Point):程序执行过程中的点(如方法执行)。通知(Advice):在连接点执行的动作。切入点(Pointcut):匹配连接点的表达式。目标对象(Target Object):被代理的对象。AOP代理(AOP Proxy):实现切面功能的代理对象。织入(Weaving):将切面应用到目标对象的过程。引入(Introduction):向类添加新方法或属性。切面优先级(Aspect Ordering):控制多个切面的执行顺序。

2025-04-19 20:29:56 696

原创 JDK动态代理和CGLIB动态代理的区别

在 Spring AOP 中,和是两种核心的代理实现方式,它们的区别可以从多个维度进行对比。finalfinal:Spring 5.x 后 CGLIB 性能优化明显,差距缩小。final// 必须实现 UserService 接口System.out.println("[JDK代理]前置处理");System.out.println("[JDK代理]后置处理");});// 直接代理普通类System.out.println("[CGLIB代理]前置处理");// 调用父类方法。

2025-04-19 20:28:14 796

原创 Spring AOP的实现原理

"Spring AOP 基于动态代理实现,默认对接口用 JDK 代理,对无接口类用 CGLIB 生成子类代理。在运行时通过拦截器链织入切面逻辑,核心流程包括代理对象创建、方法调用拦截和通知执行。System.out.println("方法耗时: " + (System.currentTimeMillis() - start) + "ms");实现的 AOP 框架,它通过在运行时动态生成代理对象来织入切面逻辑。当调用代理方法时,按顺序执行拦截器链和目标方法。代理类继承目标类,因此目标类和方法不能是。

2025-04-19 20:26:13 970

原创 AOP有哪些实现方式?

System.out.println("[JDK代理]方法调用前");System.out.println("[JDK代理]方法调用后");System.out.println("[CGLIB代理]方法调用前");System.out.println("[CGLIB代理]方法调用后");示例:MyBatis用Javassist生成Mapper接口的动态代理。:通过字节码技术生成目标类的子类进行代理。若目标类实现接口 → 用JDK动态代理。:基于接口,在运行时生成接口的代理类。性能最优(运行时无代理开销)。

2025-04-19 20:23:51 931

原创 什么是AOP?

如果把业务逻辑比作一个圆柱体,AOP就像一把刀横向切开它,在特定位置插入通用逻辑(如日志记录)。(如日志、事务、权限)从业务逻辑中分离出来,通过动态代理技术实现代码的增强,避免重复代码。Spring AOP仅支持方法级别的拦截(不支持构造器/字段拦截)。:封装横切逻辑的模块(例如一个日志工具类 + 配置规则)。同类内方法调用不会触发AOP(需通过代理对象调用)。:程序执行的可插入点(如方法调用、异常抛出)。:包裹整个方法(最强大,可控制是否执行方法):纵向抽象(通过类、继承封装业务逻辑)。

2025-04-19 20:22:11 316

原创 Spring 用到了哪些设计模式?

Spring大量使用模板方法封装固定流程(如JdbcTemplate、RestTemplate)。:Spring AOP基于动态代理(JDK动态代理或CGLIB)实现功能增强。:Spring默认的Bean作用域就是单例,通过容器保证全局唯一实例。的不同策略(ClassPath、FileSystem等)。注解的事务管理,实际是通过代理类在方法前后添加事务逻辑。定义了执行SQL的流程,用户只需关注SQL和结果处理。:Spring的IoC容器本质是一个大工厂,通过。:Spring的事件驱动模型(

2025-04-19 20:20:22 502

原创 Spring的优点

Spring是轻量级的,对代码侵入性低,它的组件可以独立使用(比如只用IoC或AOP),不需要依赖整个框架。Spring Boot、Spring MVC、Spring Security等模块可以按需选择,灵活组合。对MyBatis、Hibernate、Redis等常用技术提供开箱即用的支持(如。作为Java生态最流行的框架,文档丰富,遇到问题容易找到解决方案。通过IoC容器管理对象生命周期和依赖关系,避免硬编码耦合。等注解可以统一处理日志、事务等横切关注点,避免代码重复。DI机制让依赖通过配置(如注解。

2025-04-19 20:18:55 253

原创 面试题:Java全栈开发中为什么post会发送两次请求

预检请求是浏览器在发送某些跨域请求前,先发送一个OPTIONS请求询问服务器是否允许该实际请求。这是浏览器的安全策略,目的是保护用户数据安全。预检请求包含以下关键头部:Access-Control-Request-Method: 告知服务器实际请求将使用的方法Access-Control-Request-Headers: 告知服务器实际请求将携带的自定义头部Origin: 请求来源在Java全栈开发中,POST请求被发送两次的现象主要由预检请求机制、服务器重定向、前端重复提交等多种因素造成。

2025-04-18 09:18:31 950

原创 Spring框架中的过滤器、拦截器与Spring Security:深入比较与应用实践

Spring框架是一个轻量级的开源Java平台,它为现代Java应用程序开发提供了全面的基础设施支持。Spring的核心特性包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问等,这些特性使得开发者能够构建松耦合、易于测试和维护的企业级应用。:提供IoC容器和依赖注入功能Spring AOP:提供面向切面编程实现Spring MVC:基于模型-视图-控制器模式的Web框架:认证和授权框架:简化数据访问操作:快速应用开发的约定优于配置解决方案。

2025-04-16 09:50:16 1193

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除