JAVA
文章平均质量分 67
kfepiza
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring的 三级缓存 与 AOP 笔记251009
Spring 的三级缓存机制与 AOP 代理有着密切的关系,正是为了正确处理 AOP 代理对象的循环依赖问题,才需要三级缓存而不仅仅是两级缓存。如果没有三级缓存,会出现什么问题? 方法详解AOP 代理在循环依赖中的创建时机正常情况(无循环依赖)循环依赖情况具体流程分析步骤 1:A 实例化并暴露工厂步骤 2:B 依赖 A 时触发代理创建为什么需要三级缓存?如果只有两级缓存会怎样?方案一:二级缓存 + 提前创建所有代理问题:方案二:二级缓存 + 延迟创建代理三级缓存的优势原创 2025-10-09 02:04:15 · 608 阅读 · 0 评论 -
Spring 如何解决循环依赖 笔记251008
一句话总结:Spring 只解决「单例 Bean 的字段 / setter 循环依赖」,靠的是三级缓存 + 提前暴露“半成品”引用;构造器注入、原型作用域的循环依赖直接抛异常。下面把完整机制拆开讲清:位置:以「A → B,B → A」字段注入为例:此时 A 还在三级缓存,调用 拿到早期引用(若需要 AOP 则在这里生成代理),把结果放进二级缓存并删除三级缓存条目;B 拿到这个引用完成属性填充,初始化结束 → 放入一级缓存B 返回后,A 继续完成属性填充 → 初始化结束 → 放入一级缓存整个过程没有两次初原创 2025-10-09 01:28:38 · 502 阅读 · 0 评论 -
Spring的三级缓存原理 笔记251008
在// 一级缓存:完整的单例 Bean// 二级缓存:早期的单例对象(尚未完成属性填充)// 三级缓存:单例工厂(用于创建早期引用)// 正在创建中的 Bean 名称集合解决什么问题:单例 Bean 的循环依赖核心思想:提前暴露未完全初始化的 Bean 引用三级缓存分工一级缓存:完整的 Bean二级缓存:早期的 Bean 引用三级缓存:Bean 创建工厂关键时机:实例化后、属性填充前添加到三级缓存特殊处理:支持 AOP 代理等后处理器限制条件。原创 2025-10-08 22:32:52 · 1134 阅读 · 0 评论 -
Spring的 `@Import`注解 笔记251008
是 Spring 框架中的一个重要注解,用于快速导入一个或多个配置类到当前配置类中。它是 Spring 模块化配置和条件化配置的核心注解之一。2. @Import 的主要用途2.1 导入配置类2.2 导入普通组件类3. @Import 的高级用法3.1 使用 ImportSelector 接口 允许根据条件动态选择要导入的配置类。3.2 使用 ImportBeanDefinitionRegistrar 接口 提供更细粒度的控制,可以直接操作 BeanDefinition。3.3 结合原创 2025-10-08 21:18:11 · 981 阅读 · 0 评论 -
Java的`volatile`关键字 笔记251007
三性: 可见性 , 有序性 , 原子性 (二保,一不保) 保证可见, 保证有序, 不保原子 是 Java 中的一个关键字,用于修饰变量。它主要有两个作用:使用 解决可见性问题3. 的三大特性 (二保,一不保) 保证可见, 保证有序, 不保原子可见性 , 有序性 , 原子性 三大语义3.2 禁止指令重排序 (No Reordering)为什么需要 volatile?3.3 不保证原子性 (No Atomicity)4. volatile 的实现原理4.1 内存屏障 (Mem原创 2025-10-07 23:23:16 · 674 阅读 · 0 评论 -
乐观锁 与 悲观锁 笔记251007
乐观锁与悲观锁详解 基本概念 悲观锁 (Pessimistic Locking)思想:假设最坏的情况会发生,每次访问数据时都认为其他线程会修改数据,因此在访问数据前先加锁。特点: 乐观锁 (Optimistic Locking)思想:假设最好的情况会发生,每次访问数据时认为其他线程不会修改数据,只在提交更新时检查数据是否被修改过。特点: 实现机制对比 悲观锁实现方式 数据库层面 Java 层面 乐观锁实现方式 数据库层面原创 2025-10-07 21:36:27 · 941 阅读 · 0 评论 -
CAS (Compare and Swap) 笔记251007
好的,我们来详细、深入地解析一下 CAS(Compare and Swap)。CAS 是现代并发编程的基石之一,它使得无锁(Lock-Free)和高性能的并发算法成为可能。CAS 是一种原子操作。它用于在多线程环境下实现同步,而无需使用重量级的锁(如 或 )。它的核心思想是:“我认为内存位置 V 的值应该是 A,如果是,那么把它更新为 B;否则,不要修改它,但要告诉我当前的实际值是什么。”一个 CAS 操作包含三个操作数:CAS 的语义可以用以下伪代码来表示:关键在于,整个比较和交换的过程是一个单一的、原创 2025-10-07 19:04:38 · 1124 阅读 · 0 评论 -
Java的任务调度框架之 Quartz 以及 CronTrigger,CronScheduleBuilder 和 Cron表达式 笔记250930
Quartz是一个功能完善的开源作业调度框架,提供精确的任务调度能力,支持从简单定时任务到复杂企业级调度的各种场景。2. Cron表达式深度解析2.1 标准格式与字段说明字段详细说明表:高级字符3. CronScheduleBuilder详解3.1 核心构建方法3.2 高级配置方法3.3 错过触发处理策略4. CronTrigger深度解析4.1 创建CronTrigger的多种方式4.2 CronTrigger属性获取5. 完整实战示例5.1 企业级任务调度系统原创 2025-09-30 08:55:08 · 909 阅读 · 0 评论 -
CronTrigger ( Cron表达式格式 )笔记250930
理解Cron表达式的关键在于掌握。原创 2025-09-30 08:02:50 · 777 阅读 · 0 评论 -
JAVA8之 日期时间时区之 ZoneId[ZoneOffset, ZoneRegion] 笔记
hello原创 2021-04-04 22:59:35 · 35807 阅读 · 1 评论 -
JavaScript笔记之Date之 Date.now()===new Date().getTime()
Date.now 和 new Date().getTime()相同点都是获取1970年1月1日到现在的毫秒数不同点1 . 性能不同一千万次测试Date.now() 用时 0.8 秒new Date().getTime() 用时 1.4 秒2. 调用方式不同now() 是直接调用getTime() 是原型链上的方法性能的差异也体现了调用prototype的损耗...原创 2021-06-27 13:38:55 · 2287 阅读 · 0 评论 -
idea, CreateProcess error=206, 文件名或扩展名太长
现代项目首选:Java 9+ 项目使用参数文件遗留项目方案:使用通配符lib/*简化类路径长期解决方案:创建包含依赖的单一 JAR系统优化:启用 Windows 长路径支持 + 使用符号链接预防措施保持项目路径简短定期清理无用依赖使用模块化设计减少类路径条目关键提示:对于大型企业级项目,类路径参数文件@file) 是官方推荐的最可靠解决方案,完全规避了 Windows 命令行长度限制问题。首选方案:始终优先使用 IDEA 的 “Shorten command line” 选项路径优化。原创 2025-06-25 15:56:09 · 2897 阅读 · 0 评论 -
@WebServlet @WebFilter @WebListener 的用法 笔记250418
作用:将类标记为Servlet,并配置其访问路径。作用:拦截请求/响应,执行预处理或后处理逻辑。作用:监听Web应用生命周期事件(如启动、关闭)或作用域对象(如Session)的变化。使用这些注解可以大大简化 Servlet、过滤器和监听器的配置,提高开发效率。需要注意的是,这些注解在 Servlet 3.0 及更高版本中才支持,如果使用的是较旧的 Servlet 版本,仍然需要在web.xml文件中进行配置。:用于定义 Servlet 并指定其映射路径。@WebFilter。原创 2025-04-19 00:33:50 · 2439 阅读 · 0 评论 -
HttpSessionActivationListener 的用法笔记250417
Session钝化前触发:Session活化后触发定义HttpSessionActivationListener是一个接口,用于监听HttpSession对象在内存中和持久化存储之间的转换。接口方法:当HttpSession对象即将被钝化(即从内存中移除并序列化到硬盘等持久化存储)时调用。:当HttpSession对象从持久化存储重新加载到内存中(即活化)时调用。原创 2025-04-18 00:48:42 · 1209 阅读 · 0 评论 -
Java的Servlet的监听器Listener 笔记250417
监听容器(如 Tomcat)中应用、会话或请求的创建与销毁。监听特定作用域(应用、会话、请求)中的属性增删改操作。监听对象自身在会话中的绑定与解绑事件。其他与会话或异步请求相关的监听器。这些监听器可以通过实现相应的接口来创建,并通过在 文件中配置或使用 注解来注册。Servlet 规范中定义了多种监听器(Listener),用于监听 Web 应用中的不同事件(如应用启动、会话创建、属性变化等)。以下是所有 Servlet 监听器的分类及详细说明:典型场景:初始化数据库连接池、读取全局配置文件。原创 2025-04-18 00:38:24 · 1114 阅读 · 0 评论 -
HttpSessionBindingListener 的用法笔记250417
当某个对象实现了。原创 2025-04-17 23:48:04 · 1044 阅读 · 0 评论 -
HttpSessionAttributeListener 的用法笔记250417
以下是关于用于监听,适用于实时跟踪用户会话数据变化,例如登录状态更新、购物车操作、权限变更等场景。当向会话中添加新属性时触发(如当从会话中移除属性时触发(如当会话中的属性被替换时触发(如重复调用覆盖旧值)。web.xml</</</直接添加类注解,无需额外配置。user.xxxcart.xxx是实时监控会话属性变化的核心工具,适用于用户状态跟踪、动态权限管理及数据一致性维护。重点在于正确处理属性增删改事件、避免递归调用与性能瓶颈,并在分布式环境中确保逻辑的幂等性。结合其他会话监听器(如。原创 2025-04-17 23:27:56 · 1342 阅读 · 0 评论 -
ServletRequestAttributeListener 的用法笔记250417
以下是关于用于监听。适用于跟踪请求处理过程中的属性变化,例如日志记录、请求流程跟踪、动态属性校验等。当向中添加新属性时触发。当从中移除属性时触发。当中的属性被替换时触发(可获取旧值和新值)。web.xml</</</直接添加类注解,无需额外配置(需支持 Servlet 3.0+)。track.xxxaudit.xxx是监控请求级别属性变化的有效工具,适用于流程跟踪、动态校验和性能监控。重点在于合理筛选监听目标、避免性能损耗与递归陷阱,并确保异常安全。原创 2025-04-17 23:14:13 · 772 阅读 · 0 评论 -
ServletContextAttributeListener 的用法笔记250417
以下是关于 的用法详解,涵盖核心方法、实现场景、注意事项及最佳实践,帮助您有效监听应用级别属性(ServletContext)的变化: 用于监听 应用级别属性(ServletContext 中的属性)的增删改事件。适用于跟踪全局配置变更、动态资源加载等场景。当向 中添加新属性时触发。当从 中移除属性时触发。当 中的属性被替换时触发(新旧值均可获取)。步骤 2:注册监听器方式一:通过 配置方式二:使用 注解(Servlet 3.0+)直接在类上添加注解即可。动态配置热更新监原创 2025-04-17 22:54:05 · 743 阅读 · 0 评论 -
HttpSessionListener 的用法笔记250417
以下是关于 的用法详解,涵盖核心方法、实现步骤、典型应用场景及注意事项,帮助您全面掌握会话(Session)生命周期的监听与管理: 用于监听 HTTP 会话(Session)的创建与销毁,适用于跟踪用户会话状态(如在线用户统计)、会话级资源管理(如初始化用户数据)等场景。当新会话(Session)创建时触发(如用户首次访问或调用 )。当会话失效时触发(如超时、调用 或应用关闭)。步骤 2:注册监听器方式一:通过 配置方式二:使用 注解直接在类上添加注解(需支持 Servlet 3原创 2025-04-17 22:33:17 · 1184 阅读 · 0 评论 -
ServletRequestListener 的用法笔记250417
是 Java Servlet 规范中用于监听 HTTP 请求生命周期的接口,可以在请求创建时和销毁时触发自定义逻辑。以下是其核心用法、示例及典型场景:2. 配置监听器方式一:使用 (兼容所有版本)方式二:使用 注解(Servlet 3.0+)直接在类上添加注解即可(如上例)。典型应用场景1. 请求性能监控2. 请求日志记录3. 请求级资源管理注意事项线程安全问题 是单例的,但每个请求的 对象是独立的,需避免在监听器中操作共享变量。性能影响监听器的逻辑应尽量轻量原创 2025-04-17 22:11:28 · 1003 阅读 · 0 评论 -
ServletContextListener 的用法笔记250417
ServletContextListener 是管理 Web 应用全局生命周期任务的强大工具,合理使用可提升资源管理效率和应用可维护性。重点在于正确实现生命周期方法、合理注册监听器,并注意线程安全与异常处理。原创 2025-04-17 21:50:33 · 1590 阅读 · 0 评论 -
Spring的 init-method, @PostConstruct, InitializingBean 对比
这是 JSR - 250 规范定义的注解,需要在 Bean 的方法上添加该注解,此方法就会在 Bean 实例化之后执行。该注解具有较好的可移植性,因为它是 JSR - 250 规范的一部分,在其他支持该规范的容器中也可以使用。都用于在 Bean 实例化之后执行初始化操作,但它们的使用方式、实现机制和应用场景存在差异,下面为你详细对比。都是用来实现 Bean 的初始化逻辑的,但它们的实现方式和适用场景有所不同。综上所述,这三种方式各有优缺点,你可以根据具体的项目需求和场景来选择合适的初始化方式。原创 2025-04-01 03:16:04 · 1589 阅读 · 0 评论 -
Spring的 @Conditional @ConditionalOnProperty 注解 笔记250330
Spring 的 与 注解详解在 Spring 框架中, 和 是用于动态控制 Bean 注册的重要注解。虽然它们都服务于条件化配置,但定位和使用场景有所不同。以下是两者的对比与深度解析: 1. :通用条件控制 核心机制 代码示例 关键特点 2. :基于属性的条件控制 核心机制 代码示例 关键特点 3. 对比与选择 4. 组合使用与进阶技巧 场景 1:原创 2025-03-30 16:14:02 · 1451 阅读 · 0 评论 -
Mybatis的缓存机制 笔记250321
MyBatis 的缓存机制分为一级缓存和二级缓存,旨在减少数据库查询次数,提高性能。以下是详细的机制说明: 一、一级缓存(Local Cache)作用范围缓存失效条件实现原理注意事项 二、二级缓存(Second Level Cache)作用范围配置方式实体类要求:若需缓存对象,对应的 Java 类必须实现 接口。缓存失效条件工作机制注意事项 三、缓存控制禁用缓存强制刷新 四、第三方缓存整合MyBatis 支持通过实现 接口扩展缓存:常用实现配置示例(以 Redis原创 2025-03-20 16:06:37 · 780 阅读 · 0 评论 -
MyBatis 的缓存机制 笔记250320
MyBatis 的缓存机制分为一级缓存和二级缓存,旨在减少数据库查询次数,提高性能。以下是详细的机制说明:作用范围缓存失效条件实现原理注意事项作用范围配置方式实体类要求:若需缓存对象,对应的 Java 类必须实现 接口。缓存失效条件工作机制注意事项禁用缓存强制刷新MyBatis 支持通过实现 接口扩展缓存:常用实现配置示例(以 Redis 为例):五、总结特性一级缓存二级缓存作用范围SqlSession 内Mapper 跨 SqlSession默认开原创 2025-03-20 15:50:37 · 586 阅读 · 0 评论 -
Java使用JDBC连接操作Sqlite 笔记250314
以下是使用 Java JDBC 连接和操作 SQLite 数据库的详细步骤: 1. 添加 SQLite JDBC 驱动在项目中引入 SQLite JDBC 驱动依赖。 2. 连接数据库 3. 创建表 4. 基本 CRUD 操作 插入数据 (Insert) 查询数据 (Select) 更新数据 (Update) 删除数据 (Delete) 5. 事务管理 6. 完整示例 关键注意事项如有具体问题,欢迎继续提问!在Java中使用JDBC连接和操作SQLite数据库是一个常见的原创 2025-03-14 04:37:56 · 3056 阅读 · 0 评论 -
Java的LinkedHashmap设置值取值 与 类的成员变量反射的设置值和取值 的速度对比 笔记250303
反射方面,通过反射访问或修改类的成员变量,尤其是私有变量,涉及到了Java的反射机制。反射方面,通过反射访问或修改类的成员变量,尤其是私有变量,涉及到了Java的反射机制。虽然反射提供了极大的灵活性,但它在性能上通常比直接访问成员变量要慢得多,因为反射涉及到类型检查、安全权限检查以及方法调用的额外开销。设置值与取值的速度和类的成员变量反射的设置值与取值速度的对比,由于具体速度会受到多种因素的影响,包括JVM的实现、硬件环境等,因此无法给出一个绝对准确的对比结果。但是,这种灵活性是以牺牲性能为代价的。原创 2025-03-03 05:12:35 · 1199 阅读 · 0 评论 -
Java的动态代理
Java动态代理是Java提供的一种代理机制,允许在运行时动态生成代理类并为接口创建代理对象[@1@][@3@]。这种代理类能够拦截接口方法的调用,并在调用过程中添加自定义逻辑。Java的动态代理提供了一种灵活的方式来创建代理对象,并且可以在不修改原有代码的基础上扩展或改变行为。虽然JDK原生支持的动态代理只能对接口进行代理,但结合CGLIB等第三方库,我们可以构建出更加健壮和灵活的应用程序架构。无论是开发新的应用还是优化现有系统,理解并掌握动态代理的概念和技术都是非常有价值的。原创 2025-02-25 11:01:37 · 1122 阅读 · 0 评论 -
用xml配置spring, bean标签有哪些属性?
指定Bean是否为抽象类。抽象Bean本身不会被实例化,只能用作父类。原创 2025-02-15 22:39:54 · 746 阅读 · 0 评论 -
Spring的Bean的生命周期 笔记250206
Spring Bean的生命周期可以分为多个阶段,从Bean的定义加载到最终的销毁,每个阶段都有特定的回调和方法执行。以下是详细的步骤说明: 1. Bean定义加载与解析 2. Bean实例化(Instantiation) 3. 属性注入(Population of Properties) 4. Aware接口回调在属性注入后,Spring会调用一系列接口,向Bean注入容器的基础设施对象: 5. BeanPostProcessor前置处理 6. 初始化阶段(Initialization) 7.原创 2025-02-06 10:18:27 · 857 阅读 · 0 评论 -
Spring的AOP的JoinPoint和ProceedingJoinPoint
提供了一种强大的方式来控制和增强目标方法的行为,适用于需要精确控制方法执行流程的场景。与JoinPoint相比,它的主要优势在于能够通过proceed()方法显式地触发目标方法的执行,并能灵活地处理方法的参数和返回值。这使得它成为实现复杂切面逻辑的理想选择,如性能监控、事务管理和缓存等。在Spring框架的面向切面编程(AOP)中,是一个关键的接口,它扩展了JoinPoint接口,并提供了控制目标方法执行流程的能力。以下是关于代表了一个正在执行的连接点,即目标方法执行时的特定点。原创 2025-01-31 00:44:42 · 2183 阅读 · 0 评论 -
Springboot如何使用面向切面编程AOP?
切面类是一个用@Aspect注解标记的类,它包含了切点(pointcut)和通知(advice)。切点:定义了哪些方法将被拦截。通知:定义了拦截到方法时要执行的操作。@Aspect@Component// 定义一个切点,匹配所有com.example.service包下的所有方法// 这是一个空方法,仅用于定义切点表达式// 在方法执行之前执行// 在方法执行之后执行(无论是否抛出异常)// 在方法执行之后执行(仅当方法正常返回时)// 在方法抛出异常时执行。原创 2025-01-30 19:22:18 · 1221 阅读 · 0 评论 -
Springboot使用AOP时,需不需要引入AspectJ?
在Spring Boot中使用AOP时,是否需要引入AspectJ取决于你选择的具体AOP实现方式。在pom.xml(Maven)或</</</Spring AOP会通过动态代理(JDK动态代理或CGLIB)拦截调用createUser</</</</</</</</</</</</</</</</</</</</</</</</</</即使直接通过new在 Spring Boot 应用中使用面向切面编程(AOP)并不强制要求引入 AspectJ,因为 Spring AOP 已经能够满足大多数的应用场景。原创 2025-01-30 19:02:41 · 1746 阅读 · 0 评论 -
Java的StackWalker类
Java 中的类(自 Java 9 引入)提供了一种高效且灵活的方式来访问堆栈跟踪信息。支持通过Option枚举配置行为,例如保留类引用或显示隐藏帧(如 Lambda 表达式生成的帧)。结合 Stream API 过滤或查找特定帧。通过可以获取方法名、类名、行号等详细信息。Optionwalk():在日志中自动记录调用来源。:验证调用链是否符合权限要求。:动态分析程序执行路径。提供了更高效、灵活的方式来访问堆栈跟踪,适用于需要精细控制堆栈信息的场景。通过结合Option。原创 2025-01-30 18:32:29 · 937 阅读 · 0 评论 -
@Inject @Qualifier @Named
/ 实现类 1@Override// 实现类 2@Override@Qualifier。原创 2025-01-30 18:24:15 · 1257 阅读 · 0 评论 -
引入@Inject的依赖包
在 Maven 项目中引入@Inject注解所需的依赖包取决于你所选择的依赖注入框架。确保你添加了正确的框架依赖,并根据需要配置了其他相关的依赖。如果你不确定需要哪些依赖,请查阅所选框架的官方文档。在大多数情况下,只需添加框架的主要依赖(如 Guice 或 Spring Context),@Inject注解就会可用。@Inject。原创 2025-01-30 18:14:35 · 1171 阅读 · 0 评论 -
用 java.security.MessageDigest 生成 md5,sha1,sha256,sha512 到文本文件
使用生成 MD5、SHA-1、SHA-256 和 SHA-512 哈希值,并将这些哈希值写入文本文件,你可以按照以下步骤进行。原创 2024-11-14 19:43:29 · 504 阅读 · 0 评论 -
Spring的核心类: BeanFactory, ApplicationContext 笔记241103
ApplicationContext是BeanFactory的子接口,提供了更多面向应用的功能,如国际化支持、资源访问、事件传播等。原创 2024-11-03 02:59:50 · 1058 阅读 · 0 评论 -
Android的SQLiteOpenHelper类 笔记241027
SQLiteOpenHelper是Android开发中用于管理SQLite数据库的一个非常重要的工具类。原创 2024-10-29 20:15:22 · 1892 阅读 · 0 评论
分享