
Java总结
文章平均质量分 73
Java总结
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
shangjg3
这个作者很懒,什么都没留下…
展开
-
Spring 框架中的经典设计模式
Spring框架在Java开发中广泛应用,其成功得益于多种经典设计模式的巧妙运用。单例模式通过减少对象创建和销毁的开销,提升了系统性能;工厂模式通过IoC容器管理Bean,降低了代码耦合度;代理模式通过AOP实现功能增强,如日志记录和事务管理;模板方法模式简化了重复代码,提高了代码复用性;观察者模式通过事件驱动模型实现模块解耦;适配器模式解决了接口不兼容问题;策略模式则提供了灵活多变的算法选择。这些设计模式不仅增强了Spring框架的功能和灵活性,也为开发者提供了高效的开发范式,有助于编写结构清晰、可维护性原创 2025-05-19 06:00:00 · 13 阅读 · 0 评论 -
Spring 框架线程安全的五大保障策略解析
在高并发互联网应用中,线程安全是系统稳定运行的关键。Spring框架通过多种技术手段为开发者提供了全面的线程安全支持。首先,Spring采用线程安全的数据结构如ConcurrentHashMap,通过分段锁机制提升并发性能并保证数据正确性。其次,Spring利用对象锁定机制,如synchronized关键字,确保多线程环境下对象的操作安全。第三,Spring通过线程池管理线程,减少资源消耗,提高系统稳定性和响应速度。第四,Spring的事务管理功能保障数据一致性,自动回滚异常操作。最后,Spring默认采用原创 2025-05-18 06:30:00 · 19 阅读 · 0 评论 -
MyBatis 插件机制深度解析:从原理到实践
MyBatis插件机制通过责任链模式和动态代理实现,允许开发者在SQL执行过程中拦截和增强Executor、StatementHandler、ParameterHandler、ResultSetHandler四大核心组件的方法调用。开发者需实现Interceptor接口,并通过@Intercepts和@Signature注解指定拦截方法。插件配置在MyBatis配置文件中注册后,MyBatis在启动时会解析并织入插件。插件通过Proxy.newProxyInstance创建代理对象,在方法调用时执行自定义逻原创 2025-05-18 06:00:00 · 26 阅读 · 0 评论 -
MyBatis 执行流程深度解析:一文看懂数据流转全过程
MyBatis是Java开发中常用的持久层框架,其执行SQL语句的流程包括四个主要步骤:首先,通过加载配置文件并构建SqlSessionFactory来获取SqlSession,这是与数据库交互的核心接口。其次,通过SqlSession获取Mapper接口的代理对象,并委托Executor执行器处理SQL查询。Executor在执行前会通过StatementHandler设置参数,并执行查询操作。接着,ResultSetHandler根据映射规则将结果集转换为Java对象。最后,完成操作后关闭SqlSess原创 2025-05-17 20:13:24 · 36 阅读 · 0 评论 -
MyBatis 核心组件源码分析
MyBatis是Java中广泛使用的持久层框架,以其灵活的SQL映射和强大的扩展性受到开发者青睐。本文通过源码分析,深入探讨了MyBatis的四个核心组件:SqlSessionFactory、SqlSession、Executor和MappedStatement。SqlSessionFactory作为入口,负责创建SqlSession,其构建过程涉及配置文件的解析和Configuration对象的填充。SqlSession是数据库操作的入口,通过Executor执行具体的SQL操作。Executor作为SQ原创 2025-05-17 20:05:36 · 125 阅读 · 0 评论 -
SpringBoot开启事务
在SpringBoot中开启事务管理主要依赖于Spring的声明式事务机制,配置简单且高效。首先,在主应用类上添加@EnableTransactionManagement注解以启用事务管理功能。其次,通过添加JDBC或JPA依赖,SpringBoot会自动配置数据源和事务管理器。接着,在服务层方法上使用@Transactional注解来标记需要事务管理的方法,可以自定义传播行为、隔离级别、超时时间等参数。需要注意的是,@Transactional注解通过Spring AOP代理生效,因此同一类内部的方法调用原创 2025-05-17 06:00:00 · 17 阅读 · 0 评论 -
Java 实现异步接口的方法
若你使用的是Spring框架,RestTemplate可配合AsyncTaskExecutor实现异步请求。不过要留意,RestTemplate本身是同步的,这种方式是将其包装在异步任务里。:如果项目基于Spring框架,推荐使用这种方式,它完全支持响应式编程模型,性能表现出色。无论你选择哪种方案,异步编程的核心思路都是避免阻塞主线程,从而提高系统的吞吐量和响应性能。Spring 5引入的WebClient是完全异步非阻塞的客户端,特别适合响应式编程。在Java里,实现异步请求接口有多种可行的办法。原创 2023-08-17 16:40:15 · 1962 阅读 · 0 评论 -
Java 接口中实现异步处理的方法
在Java中,接口本身不能直接实现异步逻辑,异步处理需要在实现接口的类中通过多线程、异步框架或回调机制来实现。常见的实现方式包括:1. 多线程:通过创建线程或线程池执行异步任务,适合轻量级场景。2. CompletableFuture:Java 8+ 提供的异步编程工具,支持回调链和流式处理,代码简洁。3. Spring的@Async注解:在Spring项目中,通过注解将方法标记为异步执行,框架自动管理线程池,适合企业级应用。4. 回调机制:定义包含回调方法的接口,异步任务完成后主动调用回调,适用于老版本J原创 2025-05-16 10:46:20 · 27 阅读 · 0 评论 -
反射技术在 MyBatis 中的应用和源码分析
MyBatis框架中,反射技术是其实现灵活映射和动态代理的核心机制。主要应用场景包括:1. 映射器接口代理:通过JDK动态代理和反射,MyBatis允许开发者通过接口定义数据库操作,无需编写实现类。2. 结果集映射:使用反射动态设置对象属性,将SQL查询结果映射到Java对象。3. 参数处理:通过反射获取参数对象的属性值,设置到SQL语句中。4. 插件机制:通过动态代理和反射实现方法拦截和增强。MyBatis通过Reflector和MetaObject等核心类封装反射操作,提高了反射效率并简化了开发。这些技原创 2025-05-14 05:30:00 · 22 阅读 · 0 评论 -
反射技术在 Spring DI、IOC 和 AOP 中的应用和源码分析
Spring 的 IOC(控制反转)和 DI(依赖注入)是其核心特性,通过反射机制,Spring 容器可以在运行时动态地创建和管理 Bean 对象,并将依赖关系注入到相应的 Bean 中。在 Spring AOP 中,JdkDynamicAopProxy 类是基于 JDK 动态代理实现的 AOP 代理类,其中 invoke 方法使用反射来调用目标方法和增强方法。通过以上分析可以看出,反射机制是 Spring IOC、DI 和 AOP 实现的重要基础,它使得 Spring 框架具有强大的灵活性和扩展性。原创 2025-05-13 06:30:00 · 25 阅读 · 0 评论 -
总结一下Java的反射技术和应用场景
Java的反射(Reflection)是指在运行时获取一个类的所有信息(包括成员变量、方法、构造函数等),并且可以在运行时调用对象的方法或操作对象的属性。以下是对Java反射技术及其应用场景的总结:1、反射技术要点实现反射的关键类1.Class类:代表一个类,可通过它获取类的各种信息,如类名、方法、字段等。2. Field类:代表类的成员变量,可用于获取和设置对象的属性值。3. Method类:代表类的方法,可用于调用对象的方法。4. Constructor类:代表类的构造方法,可用于创建对象。原创 2025-05-13 06:00:00 · 20 阅读 · 0 评论 -
总结Java保证线程安全的方式
CopyOnWriteArrayList:写时复制的 List,在进行写操作时,会先复制一个新的数组,修改完成后再将新数组赋值给原数组,读操作则不需要加锁,适用于读多写少的场景。当线程数量超过许可数量时,其他线程需要等待,从而保证资源的安全使用。ConcurrentHashMap:线程安全的哈希表,采用分段锁机制,允许多个线程同时进行读操作,写操作则需要获取锁。ThreadLocal 为每个线程提供了一个独立的变量副本,每个线程只能访问自己的变量副本,避免了多线程之间的竞争。原创 2025-05-12 06:00:00 · 25 阅读 · 0 评论 -
Java中的过滤器与拦截器
在 Java Web 开发中,过滤器(Filter)和拦截器(Interceptor)是两个非常重要的概念,它们在请求处理流程中扮演着不同的角色,用于实现诸如日志记录、权限验证、字符编码转换等功能。过滤器和拦截器在 Java Web 开发中都有着重要的作用,它们可以帮助我们实现一些通用的功能,提高代码的复用性和可维护性。拦截器是 Spring MVC 框架中的一部分,它可以在请求处理的不同阶段进行拦截,如请求处理前、请求处理后、视图渲染前等。拦截范围:过滤器可以拦截所有的请求,包括静态资源请求;原创 2025-05-12 05:15:00 · 16 阅读 · 0 评论 -
Java中线程安全的集合类及其内部原理
ConcurrentSkipListMap 是线程安全的有序映射,ConcurrentSkipListSet 是基于 ConcurrentSkipListMap 实现的线程安全的有序集合,它们借助 CAS 和锁机制来保证线程安全。当进行写操作(如 add、remove)时,会先复制一份新的数组,在新数组上完成修改操作,最后将原数组引用指向新数组。Java 7 及以前:采用分段锁机制,将整个哈希表划分成多个段(Segment),每个段都是一个独立的小哈希表,各段之间的操作可并行进行。原创 2025-05-11 06:00:00 · 26 阅读 · 0 评论 -
Java 并发情况下,保证数据最终一致性
在 Java 并发场景中,确保数据最终一致性是一项重要的任务,特别是在分布式系统或者多线程环境下。最终一致性指的是在一段时间后,所有副本的数据会达到一致状态。借助消息队列,数据更新操作能异步执行,从而保证最终一致性。消息队列能够实现异步通信,将数据更新操作封装成消息发送到队列,由消费者按顺序处理消息,进而保证数据最终一致。为数据添加版本号,在更新数据时检查版本号,只有版本号匹配才能更新,这样可避免并发更新导致的数据不一致。当更新操作失败时,重试机制会进行多次重试,直至操作成功,以此保证数据最终一致。原创 2025-05-11 04:00:00 · 36 阅读 · 0 评论 -
Stack Overflow常见场景和解决方法
在复杂程序里,方法间嵌套调用层次过多,每层调用都会在栈上占用一定空间,当调用链长度超出栈容量,就会出现栈溢出。递归函数没有合适的终止条件或者终止条件设置有误,会持续调用自身,不断在栈上创建新的栈帧,使栈空间耗尽。这将栈空间大小设置为 2MB,但这只是临时的解决方案,不能从根本上解决栈溢出问题,并且过大的栈空间可能会导致内存使用不合理。可以将复杂的方法拆分成多个简单的方法,避免过深的嵌套。若方法A调用方法B,方法B又调用方法A,且没有有效的退出机制,会造成无限循环调用,导致栈溢出。2. 过深的方法嵌套调用。原创 2025-05-10 06:30:00 · 26 阅读 · 0 评论 -
Java内存泄漏的场景和解决方法
使用静态集合类(如`static List`、`static Map`等)来存储对象引用,这些对象可能因为静态集合的生命周期与应用程序相同,即使对象不再被使用,也无法被回收。例如,在一个类中定义了一个静态的`List`,在程序运行过程中不断向其中添加对象,却没有合适的清理机制。例如,在外部类中定义了一个内部类,内部类的方法中访问了外部类的成员变量,并且内部类的实例在外部类实例销毁后仍然存在。场景:当在方法内部创建对象,且该对象的引用被存储在类的成员变量中,在对象不再使用时,引用未被设置为null。原创 2025-05-10 06:00:00 · 35 阅读 · 0 评论 -
ArrayList和LinkedList对比分析
当元素数量超过数组容量时,会创建一个更大的新数组,并将原数组中的元素复制到新数组中。LinkedList:在链表头部或尾部插入或删除元素时,时间复杂度为 O(1),因为只需要修改节点的引用。ArrayList:由于使用连续的内存空间,会预留一定的容量用于后续元素的添加,可能会造成一定的内存浪费。ArrayList:由于使用数组存储元素,通过索引可以直接访问数组中的元素,时间复杂度为 O(1)。ArrayList:适用于需要频繁随机访问元素,而插入和删除操作主要在数组末尾进行的场景。原创 2025-05-09 06:00:00 · 16 阅读 · 0 评论 -
Netty 源码分析
ChannelHandler:是处理 Channel 事件的核心接口,它有两个重要的子接口:ChannelInboundHandler 用于处理入站事件(如数据读取),ChannelOutboundHandler 用于处理出站事件(如数据写入)。EventLoop:负责处理注册到它上面的 Channel 的 I/O 事件,它是一个单线程的事件循环,一个 EventLoop 可以处理多个 Channel。Channel:表示一个网络连接的抽象,它提供了一系列的方法用于操作网络连接,如读写数据、关闭连接等。原创 2025-05-08 05:00:00 · 370 阅读 · 0 评论 -
Spring 依赖注入源码深度剖析
通过对 Spring 依赖注入源码的深入分析,我们了解了 Spring 如何加载和解析 Bean 定义,如何创建 Bean 实例并进行依赖注入,以及自动装配功能的实现原理。在 populateBean 方法中,会根据 BeanDefinition 中的信息,使用不同的注入方式(如按名称注入、按类型注入)将依赖对象注入到目标对象中。在 autowireByType 方法中,会遍历目标对象的属性,根据属性的类型从 BeanFactory 中查找匹配的 Bean 实例,并将其注入到属性中。原创 2025-05-09 05:00:00 · 13 阅读 · 0 评论 -
Servlet 源码分析
通过对 Servlet 源码的深入分析,我们了解了 Servlet 的生命周期、核心接口和类的实现,以及 Servlet 容器与 Servlet 之间的交互过程。Servlet 遵循特定的生命周期,从初始化、处理请求到销毁,每个阶段都有明确的行为。Tomcat 首先会根据请求的 URL 找到对应的 Context 对象,然后在 Context 中查找匹配的 ServletMapping,最后根据 ServletMapping 找到对应的 Servlet 实例,并调用其 service 方法处理请求。原创 2025-05-08 05:45:00 · 21 阅读 · 0 评论 -
使用Java NIO 实现一个socket通信框架
使用Java NIO(非阻塞I/O)实现一个Socket通信框架,可以让你构建高性能的网络应用。NIO提供了Channel、Buffer和Selector等核心组件,支持非阻塞模式下的网络编程。下面是一个简单的例子,展示了如何使用Java NIO创建一个基本的服务器端和客户端进行Socket通信。原创 2025-05-07 16:22:42 · 127 阅读 · 0 评论 -
用Netty实现一个socket通信框架
Netty 是一个基于 NIO(Non-blocking I/O)的客户端-服务器框架,它极大地简化了TCP、UDP、HTTP等协议的网络应用开发。下面我将为你提供一个基本的使用Netty实现Socket通信的例子,包括服务端和客户端的基本代码结构。原创 2025-05-07 16:15:19 · 23 阅读 · 0 评论 -
Java 函数式编程
在 JDK 1.8 之前,我们只能通过匿名表达式来完成类似的功能,但是匿名表达式比较繁琐,存在大量的模板代码,不利于将行为参数化,而采用 Lamdba 则能很好的解决这个问题。super T,?Stream 中最强大一个终止操作是 collect() ,它接收一个收集器 Collector 作为参数,可以将流中的元素收集到集合中,或进行分组、分区等操作。可选的返回关键字:如果主体只有一个表达式,则该表达式的值就是整个 Lambda 表达式的返回值,此时不需要使用 return 关键字进行显式的返回。原创 2023-11-04 22:46:27 · 213 阅读 · 0 评论 -
高性能分布式对象存储-MinIO多节点部署
MinIO 是一个高性能的分布式对象存储服务,它可以配置为多节点(或多服务器)模式以提供高可用性和数据冗余。以下是一个基本的多节点MinIO部署示例:确保你有多个服务器或虚拟机。 在每个节点上安装MinIO。 使用minio server命令启动多节点模式。以下是一个简单的命令行示例,展示如何在两个节点上启动MinIO实例:节点1:minio server http://192.168.1.101:9000/data http://192.168.1.101:9000/data2原创 2024-06-11 10:02:15 · 769 阅读 · 0 评论 -
高性能分布式对象存储-MinIO 核心概念
该模式是Minio服务最常用的架构,通过共享一个access_key和secret_key,在多台服务器上搭建服务,且数据分散在多块(大于4块,无上限)磁盘上,提供了较为强大的数据冗余机制(Reed-Solomon纠删码)。——单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。原创 2024-06-11 10:28:28 · 1066 阅读 · 0 评论 -
Java NIO 编程
而 NIO 是面向缓冲区的,所有的读写操作都需要通过 Buffer 来完成,数据会被先写入 Buffer 中,然后再进行处理,Buffer 提供了多种方法用于操纵其中的数据,因此其在操作上更加灵活,读取速度也更加快。- 复制缓冲区的 mark、position、limit、capcaity 属性的初始值与复制时原缓冲区的 mark、position、limit、capcaity 的值相同,但这些属性与原缓冲区的属性相互独立,创建后就不再受原有缓冲区的影响;close():关闭当前 Channel。原创 2023-11-03 22:44:54 · 336 阅读 · 0 评论 -
JSCH使用自定义连接池
4.2 使用springboot中bean的作用域prototype。2. 改造shellUtil。使用@Lookup注入方式。4. 线程安全问题解决。原创 2024-04-07 16:04:28 · 725 阅读 · 0 评论 -
Mybatis的驼峰映射配置和源码分析
MyBatis的驼峰命名映射功能(camelCase mapping)允许数据库中的下划线命名(如user_name)自动映射到Java对象的驼峰命名属性(如userName)。这一特性极大简化了数据库字段与Java对象属性的映射配置。:DefaultResultSetHandler的handleResultSets方法是处理查询结果的入口点。3. 将下划线命名的列名(如user_name)转换为驼峰命名(如userName)这一机制使得开发人员无需编写繁琐的列-属性映射配置,提高了开发效率。原创 2023-08-16 12:55:08 · 205 阅读 · 1 评论 -
Eureka-Serve的探活机制,是如何判断一个服务不可用的?
Eureka Server不再从注册列表中移除因为长时间没有收到心跳而应该剔除的过期服务,如果在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等!实际,心跳检测机制有一定的不确定行,比如服务提供者可能是正常的,但是由于网络通信的问题,导致在90s内没有收到心跳请求,那将会导致健康的服务被误杀。服务端维护了每个实例的最后一次心跳时间,客户端发送心跳包过来后,会更新这个心跳时间。原创 2024-06-28 18:25:23 · 967 阅读 · 0 评论 -
java 递归遍历JSON字符串获取某个字段的值
在 Java 中,若要递归遍历 JSON 字符串并获取特定字段的值,可借助 Jackson 库。以下是一个示例代码,它能实现递归遍历 JSON 字符串并获取指定字段的值。原创 2025-04-14 16:11:07 · 398 阅读 · 0 评论 -
Ribbon的9种负载均衡策略
它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。PredicateBaseRule 类是 ClientConfigEnabledRoundRobbinRule 类的一个子类,它通过内部定义的一个过滤器过滤出一部分服务实例清单,然后用线性轮形的方式从过滤出来的服务实例清单中选取提个服务实例。incrementAndGetModulo() 方法获取一个下标 (是先加1,然后和服务清单总数取模获取到的,不会越界),是一个不断增长的数。原创 2024-06-30 03:00:00 · 1355 阅读 · 0 评论 -
SpringBoot自动装配的过程和源码分析
Spring Boot的自动装配是其核心特性之一,它能够根据类路径中的依赖、配置和环境条件,自动配置Spring应用程序。这种机制使得Spring Boot应用能够根据类路径中的依赖自动配置所需的组件,大大减少了开发者的配置工作。:从META-INF/spring.factories加载候选配置类。:通过@SpringBootApplication启用自动装配。2. 从spring.factories加载配置类。:将最终筛选后的配置类加载到Spring容器中。原创 2023-08-08 11:32:32 · 97 阅读 · 0 评论 -
JDBCJobStore改为LocalDataSourceJobStore的过程并分析源码
starter-quartz升级 2.5.7之后的问题。将quatz.propeties文件中。原创 2023-08-08 15:53:20 · 1148 阅读 · 0 评论 -
Java 反射与注解
对于数组类型的getName返回值,使用前缀`[`表示数组,有几个`[`表示是几维数组,数组类型使用简写表示:`boolean(Z)`、`byte(B)`、`char(C)`、`double(D)`、`float(F)`、`int(I)`、`long(J)`、`short(S)`、`接口和类(L)`。在 Java 中,每个已加载的类在内存中都有一份类信息,类信息对应的类是 `java.lang.Class`,每个对象都持有指向它所属类信息的引用。原创 2023-11-03 22:57:14 · 271 阅读 · 1 评论 -
Java服务CPU占用率太高问题排查
pid是Java进程的进程号,interval是采样间隔时间(单位为毫秒),count是采样次数。使用jstack命令获取Java进程的线程信息。使用jstat命令查看Java进程的GC情况。pid是Java进程的进程号。原创 2023-08-16 17:14:19 · 74 阅读 · 0 评论 -
Springboot中JSCH的使用
将目标服务器上文件名为src的文件下载到本地,本地文件名为dst。(注:src必须是文件,不能为目录)指定文件传输模式为mode(mode可选值为:ChannelSftp.OVERWRITE,ChannelSftp.RESUME,ChannelSftp.APPEND),并使用实现了SftpProgressMonitor接口的monitor对象来监控文件的传输进度。将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。指定文件传输模式为mode。原创 2024-04-07 15:56:43 · 2004 阅读 · 0 评论 -
堆是一个完全二叉树
例如 3 , 1 , 2 {3,1,2}3,1,2 可以看作为大根堆,而 3 , 2 , 1 {3,2,1}3,2,1 亦可以看作为大根堆。小根堆的性质与大根堆类似,只不过在二叉树的结构中,根结点<子结点。例如 1 , 2 , 3 {1,2,3}1,2,3 为小根堆,1 , 3 , 2 {1,3,2}1,3,2 同样也是小根堆。若 2 ⋅ i + 2 < n 2·i+2<n2⋅i+2<n ,其右子节点的序号为 2 ⋅ i + 2 2·i+22⋅i+2 ,否则没有右子节点。原创 2024-07-01 09:49:04 · 254 阅读 · 0 评论 -
SpringCloud Feign-声明性Http请求以及Hystrix-Http请求的熔断配置
1.1 概述– Feign是一个声明性web服务客户机。它使编写web服务客户机变得更容易。– 它的使用方法是定义一个服务接口并在上面添加注解。– Feign支持可插拔编码器和解码器。– Spring Cloud对Feign进行了封装,使其支持SpringMVC标准注解和。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。1.2 Feign的作用Feign旨在使编写Java Http客户端变得更容易。前面在使用时,利用。原创 2024-01-03 14:17:13 · 1126 阅读 · 0 评论 -
SpringCloud超时问题汇总
connectTimeout: 10000 # 连接超时时间(毫秒)readTimeout: 10000 # 读取超时时间(毫秒)原创 2024-05-11 11:15:00 · 561 阅读 · 0 评论