自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Apple_Boy的博客

吃苹果的程序员

  • 博客(336)
  • 资源 (1)
  • 收藏
  • 关注

原创 值得你收藏的类加载、初始化、实例化、加载时机,初始化时机...

文章目录类加载机制类加载机制分类、类加载器、双亲委派机制类加载机制分类类加载器双亲委派机制加载.class文件的方式类生命周期类生命周期结束类加载过程JVM初始化步骤类加载时机类初始化时机类的初始化类的实例化平常总是对类的加载,初始化,实例化,类加载机制。。。等等概念容易搞混,这里记录一下!类加载机制虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程就是虚拟机的 类加载机制。类加载机制分类、类加载器、双亲委派机制

2020-08-29 15:20:21 9548 4

原创 不止于方案,用代码示例讲解RabbitMQ顺序消费

关于消息队列(MQ)顺序消费的讨论比比皆是,网上一搜便是铺天盖地的文章。然而,很多文章只是浅谈思路,对于具体的代码实现却往往一笔带过,让许多开发者(包括我)感到一头雾水。所以有时候空谈方案不来点代码理解一下就等于纸上谈兵~根据业务需要,定义多个队列和与之相关的交换机,比如3个队列,那么他们并发度也相比原来的一个队列提升了2倍!注意每个队列定义的时候也要声明为单活模式!// 定义交换机@Bean// 定义多个队列,假设有三个队列@Bean//最主要的区别就是声明了这个队列是单活模式。

2024-09-22 15:13:23 1187

原创 不止于纸上谈兵,用代码案例分析如何确保RabbitMQ消息可靠性?

1.如果消息没有到exchange,则confirm回调,ack=false2.如果消息到达exchange,则confirm回调,ack=true3.exchange到queue成功,则不回调return4.exchange到queue失败,则回调return(需设置mandatory=true,否则不回回调,消息就丢了)Confirm 模式:确保消息成功到达交换机,适用于消息是否被成功接收的确认。性能较好,使用异步确认机制,但需要处理消息未被成功确认的情况。Return 模式。

2024-09-17 13:01:53 1066

原创 深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

DirectExchange 的路由策略是将消息队列绑定到一个 DirectExchange 上,当一条消息到达 DirectExchange 时会被转发到与该条消息 routing key 相同的 Queue 上,例如消息队列名为 “directQueue1”,则 routingkey 为 “directQueue1” 的消息会被该消息队列接收。// Config@Bean@Bean@Bean@Bean@Bean可以发现我们可以根据routingKey控制发送到哪个队列上,

2024-09-07 18:04:56 1273

原创 分布式事务方案比较:选择适合你的分布式事务策略!

P2P金融又叫P2P信贷。其中P2P是 peer-to-peer 或 person-to-person 的简写,意思是:个人对个人。P2P金融指个人与个人间的小额借贷交易,一般需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关交易手 续。借款者可自行发布借款信息,包括金额、利息、还款方式和时间,实现自助式借款;投资者根据借款人发布的信息,自行决定出借金额,实现自助式借贷。目前,国家对P2P行业的监控与规范性控制越来越严格,出台了很多政策来对其专项整治。

2024-08-25 17:55:14 881

原创 MQ最大努力通知VS可靠性消息一致性:分布式事务中的区别与应用比较

最大努力通知方案是分布式事务中对一致性要求最低的一种,适用于一些最终一致性时间敏感度低的业务;消息重复通知机制。消息校对机制。综上所述,只要业务主动方提供了回调查询接口,业务被动方保证接口的幂等性,消息数据是允许丢失的在实现最大努力通知型分布式事务时,最关键的两点是业务主动方提供回调查询接口,业务被动方接收消息通知的接口保证幂等性参考文章:主要整理于黑马分布式事务教程。

2024-08-25 16:09:46 747

原创 消息队列与分布式事务:探讨不同MQ如何实现可靠消息最终一致性

可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件之间,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络通信的不确定性会导致分布式事务问题。

