
JAVA核心技术
文章平均质量分 73
Java开发基础及核心技术知识的学习与积累
Andya_net
公众号:CodingTechWork
觉得为时已晚的时候,恰恰是最早的时候。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
SpringBoot | 越权和数据权限控制的一种实现方案
首先,我们需要定义一个自定义的注解,这个注解会包含操作类型(CRUD)、资产ID和资产名称作为入参。@Target(ElementType.METHOD) // 该注解作用于方法@Retention(RetentionPolicy.RUNTIME) // 运行时生效// 操作类型,默认为 READ// 资产 ID// 资产名称通过以上的实现,我们使用了自定义注解、切面编程和用户权限服务的组合来对方法进行权限控制,确保只读用户无法进行修改操作,同时判断其他用户是否有权限访问特定的资产。原创 2025-06-24 18:35:53 · 498 阅读 · 0 评论 -
Spring | JDK 动态代理与 CGLIB 代理:原理、区别与实战对比
本文对比了Java中两种动态代理技术——JDK动态代理和CGLIB代理。JDK动态代理基于反射机制,要求目标类必须实现接口,使用Proxy类和InvocationHandler创建代理。CGLIB通过字节码生成目标类的子类,无需接口但无法代理final类,使用Enhancer和MethodInterceptor实现。性能上,JDK代理初始化快,适合方法调用少的场景;CGLIB调用性能更好,适合方法调用多的情况。建议根据实际需求选择:有接口优先用JDK代理,无接口或需代理非接口方法则用CGLIB。原创 2025-06-11 14:09:28 · 781 阅读 · 0 评论 -
Spring | 深入解析 Spring AOP 中的AopProxyUtils.ultimateTargetClass()解决代理对象注解获取问题
摘要本文探讨了Spring AOP代理对象无法获取目标类注解的问题及解决方案。当使用JDK动态代理或CGLIB代理时,直接通过代理对象获取类注解可能失效。通过分析问题现象,文章提出使用AopProxyUtils.ultimateTargetClass()方法穿透代理层,获取最终目标类类对象,从而正确读取类级别注解。该方法通过递归检查代理链实现目标类定位,并结合源码分析其实现原理。实测验证该方案可有效解决代理场景下的注解获取问题,为Spring AOP开发提供了实用技巧。原创 2025-06-11 14:03:26 · 1099 阅读 · 0 评论 -
Redis | 使用 Redisson的RMapCache实现用户消息定时自动发送功能
本文介绍了如何通过 Redisson 实现基于 Redis 缓存过期事件的消息自动推送机制,并且通过Date类型入参来设定消息过期时间。通过 Redis 的过期事件通知,我们可以高效地管理缓存和触发自动操作,从而减少系统的复杂度并提高响应速度。这种方式特别适用于消息通知、定时提醒等场景。在实际应用中,可以根据需求集成不同的消息推送方式(如邮件、短信、微信等),实现更加灵活的业务逻辑。原创 2025-04-26 07:49:04 · 722 阅读 · 0 评论 -
SpringBoot | 构建客户树及其关联关系的设计思路和实践Demo
客户树是一种层级结构,用于表示客户之间的上下级关系。每个客户可以有多个子客户,而每个子客户又可以有自己的子客户,形成一个树状结构。企业与子公司:表示企业集团的层级结构。经销商与下级经销商:表示销售渠道的层级关系。客户与联系人:表示客户内部的组织架构。层级性:每个客户都有一个层级,顶级客户为第1层,其子客户为第2层,依此类推。递归性:客户树的结构是递归的,每个子客户可以有自己的子客户。关联性:客户之间通过父子关系关联。原创 2025-04-24 22:53:16 · 1201 阅读 · 0 评论 -
Java | 深拷贝与浅拷贝工具类解析和自定义实现
浅拷贝:只复制对象的直接字段,对于引用类型字段,复制的是引用而不是对象本身。深拷贝:递归复制对象的所有字段,包括引用类型字段所指向的对象。原创 2025-04-23 23:22:27 · 1095 阅读 · 0 评论 -
Java | 基于自定义注解与AOP切面实现数据权限管控的思路和实践
在企业级应用中,数据权限控制是一个常见的需求。本文将通过一个完整的示例,展示如何使用自定义注解和AOP切面在Spring Boot项目中实现数据权限管控,以商品实例列表查询为例,根据用户角色动态过滤数据。同时,我们将提供完整的表结构和数据插入脚本,以便更好地理解和测试。原创 2025-04-23 23:09:26 · 665 阅读 · 0 评论 -
Spring | 基于 Spring Pipeline管道、上下文与路由表实现业务流程串联
管道模式是一种行为设计模式,它将复杂的任务分解为一系列独立的处理步骤(Stage),每个步骤被称为一个阶段。这些阶段通过管道(Pipeline)连接在一起,数据依次通过各个阶段进行处理,最终完成整个任务。低耦合:每个阶段都是独立的,可以独立开发和测试,减少了模块之间的依赖关系。高扩展性:可以方便地添加或删除阶段,而不需要修改其他代码。易于维护:每个阶段的职责单一,代码清晰易懂,便于维护和调试。首先,我们定义一个通用的阶段接口Stage,它包含一个方法process,用于处理数据。原创 2025-04-17 09:05:09 · 730 阅读 · 0 评论 -
Java | 基于 ThreadLocal 实现多客户端访问设备的 REST 请求下发
ThreadLocal 是 Java 提供的一种线程局部变量存储机制。它为每个线程提供了一个独立的变量副本,使得每个线程都可以独立地访问和修改自己的变量副本,而不会相互干扰。这种机制非常适合处理多线程环境下的上下文信息传递问题。创建一个 Device 类,用于存储设备的 IP 和端口信息。return ip;本文介绍了如何使用 ThreadLocal 实现多客户端访问设备的 REST 请求下发。原创 2025-03-28 09:58:49 · 605 阅读 · 0 评论 -
SpringBoot | 解决 Feign 客户端方法参数过多的问题:Method has too many Body parameters
通过明确地使用和注解,我们可以避免 Feign 客户端方法参数过多的问题。此外,开启 Feign 日志可以帮助我们更好地调试和排查问题。在实际开发中,我们还需要注意 Feign 客户端方法签名与服务端接口的一致性,以确保通信的正确性。原创 2025-03-20 15:49:23 · 687 阅读 · 0 评论 -
Java | RESTful 接口规范
REST(Representational State Transfer,表现层状态转移)是一种基于 HTTP 协议的软件架构风格,由在他的博士论文中提出。RESTful 接口是基于 REST 原则构建的 Web 服务接口,通过统一的资源标识符(URI)和标准的 HTTP 方法(如等)来实现资源的访问和操作。原创 2025-02-09 23:00:32 · 1149 阅读 · 0 评论 -
Java | 基于注解的代码生成工具MapStruct映射使用详解
在 Java 开发中,我们经常需要在不同的 Java Bean 之间进行数据映射,比如从实体类(Entity)到数据传输对象(DTO)的转换。传统的做法是手动编写大量的 setter 和 getter 方法来完成属性的赋值,这种方式不仅繁琐,而且容易出错。MapStruct 作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案。它在编译时自动生成映射代码,避免了运行时反射带来的性能开销,同时保证了类型安全。原创 2025-02-09 12:05:24 · 1196 阅读 · 0 评论 -
Java | DTO 与 Entity 之间拷贝转换的几种方法
如果项目中对性能要求较高,且字段映射规则较为固定,可以自定义工具类来实现字段拷贝。在实际开发中,选择哪种方式取决于项目需求和团队的技术栈。如果项目对性能要求较高,推荐使用MapStruct或自定义工具类;如果项目对开发效率要求较高,推荐使用或BeanUtils。原创 2025-02-08 08:58:16 · 887 阅读 · 0 评论 -
Java | CompletableFuture详解
是Java 8引入的一个非常强大的类,属于包。它是用于异步编程的一个工具,可以帮助我们更方便地处理并发任务。与传统的线程池或Future对比,提供了更多灵活性和组合功能,使得异步编程更加简单和易于维护。主要用于异步操作和组合多个异步任务。它可以通过执行非阻塞的操作来避免阻塞主线程,从而提高程序的性能和响应速度。实现了Future和接口。需要编排多个异步操作的场景实现非阻塞的响应式系统需要精细控制任务执行顺序和依赖关系构建高并发、低延迟的服务。原创 2025-02-03 21:27:50 · 993 阅读 · 0 评论 -
JAVA | 状态机基本原理介绍并模拟实现“在线订单系统”
状态机是一种用于描述系统行为的数学模型,它由一组状态、转移事件以及根据当前状态进行的动作组成。状态机可以用图论来表示,其中每个状态都是图中的一个节点,状态之间的转换则由边连接。首先,我们定义订单的各种状态和触发状态转移的事件。PENDING,//待付款SHIPPED,//待发货DELIVERED,//已发货COMPLETED,//已完成CANCELLED//已取消PAY,//支付订单CANCEL,//取消订单SHIP,//发货DELIVER,//完成发货。原创 2025-01-09 16:50:30 · 1409 阅读 · 0 评论 -
SpringBoot | 基于MyBatis-Plus实现Lambda Query查询
对于一些需要自定义SQL的场景,可以直接使用@Select或@Update注解来编写SQL。提供了极为丰富的查询功能,通过简洁的API和灵活的查询构造器,可以非常方便地进行数据库查询操作。普通查询:通过方法可以快速进行数据查询。Lambda查询:通过构建条件查询,避免硬编码字段名,提高代码可维护性。和提供了多种条件构建方式,支持链式调用。提供了内置的分页支持,可以轻松进行分页查询。聚合查询:支持常见的聚合操作,如等。原创 2025-01-09 09:02:41 · 1821 阅读 · 0 评论 -
SpringBoot | 基于 MyBatis 的分页与模糊查询的开发模板
SpringBoot|基于MyBatis的分页与模糊查询的开发模板原创 2025-01-07 22:15:03 · 1029 阅读 · 0 评论 -
SpringBoot | @Autowired 和 @Resource 的区别及原理分析
Autowired是Spring框架提供的注解,旨在实现自动注入依赖。它通常用于自动装配Bean时,通过Spring容器找到匹配的Bean,并将其注入到标注了@Autowired的字段、构造方法或Setter方法中。@Resource是Java的标准注解(JSR-250规范),在Spring中也得到了支持。它的作用是实现依赖注入,主要通过名称来进行自动装配,如果找不到与名称匹配的Bean,则通过类型来进行匹配。原创 2025-01-07 21:30:30 · 1162 阅读 · 0 评论 -
JAVA | 通过自定义注解与AOP防止接口重复提交
为了简化防重逻辑的实现,我们首先定义了一个名为@Resubmit的自定义注解,它用于标记那些需要防止重复调用的方法。keyPrefix():指定生成防重Key的前缀规则。key():允许开发者自定义Key值,或者从请求参数中动态获取。limitation():设定两次相同请求之间最短时间间隔,单位为秒。timeout():设置最长限制时间,以避免由于系统原因导致无法再次调用的问题,默认300秒。/**原创 2025-01-07 14:14:10 · 1497 阅读 · 0 评论 -
Java | 注解和反射的介绍及结合使用
注解是一种特殊的标记,它可以添加在类、方法、变量等地方,供编译器或运行时工具使用。Java中的注解并不会直接影响程序的逻辑,它们本身只是一些元数据。代码生成:在编译时自动生成代码或文档。配置管理:通过注解来管理配置,替代传统的XML配置文件。框架控制:许多框架(如Spring、Hibernate)都依赖于注解来简化开发,减少冗余代码。注解的定义使用@interface关键字,常见的注解包括@Override等。原创 2025-01-05 23:38:19 · 917 阅读 · 0 评论 -
Java | 使用Java Mail发送邮箱
在一些业务功能中,发送邮件是必须的,比如告警通知、日报、月报等信息推送,都需要通过邮件服务器来发送邮件。原创 2024-04-07 11:19:21 · 569 阅读 · 0 评论 -
Java | 数据一致性校验遇到的时间序列化格式不一致问题如何解决?
在开发过程中,有数据一致性校验需求。方法进行时间格式的统一准换。进行序列化时,我们可以使用。原创 2023-11-30 22:32:27 · 490 阅读 · 0 评论 -
Java | 多线程并发编程CountDownLatch实践
在并发编程过程中,如何让多个线程之间协调执行任务,如主线程等所有其他异步线程执行完毕后再继续执行下面的步骤,如何做到?我们可以考虑使用。主要是起到线程之间的同步协调作用,而不是互斥。它可以让一个线程等待其他线程完成任务后,再继续执行自己的任务。是一个同步工具类,主要应用于多线程编程场景中,可以用于控制等待线程的执行,或者说是协调多个线程之间的同步。用好这个工具类,主要关注这个工具类的初始计数值的设置、方法、await()方法即可实现编程。原创 2023-11-25 12:10:44 · 323 阅读 · 0 评论 -
SpringBoot | @EnableAutoConfiguration注解介绍
SpringBoot | @EnableAutoConfiguration注解介绍。原创 2023-11-12 17:50:17 · 284 阅读 · 0 评论 -
SpringBoot |引用外部jar包中的类方式
在本工程中引入外部jar包的类进行反射获取,如何获取?原创 2023-11-12 17:39:05 · 494 阅读 · 0 评论 -
Java | 使用ServerSocket查找TCP可用端口
在项目开发中,有一个程序是专门给服务下发tcp端口占用的,但是tcp端口有时候会被其他服务给占用,此时端口就会冲突。本文提供一个工具类进行端口占用判断并返回可用端口。查找当前服务器被占用的tcp端口,如查看到64661端口被占用,运行上述main函数。原创 2023-08-21 11:21:38 · 737 阅读 · 0 评论 -
SpringBoot | RestTemplate异常处理器ErrorHandler使用详解
异常处理器功能描述异常处理器接口,是restTemplate所有异常处理器的实现接口默认的异常处理器,处理客户端和服务端异常将HTTP错误响应转换RestClientException不处理异常/*** 继承默认错误处理器DefaultResponseErrorHandler,无需关注hasError和handlerError方法*/@Component/*** my service进行定制化处理*/@Autowired@Override=302;@Override。原创 2023-08-17 23:10:27 · 1558 阅读 · 0 评论 -
Java | 使用切面AOP拦截并修改Controller接口请求参数
在开发过程中,会有一些需求将controller层的一些方法入参进行全量转换,最容易想到的可能是在调用下层service方法时,调用公共的方法进行入参转换,这时带来的唯一问题就是代码不雅观,比较冗余。那还有什么方法可以更优雅的解决这个问题吗?答案是有的:切面。我们实现一个AOP切面程序,对入参中的需转换的参数进行专项转换,而无需在各个controller层的各个方法中进行转换处理。原创 2023-06-29 09:12:00 · 6985 阅读 · 0 评论 -
Java | 反射调用类和方法时依赖注入失效问题排查与解决
在开发过程中,使用反射进行类的方法调用时,遇到了依赖注入问题,通过demo进行问题复现和还原并记录。原创 2023-06-27 13:48:39 · 1458 阅读 · 0 评论 -
Java | 枚举Enum中使用反射转换属性值
在开发过程中,有时候需要需要根据各个枚举类中一个字段属性值转为另一个字段属性值,如根据code转为name的需求进行前端展示。本文总结一下如何通过反射简单巧妙的进行枚举属性值的互相映射。原创 2023-06-27 13:48:21 · 740 阅读 · 0 评论 -
SpringBoot——SpringBoot服务启动过程源码详解剖析!
SpringBoot服务启动流程源码剖析!不服来战!原创 2023-06-13 14:49:54 · 1715 阅读 · 0 评论 -
RPC——RPC协议介绍及原理详解
RPC(Remote Procedure Call Protocol) 远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。RPC主要作用就是不同的服务间方法调用就像本地调用一样便捷。序列化:将消息对象转换为二进制流。反序列化:将二进制流转换为消息对象。原创 2023-06-11 12:10:52 · 38450 阅读 · 0 评论 -
SpringBoot——MyBatis-Plus源码分析及开发实践详解
在上一家公司一直使用,它是对基于JPA的数据访问层的增强支持,底层使用框架,支持使用原生L或查询语言。是基于的,它把代码和分离,即在代码和之间增加了新的一层,从而间接操作,大家可能觉得这个学习成本比较高,但其实也还好,都用不到文件等。 而在新的公司,使用的是,面向基于的模式,复杂的需要通过写文件来操作可能更直观友好,当结合就原地起飞了。本文主要总结使用的一些实践经验及源码分析。 是的增强工具,可以简化开发,提高我们的开发效率。原创 2023-04-25 14:22:56 · 1754 阅读 · 0 评论 -
SpringBoot——邮箱地址列表过滤出合法地址列表
SpringBoot——邮箱地址列表过滤出合法地址列表。原创 2023-04-23 14:38:09 · 283 阅读 · 1 评论 -
SpringBoot——@ConditionalOnProperty和@ConditionalOnProperty注解的详解和使用
在SpringBoot中可以通过该注解来控制是否生效。同时,我们可以通过该注解判断一个property属性,是否符合我们设定的配置值,符合则使该注解修饰的类或方法生效,否则不生效。该注解是的扩展注解。上述讲解的只能精准的匹配中的值进行控制,无法根据更多的属性值进行匹配(即使它有数组的value值,也只能配合进行与校验)我们可以通过注解进行其他属性值的表达式来校验。是执行Spel表达式,根据返回的布尔值判断是否符合条件。本来只想用用,用完更爽一些!原创 2023-04-17 16:27:25 · 1884 阅读 · 0 评论 -
SpringBoot——单元测试实践总结
mock是指在测试过程中,创建一个虚拟的对象来模拟指定对象的行为。PowerMock时一个Java单测模拟的框架,扩展了EasyMock和Mockito框架。PowerMock通过提供定制的类以及一些字节码篡改技巧进行模拟。PowerMock可模拟静态方法、私有方法、构造方法、final方法等。PowerMock支持JUnit和TestNG。原创 2023-04-16 20:06:07 · 2333 阅读 · 4 评论 -
SpringBoot——使用ThreadLocal解决类成员变量并发线程安全问题!
换句话说,就是当前线程变量,它是一个本地线程变量,其填充的是当前线程的变量,这个变量对于其他线程来说都是封闭且隔离的。如何实现变量隔离这一功能?可以为每个线程创建一个自有副本,每个线程可以访问自己内部的副本变量来达到隔离效果,从而解决共享变量的线程安全问题。变量是线程内部的局部变量,在不同的线程Thread中有不同的副本,副本只能由当前Thread使用,不存在多线程共享问题。一般由修饰,线程结束时,可回收掉副本。使用注解,解决Bean的多例问题,替代性的解决多线程类成员变量共享问题。原创 2023-04-14 09:44:31 · 3872 阅读 · 0 评论 -
SpringBoot——结合nacos实现动态刷新自定义线程池
1. 实现自定义线程池2. 实现线程池参数动态刷新原创 2023-04-07 17:31:11 · 401 阅读 · 0 评论 -
设计模式—策略模式的设计与使用
针对一组算法,将每一个算法封装到具有共同接口的独立类中,也就是给出一个接口或者抽象类A(类似于规范),其他类B、C、D实现或者继承A进行具体算法或行为的描述。原创 2022-11-01 15:00:47 · 215 阅读 · 0 评论 -
Java—通过sign签名认证实现安全的开放接口API
Java—通过sign签名认证实现安全的开放接口API原创 2022-08-11 19:33:48 · 2921 阅读 · 0 评论