Java
文章平均质量分 55
费曼乐园
这个作者很懒,什么都没留下…
展开
-
Spring中@Transactional 注解失效
这是因为在同一个类中方法之间的调用是普通的Java方法调用,而不会通过生成的代理对象进行调用,从而绕过了Spring事务管理器的拦截。在Spring中,事务管理是通过AOP代理实现的,Spring会为被。注解标记的方法直接调用另一个方法,而不是通过代理对象调用,Spring的事务管理就会失效。提取到另一个类中,通过Spring容器的依赖注入来调用,确保方法调用经过代理对象。注解标记的方法创建一个代理,以便在方法执行前后管理事务的开始、提交或回滚。当在同一个类中的方法调用时,注解的管理,解决方法是将。原创 2024-04-15 17:55:38 · 336 阅读 · 1 评论 -
Java中业务方法中并发查询然后聚合结果
使用 CountDownLatch 或者类似的工具来等待所有线程执行完毕。:创建一个类来表示每个线程,该线程负责执行一个 SQL 查询并返回结果。将会阻塞直到所有计数器减至零,然后进行继续执行后续代码来汇总执行结果。:在主业务方法中创建并启动多个线程,每个线程执行一个 SQL 查询。来等待所有线程执行完毕。每个线程在执行完 SQL 查询后会调用。:在所有线程执行完毕后,汇总每个线程的查询结果。:首先需要创建一个线程池来管理多个线程的执行。减少计数器,当所有线程执行完毕后,在这个示例中,我们使用。原创 2024-04-12 09:39:16 · 201 阅读 · 0 评论 -
Java中Math.ceil()和 Math.floor()
需要注意的是,这两个方法的参数和返回值都是double类型。如果想要获得整数类型的结果,可以进行适当的类型转换,例如使用强制类型转换将结果转换为int类型。返回小于或等于参数的最大整数。这两个方法都返回的是浮点数。返回大于或等于参数的最小整数,而。是Java中用于取整的数学方法。原创 2023-12-14 16:31:03 · 363 阅读 · 0 评论 -
手机号的模糊化
我们经常会遇到对页面展示的手机号码进行模糊化处理,下面介绍2中Java中对手机号模糊化的方法。第二种方法简单但是有正则表达式不容易理解。第一种方法易于理解,写法复杂些。原创 2023-12-14 10:27:22 · 98 阅读 · 0 评论 -
isBlank和isEmpty的区别
在Java 11中,isEmpty()和isBlank()方法具有不同的行为和用途。原创 2023-12-14 09:55:40 · 210 阅读 · 0 评论 -
为什么需要配置中心
当应用程序需要修改某个配置时,无需重新部署或重启整个应用,只需修改配置中心中的对应配置项,应用程序会自动获取最新的配置。通过配置中心,我们可以集中查看、修改和删除配置,而无需去每个应用程序中逐个修改配置文件。这样可以提高效率,并降低出错的风险。分布式环境适用性:在分布式环境下,配置中心能够方便地为不同的应用程序提供相同的配置。通过统一的配置中心,可以确保多个应用程序使用相同的配置,避免了配置的不一致性,减少了维护成本。将所有配置放在配置中心能够提供更好的配置管理和控制,使得系统更易于维护、扩展和调整。原创 2023-11-27 11:25:00 · 421 阅读 · 0 评论 -
RPC(远程过程调用)
首先,需要定义客户端和服务器之间要调用的接口。这个接口应该是公共的,并且在客户端和服务器端都可见。原创 2023-11-17 15:24:06 · 675 阅读 · 0 评论 -
RESTful(Representational State Transfer)
它是基于HTTP协议的,利用HTTP的各种方法(GET、POST、PUT、DELETE等)来实现对资源的操作。状态转移:RESTful架构遵循状态转移的原则,客户端通过向服务器发送HTTP请求来请求资源,并且服务器发送HTTP响应来返回资源或相关信息。这种状态的转移和迁移是由服务器的响应和客户端的请求触发的。这包括资源的命名和标识符、HTTP方法的使用以及响应的数据格式等。可缓存性:RESTful架构支持对资源的缓存,通过在响应中提供适当的缓存头信息,可以有效地利用缓存提升性能和减少服务器的负载。原创 2023-11-17 14:54:23 · 51 阅读 · 0 评论 -
有HTTP了,为什么还要有RPC
性能和效率:相比HTTP请求,RPC通常具有更低的延迟和更高的性能。这是因为RPC框架通常使用了一些轻量级的、二进制的传输格式,比如Protocol Buffers或MessagePack,从而减少了数据的序列化和反序列化开销。类型安全和编程体验:RPC框架通常提供类型安全的接口定义,通过明确定义请求和响应的数据结构和方法签名,可以在编译阶段进行静态类型检查,避免潜在的错误。而在另一些场景下,RPC调用可能会更适合,特别是需要更高效的数据传输和更严谨的接口定义的情况下。原创 2023-11-16 16:59:18 · 92 阅读 · 0 评论 -
通过注解统计接口调用耗时
在AOP配置文件中,定义一个切面(Aspect),并使用切点表达式匹配包含@Timing注解的方法。切点表达式可以筛选出带有@Timing注解的方法,以便后续对其进行处理。首先,在您的项目中引入一个AOP(面向切面编程)框架,比如Spring AOP或AspectJ。时,TimingAspect中的logExecutionTime方法将会在接口执行前后打印日志,并记录接口调用耗时。在切面中,使用@Around注解的方法中记录方法执行开始时间和结束时间,并计算耗时。原创 2023-11-16 10:59:36 · 237 阅读 · 0 评论 -
Mybatis中的Mapper代理
使用Mapper代理可以方便地调用不同的方法来执行数据库查询、插入、更新和删除操作,MyBatis框架会根据相应的映射文件来生成和执行SQL语句。在MyBatis中,Mapper代理是一种流行的用于执行数据库操作的方式。通过使用Mapper代理,您可以编写接口来定义与数据库交互的方法,并让MyBatis根据接口和映射文件的配置生成相应的实现代码。虽然Mapper代理提供了很大的便利性,但需要确保Mapper接口定义的方法与对应的映射文件或者注解配置保持一致,否则可能会导致运行时错误。原创 2023-07-18 21:30:21 · 136 阅读 · 0 评论 -
Java内存溢出和内存泄露
如果程序长时间运行,就会导致内存耗尽,并最终导致程序崩溃。长生命周期的对象持有短生命周期对象的引用:在某些情况下,一个长生命周期的对象(如单例模式)可能会持有一个短生命周期的对象的引用(如局部变量),导致短生命周期的对象无法被释放。解决内存泄露的方法通常是及时释放不再需要使用的对象和内存空间、避免长生命周期的对象持有短生命周期对象的引用、合理使用缓存、避免循环引用的情况出现等。缓存数据过多:如果程序中缓存了大量的数据,而这些数据并不会在后续的执行中被使用到,那么这些数据就会一直占用内存空间,导致内存泄露。原创 2023-06-08 08:21:43 · 947 阅读 · 0 评论 -
Java连接超时
需要注意的是,从远程服务器读取数据的过程可能涉及到网络延迟、连接超时、数据包丢失等问题,因此需要在代码中进行相应的异常处理和错误处理,以保证程序的稳定性和可靠性。检查网络连接:可以检查本地网络连接是否正常,例如,是否存在防火墙或代理服务器等问题。检查网络连接:可以检查本地网络连接是否正常,例如,是否存在防火墙或代理服务器等问题。检查目标服务器状态:可以检查目标服务器是否正常运行,是否存在过载或其他故障等问题。关闭连接:客户端在完成请求和响应后,需要关闭与远程服务器的连接,释放相关资源。原创 2023-06-06 22:34:10 · 8043 阅读 · 1 评论 -
JavaAgent简介
1. Java应用程序启动时:当Java应用程序启动时,Java虚拟机会扫描所有的Java Agent,并调用每个Java Agent的premain方法。在transform方法中,你可以使用Javassist等字节码操作库,对Java类进行各种形式的转换,例如增加、删除、修改类的字段和方法,添加、删除、修改类的注解等。由于transform方法是在Java类加载期间被调用的,因此它可以对Java类进行较为底层的操作,例如替换类的字节码,实现AOP等功能。premain方法在main方法之前调用。原创 2023-05-26 21:30:00 · 987 阅读 · 1 评论 -
Java类加载
自定义类加载器需要重写findClass()方法,并且遵循双亲委派模型,即首先尝试让父类加载器加载类,如果父类加载器无法加载,则由自定义类加载器加载。只有当所有的父类加载器都无法加载该类时,才会由当前类加载器自己去加载。应用程序类加载器(Application ClassLoader):也称为系统类加载器,它负责加载应用程序classpath下的类,是Java类加载器中最常用的一种。1. 避免重复加载:当一个类已经被加载到内存中后,再次加载同样的类时,双亲委派模型会优先使用已经加载的类,避免了重复加载。原创 2023-05-25 13:15:05 · 173 阅读 · 1 评论 -
Javassist 简介
当我们调用代理对象的myMethod方法时,MyInvocationHandler会在方法前后添加额外的代码,并调用原始对象的myMethod方法。这使我们能够轻松地实现AOP,并在不修改原始类的情况下添加额外的功能。在运行时,Spring使用Javassist库创建代理对象,并使用反射机制将请求参数绑定到代理对象的属性中。在运行时,Spring使用Javassist库创建代理类,并将切面逻辑织入到目标对象的方法调用中。最后,我们使用动态代理调用原始类的方法,并在方法前后添加额外的代码。原创 2023-05-23 21:45:00 · 657 阅读 · 0 评论 -
JDK动态代理和Cglib代理
其中,ClassLoader对象用于指定代理对象的类加载器,Class[]对象用于指定代理对象需要实现的接口,InvocationHandler对象用于指定代理对象的方法调用处理器。调用代理对象方法:通过代理对象来调用目标对象的方法时,Cglib会先判断是否是代理对象自己实现的方法,如果是,则直接调用代理对象自己的方法;方法,生成代理对象。在生成代理对象的过程中,Cglib会动态创建目标对象的子类,并重写目标对象的所有非final方法,在重写的方法中加入了增强代码,以实现对目标对象的代理访问。原创 2023-05-22 22:00:00 · 173 阅读 · 1 评论