2024-08-17 13:37:15 1106

原创 案例驱动学习:轻松理解TCC分布式事务

TCC是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与Try相反的操作即回滚操作。

2024-08-11 14:43:08 606

原创 图解分布式事务中的2PC与Seata方案

2PC即两阶段提交协议,是将整个事务流程分为两个阶段:准备阶段(Prepare phase)和提交阶段(Commit phase)。2PC中的“2”指的是两个段,“P”指的是准备阶段,“C”指的是提交阶段。故事背景:张三和李四是两个老朋友,他们决定一起出去吃饭。饭店老板的规定是:只有两人都付款,才能出票安排就餐。因此,他们面临一个需要协调的事务,类似于计算机科学中的“两阶段提交协议”。准备阶段: 老板首先向张三要求付款。张三虽然有些不情愿,但还是支付了自己的部分。接着,老板又要求李四付款,李四也付了款。

2024-07-27 22:43:38 767

原创 初探分布式事务:扫盲分布式事务的基础概念和理论知识点

啥叫事务呢?咱举个生活里的例子,你去小商店买东西,“一手交钱,一手交货”这就是个事务的例子。交钱和交货都得成功,这事务才算成了,要是其中有一个没弄好,这事务就得把之前成功的部分都取消掉。搞明白这个例子,咱再来看事务的定义:事务可以当成是一次比较大的活动,它是由好些小活动凑成的,这些小活动要么都成功,要么都失败。

2024-07-21 16:01:09 648

原创 深入剖析多个表left join on的执行步骤原理:实战案例解析与原理探讨

日常工作中写SQL,我们会经常left join一堆表,我最多见过的有20多张的。。。(在一家外企,然后还用了一堆存储过程有几千行的,吐了。。。)那么对于left join on和前面表关联条件的时候,有的时候是紧挨着的表,有的是隔开的,有啥区别呢?具体看看这个SELECT *FROM a上面这种我们更好理解一点,就是一步步的去关联join on紧挨着的前面表,我们来看下面这种有啥区别?

2024-07-13 16:28:12 1843

原创 解锁IDEA中Git/SVN Issue Navigation功能:80%程序员都不懂的秘密武器~

在我们日常开发中,版本控制和问题跟踪是两个至关重要的工具。Git 是最广泛使用的版本控制系统之一,而像 Jira、GitHub Issues 等问题跟踪系统则帮助开发团队管理和跟踪项目中的任务和问题。IntelliJ IDEA 作为一款强大的集成开发环境(IDE),在这两个领域提供了丰富的支持,其中 Git Issue Navigation 功能尤其值得一提,**但是说实话我觉得这个功能80%的开发是不懂的!在网上也基本没搜到相关的文章。

2024-07-02 22:52:06 1177

原创 SQL连接与筛选:解析left join on和where的区别及典型案例分析

left join on后面的条件和where条件的区别到底是什么?还记得在刚工作那会,我就写过2篇针对left join on相关的文章,最近又看了下之前的文章,发现又有了新的体会,注意区分left join on 后面的条件 和where 后面的条件------这篇有点low了测试一下你真的理解数据库左连接了吗?--------这篇说实话可以结合我写的例子看看你自己是否掌握了数据库的left join on左连接。

2024-06-25 20:58:19 2263

原创 深入剖析Java线程池的核心概念与源码解析:从Executors、Executor、execute逐一揭秘

在日常编码中,特别是在处理并发编程时,Java 提供了很多便捷工具帮助我们高效运行。不过你是否也曾被 Executors、Executor 和 execute 这些名字搞得一头雾水?它们长得这么像,究竟有什么区别呢?接下来跟着我一探究竟吧!比较项线程状态线程池状态描述单个线程在其生命周期中所处的状态。线程池在其生命周期中所处的状态。常见状态NEWRUNNABLEBLOCKEDWAITINGTERMINATEDRUNNINGSHUTDOWNSTOPTIDYINGTERMINATED主要用途。

