- 博客(41)
- 收藏
- 关注
原创 Spring DataSource 动态切换数据源
首先,创建一个自定义注解,用于指定数据源的名称。// 默认数据源名称创建自定义注解。创建动态数据源上下文类管理数据源的切换。配置多个数据源。使用动态切换数据源。利用AOP切面在方法调用前后切换数据源。在Service或Repository中通过注解指定数据源。
2024-11-07 14:42:42
434
原创 【Java 】Java 8 中的 Files 类详解:高效文件操作指南
Files类为我们提供了处理文件和目录的便捷方法,不仅简化了文件操作,还增加了对文件属性的灵活控制。在现代 Java 项目中,善用Files类可以大大提高代码的可读性和性能。通过本文的示例,希望大家能更加深入地理解并应用这些文件操作技巧。参考资料Java 官方文档《Java 编程思想》
2024-10-22 17:28:21
2252
原创 【Java】深入理解 NIO:从基础到实践
Java NIO 是一个强大且高效的 I/O 处理工具,特别适合处理高并发的网络应用和大文件操作。在 Java 8 中,NIO 的功能得到了进一步的增强,使得文件处理更加便捷。通过深入理解和灵活使用 NIO,可以显著提升 Java 应用程序的性能。希望通过这篇文章,大家能够更好地理解 NIO 的基本概念和实际应用,为编写高性能 Java 应用打下坚实的基础。参考资料《Java 并发编程实战》Java 官方文档。
2024-10-22 17:01:39
1217
原创 【设计模式】15.深入理解 Java 中的责任链模式
将请求的发送者与接收者解耦,通过将请求沿着处理链传递,直到找到能够处理该请求的对象。Handler(处理者接口):定义处理请求的接口,可以声明一个链式调用的方法。ConcreteHandler(具体处理者):实现处理者接口,处理请求并决定是否将请求传递给下一个处理者。Client(客户端):发送请求的客户端,通过构建责任链并发出请求。// 处理者接口// 请求类// 请求类型// 请求金额// 请求者姓名。
2024-10-21 18:31:34
132
原创 【设计模式】14.深入理解 Java 中的状态模式
在一个对象内部,通过将其状态封装到不同的状态类中,使得对象的行为可以随状态的变化而变化。Context(上下文):持有当前状态的引用,并提供一个接口来处理请求。State(状态接口):定义一个接口,用于封装与上下文的一个特定状态相关的行为。ConcreteState(具体状态类):实现状态接口,具体定义该状态下的行为。// 状态接口状态模式是一种有效的设计模式,通过将与状态相关的行为封装在独立的状态类中,使得对象在不同状态下表现出不同的行为。
2024-10-21 18:30:14
149
原创 【设计模式】13.深入理解 Java 中的命令模式
将一个请求封装为一个对象,从而使得可以使用不同的请求、队列请求以及记录请求日志等功能。Command(命令接口):定义执行命令的接口。ConcreteCommand(具体命令):实现命令接口,定义一个接收者,并调用接收者的方法。Receiver(接收者):知道如何执行与命令相关的操作。Invoker(调用者):负责调用命令对象,通常持有命令对象的引用。Client(客户端):创建具体命令对象并设置接收者。// 命令接口。
2024-10-21 18:28:36
63
原创 【设计模式】12.深入理解 Java 中的模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类。模板方法使得子类可以在不改变算法整体结构的情况下,重新定义算法中的某些步骤。在这种模式下,父类提供一个模板方法(Template Method),定义了算法的通用流程,而具体的实现由子类通过覆盖某些方法提供。// 抽象的饮料类,定义冲泡的通用步骤// 模板方法,定义冲泡饮料的整体流程brew();// 通用的步骤// 抽象方法,留给子类实现。
2024-10-21 18:26:01
69
原创 【设计模式】11.深入理解 Java 中的观察者模式
定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式通常用来实现事件监听机制,当某个事件发生时,通知所有的观察者对象进行相应的处理。// 观察者接口// 被观察者接口观察者模式是一种强大且灵活的设计模式,广泛应用于需要通知机制的场景。通过将对象之间的依赖关系解耦,它提高了系统的可扩展性和可维护性。Java 标准库提供了内置的观察者模式实现,但手动实现更具灵活性。
2024-10-21 18:21:37
138
原创 【设计模式】10.深入理解 Java 中的策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。本模式使得算法可以独立于使用它的客户而变化。策略模式的关键是将不同的算法抽象为一系列可互换的策略类,客户端通过上下文类选择并使用不同的策略类,而无需关心策略的具体实现。策略模式通过将算法封装为独立的策略类,使得算法可以独立于使用它的客户端而变化。在 Java 开发中,策略模式广泛应用于各种业务场景中,如支付系统、优惠策略、排序算法等。它为系统提供了很好的灵活性和可扩展性,遵循了开闭原则,避免了复杂的条件判断语句。
2024-10-21 18:18:09
181
原创 【设计模式】9.深入理解 Java 中的代理模式
为其他对象提供一种代理以控制对这个对象的访问。代理对象扮演了中介角色,客户端通过代理对象与目标对象交互,而不是直接与目标对象打交道。Subject(抽象主题类):声明了目标对象和代理对象的公共接口。RealSubject(真实主题类):实现了抽象主题接口,是真正处理业务逻辑的对象。Proxy(代理类):实现了抽象主题接口,代理对象内部含有对真实对象的引用,负责在客户端和真实对象之间进行交互。代理模式通过在目标对象前增加一个代理对象,控制对目标对象的访问,增强或限制其行为。
2024-10-21 18:15:10
167
原创 【设计模式】8.深入理解 Java 中的外观模式
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。在复杂系统中,多个类可能相互交织,系统功能虽强大,但也难以使用和维护。外观模式通过提供一个简单的接口,隐藏了系统的复杂性,使得用户可以通过单一接口访问整个子系统,减少了客户端与子系统的耦合度。外观模式通过为复杂的子系统提供简化的接口,降低了客户端与子系统之间的耦合度,使系统更加易于使用和维护。在 Java 开发中,外观模式广泛应用于各种框架和库中,如 Spring 的服务类、数据库操作类等。
2024-10-21 18:10:33
53
原创 【设计模式】7.深入理解 Java 中的装饰器模式
/ 抽象组件// 具体组件,提供基本功能@OverrideSystem.out.println("执行基本功能");装饰器实现了Component接口,内部持有一个Component实例,用于包装被装饰对象。// 装饰器类,持有组件接口的引用@Override= null) {具体装饰器扩展Decorator类,它在方法中添加额外的行为,然后调用被装饰对象的。// 具体装饰器 A,增加新功能@OverrideSystem.out.println("增加功能 A");
2024-10-18 18:27:40
70
原创 【设计模式】6.深入理解 Java 中的适配器模式
/ 客户期望的接口// 需要被适配的类,它的接口与 Target 不兼容适配器模式是一种常见的结构型设计模式,它的主要作用是将一个接口转换为客户期望的另一个接口,使得原本接口不兼容的类能够协同工作。通过适配器模式,我们可以提高系统的灵活性和复用性,同时遵循开闭原则,降低修改已有代码的风险。适配器模式分为类适配器和对象适配器,两者各有优缺点。类适配器通过继承实现,较为直接但灵活性不足;对象适配器通过组合实现,虽然需要更多的代码,但灵活性更强。在实际开发中,我们通常优先考虑对象适配器模式。
2024-10-18 18:23:25
64
原创 【设计模式】5.深入理解 Java 中的原型模式
原型模式的核心思想是通过复制一个已存在的对象来创建一个新的对象,而不是通过new关键字来直接创建新的实例。通过这种方式,原型模式避免了昂贵的资源分配和初始化过程。原型接口(Prototype):定义了一个用于克隆自身的接口,通常通过实现Cloneable接口和clone()方法来实现。具体原型类(Concrete Prototype):实现原型接口,提供克隆对象的具体逻辑。客户端(Client):通过调用原型对象的clone()方法来复制现有对象。首先,我们定义一个抽象类Shape,它实现。
2024-10-18 18:16:14
60
原创 【设计模式】4.深入理解 Java 中的抽象工厂模式
首先,我们定义两个抽象产品接口,一个是Button(按钮),一个是TextBox(文本框)。// 抽象产品A: 按钮// 抽象产品B: 文本框接下来,我们为Button和TextBoxMacButtonMacTextBox。// 具体产品: Windows 按钮@Override// 具体产品: Mac 按钮@Override// 具体产品: Windows 文本框@Override// 具体产品: Mac 文本框@Override我们定义一个抽象工厂接口。
2024-10-18 18:12:13
69
原创 【设计模式】3.深入理解 Java 中的工厂方法模式
首先,我们定义日志记录器的抽象产品接口Logger接下来,我们为Logger定义两个具体产品:文件日志记录器和数据库日志记录器。@Override@Override我们定义一个抽象工厂类,它声明了一个工厂方法,用于创建Logger对象。工厂方法模式是面向对象设计中非常重要的设计模式之一,它通过将对象的创建过程封装到工厂类中,解耦了对象的创建和使用,提高了系统的灵活性和扩展性。
2024-10-18 18:07:58
106
原创 【设计模式】1.设计模式概述
作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。场景:适合多个对象组合使用且对象族之间相互关联的场景,如创建一整套跨平台的 UI 组件(按钮、文本框等)。优点易于扩展对象族,同时保证类间的一致性。遵循开放封闭原则,新增产品族容易。设计模式提供了经过验证的解决方案,帮助开发者在软件设计中避免重复问题,提高代码的可维护性、可扩展性和可读性。掌握设计模式不仅能够编写出更优雅的代码,还能有效应对各种复杂的开发需求。
2024-10-18 18:04:26
74
原创 【设计模式】2.深入理解 Java 中的单例模式
单例模式在 Java 开发中非常常用,它能够确保系统中某个类只有一个实例,并且为多个模块提供全局访问点。根据不同的应用场景和性能需求,选择合适的单例模式实现方式,可以有效提高系统的性能和资源利用率。在实际开发中,推荐使用静态内部类或枚举单例这两种实现方式,因为它们既简单又能避免多线程问题和序列化问题,是相对优雅的单例模式实现方式。
2024-10-18 17:56:04
97
原创 【JVM】JVM 调优经验分享
JVM 调优是一个不断迭代和优化的过程,涉及内存管理、垃圾回收、线程调度等多个方面。通过合理配置 JVM 参数,结合性能监控工具,开发者可以有效提升 Java 应用的性能和稳定性。同时,调优过程中要注重监控数据的分析和调整的细致性,避免盲目操作。
2024-10-18 16:50:15
662
原创 【JVM】JVM 调优:调什么,怎么调
在调优 JVM 前,了解 JVM 的内存结构是必要的。堆内存(Heap):存储对象实例,主要分为年轻代(Young Generation)和老年代(Old Generation)。年轻代:包含 Eden 区和两个 Survivor 区,年轻代是垃圾回收的主要对象。老年代:存储生命周期较长的对象,发生 Major GC 或 Full GC 时会回收老年代对象。方法区(Metaspace)
2024-10-18 16:46:41
794
原创 Java 锁优化详解
锁优化是提升并发程序性能的重要手段,Java 提供了多种锁优化机制,如锁粗化、锁消除、偏向锁、自旋锁等。通过合理使用这些优化技术,开发者可以减少锁的开销,提高程序的并发性能。在实际开发中,选择合适的锁策略和优化方法至关重要。对于读多写少的场景,可以使用读写锁;对于频繁访问的共享资源,可以使用无锁的并发类。理解锁优化的原理和最佳实践,可以帮助开发者编写高效的并发程序。
2024-10-18 14:51:37
939
原创 Java 线程安全处理详解
线程安全是指在多线程环境下,程序的行为能够始终保持一致性和正确性,多个线程同时访问共享资源时,不会导致数据不一致或程序状态异常。线程安全是并发编程中的重要问题,多线程环境下的共享资源访问必须通过适当的同步机制进行控制。Java 提供了多种线程安全处理机制,包括volatile、原子类、显式锁以及并发集合等。在实际开发中,选择合适的线程安全处理方式非常关键。对于简单的同步场景,可以使用和volatile;对于复杂的场景,显式锁和并发集合类提供了更灵活的控制方式。
2024-10-18 10:18:26
1582
原创 Java 指令重排的原理与规则详解
指令重排是现代处理器和编译器常用的优化技术,它能够提升程序执行效率,但在多线程编程中,指令重排可能带来数据不一致和可见性问题。Java 内存模型通过规则、volatile和final关键字,确保了在多线程环境下的内存可见性和操作有序性。在编写并发程序时,了解指令重排的原理以及如何使用适当的同步机制避免重排问题,是确保程序正确性和性能的关键。
2024-10-18 10:14:58
876
原创 【JMM】Java 内存模型与内存间的交互
Java 内存模型定义了在多线程环境下,变量的可见性有序性和原子性。可见性:一个线程对变量的修改对于其他线程是否可见。有序性:程序的执行是否按照代码的顺序发生。原子性:操作是否是不可分割的,不能被中断或分解。Java 内存模型(JMM)为多线程编程提供了强大的内存可见性和有序性保障。通过主内存与工作内存的交互、内存模型的交互规则以及volatile和等机制,JMM 解决了多线程编程中的可见性和有序性问题。理解 Java 内存模型对编写正确的并发程序至关重要。
2024-10-18 10:10:49
817
原创 【Dp】动态规划核心思路详解
令dp[i][j]表示前i件物品在容量为j的情况下的最大价值。根据物品是否放入背包,状态转移方程为:其中,dp[i-1][j]表示不放入第i件物品的情况,表示放入第i件物品的情况。令dp[i]表示以第i个元素结尾的最长递增子序列的长度。动态规划是处理最优子结构和重叠子问题的强大工具。其核心思路是通过将大问题划分为若干个子问题,然后利用记忆化搜索或递推方法逐步解决。掌握动态规划的关键在于理解状态转移方程的推导过程,并在实际问题中灵活应用。通过不断的练习和思考,动态规划将成为你解决复杂问题的有力武器。
2024-10-17 17:36:08
1657
原创 【DP】如何找到动态规划的状态转移方程
状态转移方程是动态规划的核心,其描述了从一个状态如何转移到另一个状态,即问题的当前解是如何通过子问题的解来构造的。状态转移方程的形式通常是:其中dp(i)表示问题在状态i时的解,f是一个根据问题特性定义的函数,用于将先前的状态(子问题的解)组合起来,得到当前问题的解。找到状态转移方程的核心是要理解如何将问题拆解成多个子问题,并根据子问题的最优解推导出整体问题的最优解。在确定状态和子问题后,我们需要建立这些状态之间的关系,即状态转移方程。
2024-10-17 17:35:27
1295
原创 【MySQL】MySQL 慢查询优化详解与实例
MySQL 中的慢查询是指执行时间超过某个阈值的 SQL 语句。默认情况下,MySQL 认为执行时间超过 10 秒的查询语句就是慢查询,具体的阈值可以通过参数进行配置。慢查询会被记录到慢查询日志中,帮助开发者分析和优化性能问题。优化 MySQL 慢查询是提升数据库性能的重要步骤。在优化过程中,我们可以借助 MySQL 提供的工具如EXPLAIN、慢查询日志等来定位性能瓶颈,并通过创建索引、优化 SQL 结构、减少锁竞争等方法来提升查询效率。
2024-10-17 16:34:23
723
原创 Java 引用类型分类详解
强引用是 Java 中最常见的引用类型,也是默认的引用类型。当我们通过new关键字创建一个对象并赋值给某个变量时,这个变量就是对该对象的强引用。在上述代码中,变量str是对字符串对象"Hello"的强引用。只要这个强引用存在,垃圾回收器(GC)就不会回收该对象。软引用是一种相对较弱的引用类型,用于指向一些不那么重要的对象。在内存足够时,软引用对象不会被回收;但如果 JVM 发现内存不足时,会尝试回收这些软引用对象以释放内存。要使用软引用,需要借助弱引用是一种比软引用更弱的引用类型。
2024-10-17 14:57:51
1484
原创 【JVM】Java 垃圾回收基础与根搜索算法详解
垃圾回收的主要目的是回收不再被引用的对象所占的内存。由于 Java 采用的是自动内存管理,开发者不需要手动释放内存,垃圾回收器会在合适的时间自动完成这项工作。Java 的垃圾回收机制依赖于堆内存的管理,负责清理那些不再使用的对象,从而保证系统内存不会被耗尽。根搜索算法(GC Root Tracing)是 Java 垃圾回收的重要算法之一,它通过从GC Roots开始,逐步追踪对象的引用关系,判断哪些对象是可达的,哪些是不可达的。可达的对象被认为是“活跃”的,不会被回收;
2024-10-17 14:49:09
964
原创 【JVM】静态分派与动态分派详解
方法分派是指在方法调用时,如何确定应该调用哪个方法的过程。静态分派:在编译期间决定调用哪个方法。动态分派:在运行期间根据实际对象类型来决定调用哪个方法。静态分派是指方法调用的目标在编译时确定,编译器根据变量的静态类型(即编译器能看到的类型)来确定调用哪个方法。这种分派发生在方法重载的场景中。方法重载是指在同一个类中存在多个同名的方法,但参数类型或数量不同。编译器通过参数列表的类型来选择合适的重载方法。动态分派是指方法调用的目标在运行时根据对象的实际类型(动态类型)来确定。
2024-10-17 13:22:43
684
原创 【JVM】栈帧与局部变量表详解
栈帧(Stack Frame)是 JVM 方法执行时所使用的数据结构。每当 JVM 调用一个方法时,都会为该方法创建一个新的栈帧。栈帧存储了方法执行过程中所需的局部变量、操作数栈、动态链接、方法返回地址等信息。栈帧在 JVM 栈中进行分配,每次方法调用会对应压入一个新的栈帧,当方法执行完毕后,栈帧会从栈中弹出。由于每个线程都有自己的 JVM 栈,因此栈帧是线程私有的,其他线程不能访问。
2024-10-17 11:15:38
908
原创 【JVM】使用 IntelliJ IDEA 进行 Java 内存分析
IntelliJ IDEA 提供了与 VisualVM 和 JProfiler 等工具集成的功能,可以直接在 IDE 中生成堆转储文件,并分析对象的内存占用。捕获堆转储(heap dump):分析 Java 应用的堆内存结构,找到内存占用异常大的对象。分析对象分配情况:查看每个类实例的分配位置,识别内存热点。查找内存泄漏:通过分析对象的引用关系,发现没有被释放的对象。IntelliJ IDEA 提供了强大的内存分析工具和插件支持,帮助开发者快速定位和解决 Java 应用中的内存问题。
2024-10-17 10:44:54
4705
1
原创 【JVM】深入理解 Java Trace 跟踪与堆内存参数配置
Trace 跟踪是一种日志技术,它记录了程序运行过程中的详细信息,帮助开发者了解程序执行的每一步。通过 trace,我们可以追踪程序的每个方法调用、线程活动、内存分配等,从而更好地分析和调试程序。方法调用跟踪:记录方法的调用链,帮助开发者了解程序的执行流程。内存跟踪:记录对象的内存分配、垃圾回收等信息,便于内存管理的优化。线程跟踪:记录线程的状态和活动,帮助诊断线程死锁、竞争等问题。本文详细讲解了 Java Trace 跟踪的概念与使用方法,以及 JVM 堆内存的常用参数配置。
2024-10-17 10:37:18
1340
原创 【JVM】堆内存模型与分配详解
程序计数器(Program Counter Register):每个线程都有一个独立的程序计数器,用于存储当前执行指令的地址。虚拟机栈(Java Virtual Machine Stack):每个线程都会有一个独立的栈空间,用于存储局部变量、操作数栈、动态链接等数据。本地方法栈(Native Method Stack):与虚拟机栈类似,但专用于执行本地方法(Native Methods)。堆(Heap):存储对象实例,是所有线程共享的内存区域。方法区(Method Area)
2024-10-17 10:11:19
922
1
原创 JVM 参数详解:从常用到一般常用的配置分析
JVM 参数的选择和配置对应用的性能表现至关重要。对于大多数应用而言,堆内存设置、GC 策略和栈大小是最常用且最直接影响应用稳定性的参数。GC 日志和逃逸分析等调试参数则适用于性能调优和问题排查。在特定应用场景中,结合业务需求和硬件资源,合理选择 JVM 参数,能够让 Java 应用运行得更高效、稳定。JVM 提供的参数非常丰富,开发者在使用时应根据实际情况进行测试和调优。通过深入理解 JVM 参数的作用,我们可以更好地掌控 Java 应用的运行时行为,最大化地发挥系统性能。
2024-10-15 14:00:01
899
原创 深入解析 JVM 的 JIT 编译优化策略
JIT 编译器是 JVM 的核心性能优化工具,通过方法内联、逃逸分析、常量传播等多种优化策略,JIT 可以显著提升 Java 应用的执行效率。虽然 JIT 在程序启动时会有一定的开销,但其长期运行的优化效果使其成为 Java 程序性能提升的关键。理解 JIT 编译器的优化策略不仅有助于优化 Java 程序的性能,还能帮助开发者更好地理解 Java 的运行机制。在实际开发中,合理配置 JVM 参数(如)和垃圾回收器,可以帮助我们更好地利用 JIT 编译器的优势,提高应用的响应速度和稳定性。
2024-10-15 13:54:22
773
原创 【JVM】 垃圾回收算法研究
JVM 提供了丰富的垃圾回收算法来处理对象生命周期的回收问题。每种算法都有其优缺点和适用场景,而不同的垃圾回收器则在特定场景下提供优化。对于小型应用程序,Serial 和 Parallel 收集器可能足够,而对于大型、延迟敏感的应用,CMS 和 G1 则是更好的选择。理解这些算法和回收器的工作原理,可以帮助我们根据应用的需求优化 JVM 的性能设置,从而提高程序的响应能力和稳定性。
2024-10-15 13:50:03
624
原创 JVM 简化架构详解
JVM 是 Java 生态系统的基石,通过类加载、字节码执行和内存管理等模块,JVM 实现了 Java 的跨平台特性,并为应用提供了安全、高效的运行时环境。JVM 的架构虽然复杂,但通过简化架构图我们可以更清晰地了解各个模块之间的协作关系。掌握 JVM 的内部工作原理不仅能帮助我们优化代码性能,还能帮助我们解决诸如内存泄漏和程序崩溃等问题。这就是对 JVM 简化架构的介绍,如果你想深入了解 JVM 的细节,还可以进一步研究不同垃圾回收算法、JIT 编译的优化策略等内容。这些内容我会之后再出相关博客~
2024-10-15 13:46:18
471
原创 【ASM】工具类与常用类 Printer、ASMifier、Textifier 介绍
ASM 是一个用来生成、修改和分析字节码的框架,尤其适合需要对字节码进行性能优化、动态类生成的场景。它提供了一个基于事件的字节码操控方式,使开发者可以精确地操作每一条字节码指令。与其他字节码框架如 Javassist 和 CGLIB 相比,ASM 更加底层,因此也更轻量和高效。在使用 ASM 进行字节码操作时,有时需要将字节码以人类可读的形式进行展示,或将已有的类转换为 ASM API 代码以方便开发。这就需要使用一些实用的辅助工具类,如。
2024-10-14 16:58:51
796
原创 深入理解 JVM 字节码操作:ASM 框架与 Spring Cloud 实践应用
ASM 是一个 Java 字节码操作和分析的框架,能够动态生成和修改字节码。它的设计非常高效,适合需要频繁字节码修改的场景,例如动态代理、AOP、性能监控等。相比其他字节码操作框架(如 Javassist 和 BCEL),ASM 的性能更优,允许直接操纵字节码指令。虽然 ASM 的使用门槛较高,但它能为开发者提供精确的控制。Spring Cloud 是一套帮助开发者构建分布式微服务的工具集。它简化了服务发现、配置管理、负载均衡等功能的实现。
2024-10-14 16:45:32
1485
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人