- 博客(134)
- 收藏
- 关注
原创 麻了,不要再动不动就BeanUtil.copyProperties!!!
最近项目上要求升级一个工具包hutool的版本,以解决安全漏洞问题,这不升级还好,一升级反而捅出了更大的篓子,究竟是怎么回事呢?小结一下,对象在不同层之间进行转换映射,很不建议使用这种方式,更加推荐使用原生的setget方式,不容易出错。当然这不是将一棒子打死,毫无用武之地,在特定场景,比如方法内部对象的转换等影响小的范围还是很方便的。
2023-04-18 15:06:49
680
1
原创 注解+redis做限流,诶嘛真香
做项目时提供对外接口,为了防止频繁调用而引起的服务器崩溃,我使用注解+redis做了一个限流的功能,使用之后只能说真香。ip限流注解String returnValue() default "请求频繁,请稍后访问!Class
2023-04-18 15:02:37
270
原创 【Final】深入理解Java泛型、协变逆变、泛型通配符、自限定
最后总结一下:纯函数没有副作用Java 中使用通配符在使用时确定继承关系协变使集合保留继承关系逆变常常应用于函数入参匹配入参逆变,出参协变集合类比较少使用 super 通配符,因为通常会失去类型信息(当作Object使用)自限定保证子类获取自己,自己可以作为方法的参数或返回值。
2023-04-18 14:01:18
503
原创 从根上理解Spring之容器
Spring是为了解决企业应用的开发的复杂性而创建的,它使用基本的JavaBean来完成以前只可能由EJB完成的事情。个人理解:Spring就是一些大牛利用java语言规范开发的一个框架,我们开发者只需要学习其基本使用方式,原理就可以帮助我们提高效率,简化开发的复杂性。
2023-04-18 13:58:58
146
原创 Spring 之扩展点
Spring 它提供了很多实用的功能和方便的编程方式。Spring 框架的强大之处在于它的可扩展性,通过扩展 Spring 框架,可以使其满足更多的业务需求。Spring 框架的扩展可以分为两种类型,一种是基于 AOP 的扩展,另一种是基于 IoC 的扩展。下面将分别介绍这两种扩展方式,并结合源码分析说明具体实现方法。
2023-04-18 13:52:26
193
原创 Stream流的方法很多?基本上都在这里了
所以需要注意的是:当我们实际要去用的时候,是需要重写 hashCode 与 equals 的,它会先比较 hashCode,hashCode 相同时则使用 equals 方法比较 (在 Lombok 就一个 @Data 啥都不用管了)大概了解了 Stream流 的一个过程后,让我们来一起当回厂长,去 "流水线" 中的每一个生产车间去检验检验,瞅瞅这个 "流水线" 都能干些什么?这是因为 Stream 是支持并发操作的,为了避免竞争,对于 reduce 这个方法,线程都会有独立的 result,
2023-04-18 13:12:45
155
原创 面向对象程序设计
程序仅通过对象的方法与对象数据进行交互。在 Java 中,封装就意味着所有的实例域都带有 private 访问修饰符(私有的实例域),并提供带有 public 访问修饰符的域访问器方法和域更改器方法(公共的操作方法)。面向对象的程序是由类和对象组成的(以类和对象作为组织代码的基本单元),并将封装、抽象、继承、多态这四个特性,作为程序设计和实现的基础。封装主要讲的是如何隐藏数据、数据访问保护,而抽象讲的是如何隐藏方法的具体实现,让方法的调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。
2023-04-18 11:43:51
69
原创 Java的访问修饰符
为了实现面向对象程序设计(OOP)的封装这个特性,需要程序设计语言提供一定的语法机制来支持。这个语法机制就是访问权限控制(访问修饰符:public、protected、private、default)。在 Java 中,封装就意味着所有的实例域都带有 private 访问修饰符(私有的实例域),并提供带有 public 访问修饰符的域访问器方法和域更改器方法(公共的操作方法)。
2023-04-18 11:41:28
98
原创 Disruptor-源码解读
本文讲了 Disruptor 大体逻辑和源码,当然其高性能的秘诀不止文中描述的那些。还有不同的等待策略,Sequence 中使用Unsafe而不是JDK中的 Atomic 原子类等等。
2023-04-18 09:22:12
390
原创 Java并行流:一次搞定多线程编程难题,让你的程序飞起来!
在日常的工作中,为了提高程序的处理速度,充分利用多核处理器的性能,我们需要手动编写多线程代码。但是多线程编程非常复杂,容易出现死锁、竞态条件等问题,给我们带来了很大的困扰。而 Java 并行流则提供了一种更加简单、易用、安全的并发编程方式,可以让我们更加轻松地编写高效的并发程序。Java并行流可以让多线程编程变得更加简单易懂,减少编程中的并发问题,提高代码质量和可维护性。帮助开发人员更加轻松地实现任务并行,充分利用多核处理器的性能,加快程序的执行速度。
2023-04-17 09:39:57
409
原创 轻松理解Servlet、JSP与MVC架构
Servlet是Java Web技术中的一种用于处理客户端请求的服务器端程序。它是基于Java技术实现的,能够与Web服务器进行交互,接收HTTP请求,处理请求并返回响应给客户端。Servlet是一种典型的基于事件的编程,主要处理逻辑通常集中在doGet和doPost方法中。JSP(Java Server Pages)是一种动态网页技术,允许在HTML中嵌入Java代码片段,实现动态内容的生成。与Servlet相比,JSP页面更便于开发者编写和维护,因为它将程序逻辑与页面显示分离。
2023-04-17 09:33:49
1344
原创 三句话讲清楚SpringBoot的自动配置类的解析和过滤机制
Spring Boot提供了很多默认的自动配置类,例如,Spring MVC自动配置类(使用@ConditionalOnProperty 注解来判断是否需要配置 MyService 实例,prefix 参数指定属性的前缀,name 参数指定属性的名称,havingValue 参数指定属性的值,matchIfMissing 参数指定当属性不存在时的默认值。Spring Boot 的自动配置类是一个非常强大的特性,它可以根据项目中的依赖和配置自动配置应用程序的环境,从而让开发者更加专注于业务逻辑的实现。
2023-04-17 09:30:26
332
原创 Java对象的序列化和反序列化
Java 对象的序列化是将 Java 对象转换成字节流的过程,可用于持久化数据,传输数据等。序列化是将 Java 对象的状态表示为字节序列的过程,可以通过网络传送,存储到文件中或者使用其他的持久化技术,如数据库等。序列化后的字节流可以被传输给远程系统,并在那里重新构造成原始对象。Java 序列化是一个将对象转化为字节流的过程。Java 对象的反序列化是将字节流重新恢复为原始对象的过程。反序列化是将字节流转化为对象的过程。反序列化是对象序列化的逆过程,通过反序列化操作能够在接收端恢复出与发送端相同的对象。
2023-04-17 09:24:46
186
原创 java -- 标记接口
实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法, 则会导致抛出 CloneNotSupportedException 异常。标记接口(Marker Interface),又称标签接口(Tag Interface)将一个学生的数据复制到另一个学生对象中,并且两个对象不受任何的影响.
2023-04-17 09:22:18
156
原创 如何解决spring的循环依赖问题?
所以通过使用这种方法,对c的创建过程就变成: 4. 创建C,调用构造方法,完成构造并进行属性赋值注入,发现了依赖A,A也已经构造完成,直接引用,完成C的实例化。此时就是解决循环依赖的关键,因为A已经通过构造方法已经构造完成了,也就是说已经将Bean在堆中分配好了内存,这样即使A再填充属性值其也不会在改变它的内存地址了,所以此时就可以提前拿出来A的引用,来完成对C的实例化。通过spring的三个缓存方式来解决单例模式下循环依赖的问题,而其他的场景下产生的依赖问题是解决不了的,会报错。
2023-04-17 09:17:56
93
原创 java -- File类和递归
方法参数就是listFiles()方法获取到的文件或者目录的路径。如果方法返回true,表示需要此路径,否则此路径将被忽略。:目录遍历,无法判断多少级目录,所以在遍历需要进行判断,如果遍历到的还是目录,就要使用递归,遍历所有目录。:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。文件过滤器接口,此接口的实现类可以传递给方法listFiles(),实现文件的过滤功能。分析:n的阶乘:n!遍历目录下的所有文件和所有的子目录。:所有小于及等于该数的正整数的积。
2023-04-17 09:16:25
63
原创 大白话讲解synchronized锁升级套路
synchronized锁是啥?锁其实就是一个对象,随便哪一个都可以,Java中所有的对象都是锁,换句话说,Java中所有对象都可以成为锁。这次我们主要聊的是synchronized锁升级的套路无锁状态偏向锁轻量级锁重量级锁依次从耗费资源最少,性能最高,到耗费资源多,性能最差。
2023-04-14 09:55:15
176
原创 从ReentrantLock角度解析AQS
闲来不卷,随便聊一点。一般情况下,大家系统中至少也是JDK8了,那想必对于JDK5加入的一系列功能并不陌生吧。那时候重点加入了并发包,我们简称为JUC。JUC下提供了很多并发编程实用的工具类,比如并发锁lock、原子操作atomic、线程池操作Executor等等。下面,我对JUC做了整理,大致分为下面几点:基于JDK8,今天重点来聊下JUC并发包下的一个类,。首先,浅显的从名字上看,抽象的队列同步器;实际上,这名字也跟它的作用如出一辙。抽象,即需要被继承;队列同步器。
2023-04-14 09:42:45
62
原创 Java:如何加密或解密PDF文档?
在工作中,我们会将重要的文档进行加密,并且设置用户的访问权限,其他外部人员均无法打开,只有获取该权限的用户才有资格打开文档。此外,限制用户的使用权限,极大程度上阻止了那些有意要篡改、拷贝其中内容的人,提高文档的安全性。与此同时,文档加密的另一大作用是为了防止丢失,因为可能存在员工出差或离职时,将文档有意或无意的删除,造成文档丢失的现象,从而导致公司的业务和形象受到一定影响。那么我们如何才能加密PDF文档呢?加密文档之后又该如何解密呢?
2023-04-14 09:35:48
933
原创 JdkProxy的进阶知识
于是乎我们即不想在原来的代码里修改,又不想把原有的代码重新写一次,那么前辈们就发明了代理.,武器开给,我来打!,武器开给,我来打!那么通过 Proxy.create函数生成的是一字节码文件(至于怎么生成,太高端没去研究),它被 loader 加载到JVM,通过 debug只看了类名$Proxy0。* 通过 Proxy.create 生成的对象是代理对象,基于 接口的代理对象,那么有以下几点是需要注意。* 通过 Proxy.create 生成的对象是代理对象,基于 接口的代理对象,那么有以下几点是需要注意。
2023-04-14 09:28:56
94
原创 java -- 线程
在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。:是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。:线程运行至同步代码块的时候,需要判断锁,获取锁,出去同步代码块后要释放锁,增加了很多操作,因此线程安全,程序的运行速度慢!线程的切换是由线程调度控制的,我们无法通过代码来干涉,但是我们通过提高线程的优先级最大程度的改善线程获取时间片的几率。
2023-04-14 09:22:30
31
原创 Spring Boot 接口加解密,新姿势来了!
在我们日常的Java开发中,免不了和其他系统的业务交互,或者微服务之间的接口调用如果我们想保证数据传输的安全,对接口出参加密,入参解密。但是不想写重复代码,我们可以提供一个通用starter,提供通用加密解密功能接口相应数据的时候,返回的是加密之后的数据 接口入参的时候,接收的是解密之后的数据,但是在进入接口之前,会自动解密,取得对应的数据。
2023-04-14 09:18:26
703
2
原创 聊聊Java中的mmap
当我们读取或修改大文件时,传统的文件I/O操作可能会变得很慢,这时候mmap就可以派上用场了。mmap(Memory-mapped files)是一种在内存中创建映射文件的机制,它可以使我们像访问内存一样访问文件,从而避免频繁的文件I/O操作。使用mmap的方式是在内存中创建一个虚拟地址,然后将文件映射到这个虚拟地址上。这个映射的过程是由操作系统完成的,它会将文件中的数据按需加载到内存中,而不是一次性加载整个文件。这样,我们可以通过指针操作这个虚拟地址,就像访问内存一样来读取或者修改文件内容。
2023-04-14 09:16:43
1154
原创 Springboot + MySQL+ JPA Ⅲ delete方法详解
deleteById先在方法体内通过id求出entity对象,然后调用了delete的方法。实际使用中呢,也是使用deleteById的情况比较多,废话少说,try it。第一种就是一条一条的进行删除操作,如果有万级的数据,执行起来肯定非常耗时,所以如果数据量比较大的话,还是建议大家使用第二种。通过源码可以看出,就是遍历ids然后循环调用上面的deleteById(Id id)方法。由此可见,先通过select看看实体对象是否存在,然后再通过id进行删除!由此可以看出,数据是一条一条的进行了删除。
2023-04-14 09:12:20
93
原创 SpringBoot中YML,yaml,properties文件的读取
yml,yaml,properties三种文件都是用来存放配置的文件,一些静态数据,配置的数据都会存放到里边。但是有的时候我们不仅仅需要存储静态数据,还需要从文件中读取数据出来。这三种文件都放在项目--》src--》main--》resource下边。如果resource里边需要存放其他文件的话,会在resource里边创建一个config包。将配置文件存放其中。
2023-04-13 09:47:36
436
原创 Spring源码探索-核心原理下(AOP、MVC)
今天要分享得是Spring的@DependsOn注解,对于@DependsOn,我们从它的名称里面就能看出意思是“依赖于”,那么在Spring中,它的作用就是解决Bean的创建依赖,比如某个Bean在创建的时候依赖另外一个bean,所以需要另外一个bean先创建,然后再创建自己。
2023-04-13 09:33:20
34
原创 关于奥特曼变成迪迦过程(Bean的属性注入)
前面我们完成了通过JDK和Cglib完成带参数的构造函数来完成bean的初始化过程。接下来就是 给bean 完成属性注入,一般在正常使用过程中,一个bean会有一些自己的基础属性,同时也会引入其他的 bean 来执行一些方法。所以我们在执行注入的时候,就需要区分 是- bean的基本类型,还是引用类型。Spring 通过对引用对象做一层简单的包装,来与基础属性分开。类之间的关系如下这一节我们完成了 bean 的属性注入、让一个bean拥有了属于自己的属性。
2023-04-13 09:20:49
115
原创 Java 源码重读系列之 HashMap
因为,把一个2 的整数次幂的数值右移一位后,依然是一个2 的整数次幂,而 MAXIMUM_CAPACITY 就是允许的最大的 2的整数次幂。newCap 是指扩容后新的 table 数组的长度。但是在序列化后,HashMap 保存在 table 中的位置没有变,就会出现找不到的情况,这就是 HashMap 中的一些元素不能序列化的原因。没有多少复杂的内容,类似于链表的Node节点,key、value、next,因为大量的地方都需要用到对象的 hash 值,所以又记录了下 key 的 hash 值。
2023-04-13 09:16:22
94
原创 Java增加自定义注解校验入参
也许这是个很基础的命题,之前只是看到可以这样操作,并没有自己操作过,也并不理解每一步的意义,这次有机会实操一下,还是决定记录下来。
2023-04-13 09:15:30
290
原创 java -- 二维数组
假设有一个矩阵为5行5列,该矩阵是由程序随机产生的100以内数字排列而成。在Java中二维数组被看作数组的数组,即二维数组为一个特殊的一维数组,其每个元素又是一个一维数组。Java 并不直接支持二维数组,但是允许定义数组元素是一维数组的一维数组,以达到同样的效果。二维数组打印一个10行的杨辉三角。
2023-04-13 09:11:56
111
原创 《跟ChatGPT学习Java语言》- 如何将bytes转换为其他类型?
需要注意的是,在将字节数组转换为字符串时,会使用系统默认的字符编码来将字节解码为字符。是Java NIO库中的一个类,用于操作字节缓冲区,提供了对字节数据进行高效的读写操作的方法。它用来存储在缓冲区中的二进制数据,包括8位字节、16位字符等,可以在内存中直接操作,并且具有一定的灵活性和效率。需要注意的是,上述方法实际上将一个有符号的 byte 数组转换成了无符号的 long 类型。,该数组包含了要转换的 bytes。模式:指定当前缓冲区的复制模式,允许将当前缓冲区中的数据复制到另一个缓冲区中。
2023-04-12 10:37:25
579
原创 Spring Boot 整合 Kafka
环境:自行创建 Spring Boot 项目,添加测试依赖,并启动 Zookeeper 和 kafka 服务。注意:Zookeeper 默认好像占用 8080 端口,自己注意端口占用问题。3. 创建消息生产者。4. 创建消息消费者。
2023-04-12 10:23:23
258
原创 final域重排序规则
例如,在一个计算任务中,如果早期的指令会阻塞后续的指令,处理器可能会将后续的指令提前执行,从而减少等待时间,提高系统的运行效率。例如,在写入一个共享变量时,如果之前的读操作已经加载了该变量的值,则系统可以省略掉后续的读操作,直接将结果写入内存。但需要注意的是,编译器优化不会改变程序的语义,即优化后的程序与原始程序的行为应该是一致的。指令重排序(Instruction Reordering)是现代计算机为了提高指令执行效率而进行的一种优化技术,其具体过程是改变原有的程序指令执行顺序,从而提高程序的执行速度。
2023-04-12 09:56:47
516
原创 Spring 之循环依赖
在本文中,我们探讨了 Spring 框架是如何解决循环依赖的问题的。我们分析了 Spring 框架的源代码,并提供了一些示例来说明 Spring 框架如何解决循环依赖的问题。总之, Spring 框架通过创建代理对象来解决循环依赖的问题,该代理对象负责管理 Bean 之间的依赖关系,并确保每个 Bean 都只被实例化一次。
2023-04-12 09:34:03
88
原创 Java线程池源码解读
其中,corePoolSize是线程池的核心线程数,maximumPoolSize是线程池的最大线程数,keepAliveTime和unit是非核心线程的存活时间和时间单位,workQueue是任务队列,threadFactory用于创建线程,handler是拒绝策略,用于处理任务队列已满时的任务拒绝。线程池是Java并发编程中的一个重要组件,它能够有效地管理线程的生命周期和执行,从而避免了频繁创建和销毁线程的开销。通过以上源码解读,我们可以对Java线程池的实现原理有更加深入的理解。
2023-04-12 09:33:34
126
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人