2024-06-01 21:36:47 1334

原创 从用法到源码再到应用场景:全方位了解CompletableFuture及其线程池

JDK中的Future是什么可能大家都知道了,那呢?从英文看单词猜测应该也是和Future是Java 8引入的一个重要特性,它是Future接口的一个实现,但与传统的Future相比,提供了更强大、灵活的异步编程模型。支持非阻塞的链式调用、组合多个异步操作以及更优雅地处理异步计算的结果或异常。它允许你在异步操作完成时执行回调函数,且这些操作可以并行或串行执行,极大地提高了程序的并发能力和响应速度。使用// 创建一个完成的CompletableFuture// 运行异步计算// 异步执行的代码。

2024-05-26 18:56:53 2484

原创 探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)

/设置线程池参数信息//修改拒绝策略为使用当前线程执行//初始化线程池此时运行debug,可以看到不会启动报错,对应的线程池参数也是我们自定义的了注意当我们上面自定义了线程池疑惑,@Sync对应的线程池也是我们自定义的这个,不会再采用默认的SimpleAsyncTaskExecutor核心线程数:线程池中始终活跃的线程数量。最大线程数:线程池能够容纳同时执行的最大线程数量。

2024-05-22 21:56:40 1882

原创 你是否傻傻分不清SpringBoot默认线程池和内置Tomcat线程池?

在Java应用程序中,线程池是一种用于管理和重用线程的机制。线程池可以显著提高多线程应用程序的性能,避免不必要的线程创建和销毁开销,同时有效控制并发线程数量,防止系统资源被耗尽。对于SpringBoot程序,我们知道它是会有一个内置的Tomcat,但是我自己之前一直对于SpringBoot默认线程池和SpringBoot内置Tomcat线程池概念不是很清晰,很容易混淆,甚至以为它们就是一个东西,经过这次深入了解以后,发现两个完全是不同的东西,接下来跟我一起探索吧~我们可以通过在应用的配置文件(如或。

2024-05-12 23:27:55 3310

原创 全网最全解析!Spring与非Spring环境下获取动态代理对象的原始目标对象

为什么这个userSerivce代理对象里面又是一个CGLIB$CALLBACK_0变量???为什么这个userMapper代理对象里面是一个h变量???关于这个问题的话,我在之前的文章中其实已经讲到了,这里面涉及到了两种动态代理的原理,可以看我之前文章深入探索JDK动态代理:从入门到原理的全面解析探索Cglib:解析动态代理的神奇之处今天我们不讨论这个问题,我们讨论另外一个问题,如何获取这两种动态代理对象里面的原始目标对象???

2024-04-01 20:59:31 1971

原创 深入探索JDK动态代理:从入门到原理的全面解析

为了调试目的,我们要查看或修改这些动态生成的代理类,正常我们还需要反编译工具(比如JD-GUI或JAD)来查看生成的类的源代码,但是我们不用那么麻烦,直接用IDEA打开即可。在标准的Java JDK实现中,生成的动态代理类(字节码)默认是在内存中动态生成并直接加载的,不会写入磁盘成为文件。现在,我们可以编写一个测试类来验证动态代理的使用,这个例子中,我们通过动态代理实现了一个代理对象,当调用代理对象的方法时,会先执行。添加了这个系统属性后,当创建动态代理实例的时候,JVM会将生成的代理类以。

2024-03-24 21:20:42 2124

原创 简单!实用!易懂!:Java如何批量导出微信收藏夹链接-->转换成Markdown/txt

如果手动一个个导的话非常麻烦,操作步骤如下:2、提取链接:使用鼠标右键点击链接,然后选择“复制地址”3、导出链接:将复制的链接地址粘贴到一个文本文件中,每个链接一行。4、为每个链接进行命名:从微信复制出来的链接,没有名字只有单纯的URL链接,你都不知道这个链接是什么,很不友好,所以还得打开链接,复制标题,类似这样的格式近日择机发射!!!

2024-03-17 18:50:18 1450

原创 探索Cglib:解析动态代理的神奇之处

CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供方法的interception(拦截)。

2024-03-09 19:18:37 882

原创 源码透析MapperScannerRegistrar和MapperScannerConfigurer的区别及作用

在使用Spring Boot和MyBatis整合的时候,我们经常会看到@MapperScan这个注解,它的作用是扫描指定包下的Mapper接口,并将它们注册到Spring容器中,这样我们就可以在Service层或者Controller层直接注入Mapper接口的实例,而不需要写DAO层的实现类。那么,@MapperScan这个注解是如何实现这个功能的呢?它背后涉及到了两个重要的类:MapperScannerRegistrar和MapperScannerConfigurer,它们之间有什么区别和联系呢?

2024-01-21 18:04:17 1285

原创 带你拿捏SpringBoot自动装配的核心技术?模块装配(@EnableXXX注解+@Import)+ 条件装配(@ConditionalXXX)

之前文章我们完整的学习了模块装配的核心使用方法,通过模块装配,咱可以通过一个注解,一次性导入指定场景中需要的组件和配置。使用的时候就只需要传入对应的.class即可,原来的是直接传入Condition接口的实现类,现在这个ConditionalOnBean注解相当于封装了一层。等重要对象信息,根据这些对象就可以获取和检查spring容器初始化时所包含的所有信息,再结合业务需求,就可以实现组件注册时的自定义条件判断。根据条件的不同,这个自动配置类可能会在Spring容器中自动配置一些与JPA相关的Bean。

2024-01-14 15:49:52 1138

原创 @EnableXXX注解+@Import轻松实现SpringBoot的模块装配

最早我们开始学习或接触过 SSH 或者 SSM 的框架整合,大家应该还记得那些配置文件有多烦吧,又多又不好记真的很让人头大。在处理配置文件的同时,大家是否有想过:如果能有一种方式,可以使用很少的配置,甚至不配置就可以完成一个功能的装载,那岂不是省了很多事?这个疑问在 SpringBoot 中得以解决,也就是我们常说的自动装配,而这个自动装配的核心技术就是模块装配 + 条件装配。今天我们这里主要讲解模块装配,条件装配我们后续再讲解!

2024-01-02 20:04:42 1909 1

原创 Mybatis分页插件之PageHelper生效and失效原理解析

PageHelper是一个优秀的Mybatis分页插件,它可以帮助我们自动完成分页查询的工作。它的使用非常简单,只需要在查询之前调用PageHelper.startPage方法,传入页码和每页大小,就可以实现分页效果。PageHelper还提供了很多其他的配置和功能,例如排序、合理化、分页参数映射等。那么,PageHelper是如何实现分页功能的呢?本文将从源码的角度,一步步分析PageHelper的实现原理,希望能够对大家有所帮助。对指定mapper查询支持分页,前面一定要有。

2023-12-30 23:25:54 1883

原创 构建自己的拦截器:深入理解MyBatis的拦截机制

Mybatis拦截器并不是每个对象里面的方法都可以被拦截的。Mybatis拦截器只能拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler四个类里面的方法,这四个对象在创建的时候才会创建代理。Mybatis拦截器是Mybatis提供的一种插件功能,它允许你在已映射语句执行过程中的某一点进行拦截调用。

2023-12-24 23:36:21 1771

原创 Mybatis-Spring整合原理:MapperFactoryBean和MapperScannerConfigurer的区别及源码剖析

1.是一个包扫描的配置类,其中属性是必需的,多个包时可以使用逗号隔开。二选一即可。如果都选了那么根据引用的创建的SqlSession会被覆盖掉。如果两个都没配置,将会根据类型自动装配,这种方式适合应用程序中只有一个或者的bean存在。其它配置就不总结了。2. 具体实现扫描以及注册接口的功能被委托给类了。具体做法就是将Spring扫描接口后生成的修改成一个表示的,而是一个实现的特殊bean,相当于返回Mapper接口实例的工厂。具体返回接口实例的原理是MyBatis本身的接口绑定功能,底层其实是动态代理。

2023-12-16 23:18:00 1542

原创 Mybatis与Spring结合深探——MapperFactoryBean的奥秘

在没有Spring单独使用Mybatis的时候,我在之前的文章超硬核解析Mybatis动态代理原理!只有接口没实现也能跑?讲解到了调用链路在SqlSessionFactoryBuilder().build方法 中最终调用Configuration对象的addMappper()方法(实际上是委托给MapperRegistry的addMapper)添加对应的MapperProxyFactory代理工厂类,最终通过这个工厂类生成对应的代理对象MapperProxy。

2023-12-10 23:57:07 1669

原创 超硬核解析Mybatis动态代理原理!只有接口没实现也能跑?

提到MyBatis,很多人可能已经使用过,MyBatis中的mapper接口实际上并没有对应的实现类,它的功能通过一个对应的xml配置文件来实现。这意味着当我们调用一个mapper接口时,我们实际上是在执行xml文件中定义的SQL语句来操作数据。那么Mybatis的mapper为啥只有接口没有实现类,它却能工作?答案很简单,动态代理,但是要真正理解这个动态代理的整个过程,还是有点费劲的,没事,接下来我们一步步解析。Mybatis的动态代理工作原理概括步骤如下:Mapper接口与XML的关联。

2023-12-03 22:40:23 2866 1

原创 究竟FactoryBean是什么?深入理解Spring的工厂神器

在Spring框架中,bean的创建通常交由Spring IoC容器负责,它提供了丰富的方式来创建和管理bean的生命周期。在众多的功能中,以一种特别的方式出现,不仅让我们能够控制bean的创建过程,还使得更复杂的初始化逻辑变得简洁清晰。接下来,让我们 一步步地走进的世界,并通过案例解析来透彻理解它在Spring应用中的使用。是Spring提供的一种特殊的bean,使用它可以生成某些需要复杂初始化过程的bean对象。当配置某个bean实现了接口时,该bean返回的对象不是本身,而是。

2023-11-26 19:18:40 2539

原创 解析Spring Boot中的CommandLineRunner和ApplicationRunner:用法、区别和适用场景详解

在Spring Boot应用程序中,CommandLineRunner和ApplicationRunner是两个重要的接口,它们允许我们在应用程序启动后执行一些初始化任务。本文将介绍CommandLineRunner和ApplicationRunner的区别,并提供代码示例和使用场景,让我们更好地理解和使用这两个接口。

2023-11-19 13:50:10 3913

原创 异步编程工具Promise与Async/Await:解决前端开发中的嵌套回调地狱

如果数组中的所有Promise对象都变为fulfilled(已成功)状态,那么Promise.all返回的Promise对象也会变为fulfilled状态,其结果是一个数组,包含了数组中的所有Promise对象的结果。Promise.all是一个静态方法,它可以接收一个Promise对象的数组作为参数,返回一个新的Promise对象,该对象的状态和结果取决于数组中的所有Promise对象的状态和结果。使用Promise进行异步编程时,可以将多个Promise对象链接在一起,形成一个Promise链。

2023-11-12 18:42:42 534

原创 定时任务场景下的代码审查:continue和return的滥用可能引发潜在bug

在最近的代码审查中,有帮忙审查了组里一个刚毕业1年不到的应届生,发现他写的其中一段代码将for循环中的break、continue、return滥用,导致了一个潜在的bug风险,这个风险后文我们再来分析。continue关键字的作用是跳过当前的迭代,继续执行下一次的迭代。它可以用来跳过某些不需要执行的情况,或者优化循环的效率。break关键字的作用是结束当前的循环,跳出循环体。它可以用来提前终止循环,或者跳出嵌套的循环。return关键字的作用是结束当前的方法,并返回一个值(如果有的话)。

2023-11-04 17:22:17 292

原创 面试官:听说你很了解Java8特性,给我优化一下这段代码吧?

在之前的一次面试过程中,我被问到了一道代码优化题:对于下面的代码,你有什么优化的思路呢?

2023-10-24 21:12:19 202

原创 SpringBoot +JdbcTemplate+VUE 实现在线输入SQL语句返回数据库结果

想起来要做这个功能是因为我们公司的预生产环境和生产环境如果想要连接数据库都需要登录堡垒机,然后再通过堡垒机进行跳转到对应定制的Navicat 连接工具进行查询。每次这个过程十分繁琐,所以就想直接在我们的系统上直接做个口子,登录以后,可以直接输入SQL查询,跟直接连接Navitcat效果是一样的。

2023-10-22 18:59:25 1426 6

原创 每天debug/run一键启动的Spring Boot控制台启动日志,你了解过吗?

每次打开Idea点击debug/run启动SpringBoot项目时,都在坐等启动成功的最后一行日志,然而对于启动过程中,控制台里面的每一行日志代表什么?你可能从来没去管他!是的,曾经我也是这样的,然而今天对此引起了我的好奇心。。。接下来,随着跟我一探究竟Spring Boot启动日志的真相!......启动日志可以分为两部分1、JDK执行Spring Boot应用的启动命令2、Spring Boot本身启动时的日志。

2023-10-15 16:57:34 531

原创 Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

刚工作那会,最常见的报错是,曾经也碰到过前端反馈或者,那时候傻傻的搞不懂,以为这种都是外部服务或者网络运维部那边的问题。当时那个服务里正好有个调用日志,平时会记录各种200,4xx状态码的信息。于是我跑到服务日志里去搜索了一下502这个数字,毫无发现。于是跟反映错误的前端说,“服务日志里并没有502的记录,你是不是搞错啦?现在想想,果然那时候还是个小白。。。在Nginx中,access.log和error.log是两个重要的日志文件,用于记录服务器的访问和错误信息。

2023-10-04 23:21:59 4674 1

原创 Spring事务this自调用的理解误区?真的会让事务失效吗?

我们经常谈到Spring事务失效会有多种场景导致:可参考我另外一篇文章一文清晰讲解@Transactional 注解失效场景@Transactional 应用在非 public 修饰的方法上@Transactional 注解属性 propagation 设置错误@Transactional 注解属性 rollbackFor 设置错误同一个类中方法调用,导致@Transactional失效异常被你的 catch“吃了”导致@Transactional失效数据库引擎不支持事务。

2023-09-27 00:25:38 3827

原创 从零开始的 MyBatis 拦截器之旅:实战经验分享

Configuration:初始化基础配置,比如MyBatis的别名等,一些重要的类型对象,如插件,映射器,ObjectFactory和typeHandler对象,MyBatis所有的配置信息都维持在Configuration对象之中。SqlSessionFactory:SqlSession工厂。SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要的数据库增删改查功能。

2023-09-22 23:02:31 832

原创 深入探究Spring Boot自动配置原理及SPI机制:实现灵活的插件化开发

在传统的Spring应用程序中,我们需要手动配置各种组件、依赖和属性,以满足应用程序的需求。这通常涉及编写大量的XML配置文件或Java配置类,并进行复杂的依赖注入和组件装配。这种手动配置过程可能非常繁琐且容易出错。而Spring Boot的自动配置机制通过约定大于配置的原则,基于应用程序的依赖和配置信息,自动推断和配置应用程序所需的各种组件。它通过提供默认的配置和装配规则,减少了我们的工作量,使得我们可以更专注于业务逻辑的开发。接下来就讲解一下自动配置的原理实现。

2023-09-17 20:44:40 789

Java版俄罗斯方块(源码+exe/无需安装环境+带音乐+超好看UI)

Java版本百分百可直接运行exe文件+源码,不用安装java任何环境!!带音乐+超好看UI!! 博客链接:https://blog.csdn.net/belongtocode/article/details/105979473

2020-05-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除