- 博客(112)
- 资源 (5)
- 收藏
- 关注
原创 Java多线程异步返回
在探讨 FutureTask 和 Future 后,我们发现都是获取值都是堵塞的方法,如果想不堵塞地获取返回值,那就可以了解一下CompletableFuture 类。CompletableFuture 类实现了Future的同时也实现了CompletionStage 接口,后者为CompletableFuture 类提供了非阻塞的能力。FutureTask 是Runnable 和Future 的结合体,实现了Runnable 和Future 接口,这也是 Future 单独使用不依赖线程池的方法。
2025-01-02 14:00:03
475
原创 IText创建加盖公章的pdf文件并生成压缩文件
介绍了Itex的基本使用技巧,本篇以一个案例为基础,主要介绍IText根据pdf模板填充生成pdf文件,并生成压缩文件。2、为提高效率,在系统启动后将模板加载到redis缓存中,代码如下;以下面pdf模板为例,生成一个pdf文件,并将其压缩成zip文件。1、将pdf模板机公章图片放到resource目录;5、调用并执行测试方法,将会在D盘创建压缩文件;欢迎大家积极留言交流学习心得!4、编写一个测试方法;3、操作文件工具类;
2024-11-22 16:26:05
511
原创 责任链模式实现规则校验
如果现在需要增加一种校验(如增加订单物流的校验),此时我们只需要增加一个业务的实现类,然后在spring的配置将这个业务实现类加入到责任链逻辑上就可以了。我们使用责任链模式实现对订单中参数的校验,首先校验订单id是否为空,然后校验下单人是否为空,最后检验收获地址是否为空。(3)责任链模式使用的典型场景是多个对象处理同一个请求,如OA审批、参数的校验、日志记录器链等等。(1)需要保证责任链的结构清晰、避免创建过长的链,进而提升执行的性能。(3)具体的检验逻辑(继承公共逻辑)(2)责任链中的公共逻辑的抽取。
2024-09-19 14:34:44
655
原创 细说CountDownLatch
在面试中,当被问及是否使用过CountDownLatch 时,可以结合上述示例和自己的项目经验,详细阐述其应用场景和使用方法,以展示自己在并发编程方面的能力和经验。在实际开发中,有时需要将一个大任务分解成若干个小任务并行处理,待所有小任务完成后,再进行后续处理。例如,在文件处理、数据处理、网络请求等场景中,可以将大文件分割成多个小文件并行处理,或同时向多个服务器发起请求,待所有任务完成后再合并结果。在一些计算密集型任务中,可以将计算任务分解到多个线程中并行处理,待所有线程完成计算后,再汇总结果。
2024-06-20 14:19:20
502
1
原创 Java实现Mysql批量插入与更新
第一、批量插入语句第二、批量更新语句第三,工具类第四、调用方式欢迎大家积极留言交流学习心得,点赞的人最美丽!
2024-06-13 13:32:09
929
原创 高并发中的限流策略
限流,简单来说,就是限制在一定时间内可以处理的请求数量。在互联网时代,随着用户数量的激增和业务需求的不断扩展,我们的应用程序经常面临高并发的挑战。高并发环境下,服务器需要处理大量的请求,这就需要我们采取一些策略来保护系统不被过多的请求所压垮。它通过一个令牌桶来控制请求的速率,桶中存放着一定数量的令牌,请求需要消耗令牌才能被处理。我们可以设置一个计数器,每当有请求进来时,计数器就加一,当计数器达到设定的阈值时,就拒绝新的请求。它通过一个固定容量的桶来控制请求的速率,请求就像是水,以固定的速率从桶中漏出。
2024-06-05 09:53:11
256
原创 Spring Boot的@Async注解有哪些坑需要避免
SpringBoot的@Async注解为异步编程提供了极大的便利,但在使用时必须注意其背后的代理机制和具体实现细节。它可以将标注的方法从调用者的线程中分离出来,另起一个新线程执行,从而避免阻塞调用者的线程,提高系统的并发能力和响应速度。问题:默认情况下,SpringBoot会使用一个简单的SimpleAsyncTaskExecutor,这个执行器不是真正的线程池,可能会导致性能问题。原因:这是因为Spring的代理机制,只有通过代理对象调用时注解才生效,而类内部的自调用不会经过代理对象。
2024-06-04 10:11:08
1106
原创 如何在Spring Boot中创建自定义的SpringEvent增强组件
SpringBoot是一款基于Spring框架的轻量级开发框架,它提供了大量的自动配置选项,简化了Spring应用的开发。在Spring生态系统中,事件驱动开发是一种常见的设计模式,用于解耦各个组件之间的关系,提高系统的扩展性和可维护性。:发布事件的对象,通常是Spring的应用上下文(ApplicationContext)。:事件是应用中发生的重要事情,通常是一个继承自ApplicationEvent的类。:监听并处理事件的对象,通常是实现了ApplicationListener接口的类。
2024-05-27 10:52:43
447
原创 Spring Boot 启动流程
Spring Boot 是一个基于 Spring 框架的快速开发框架,它简化了 Spring 应用的初始搭建和开发过程。Spring Boot 应用通常有一个主类,作为应用的入口点。例如,如果项目中包含了 spring-boot-starter-web,则会自动使用 Tomcat 作为内嵌服务器。Spring Boot 的自动配置是基于条件注解实现的。Spring Boot 会根据应用类型创建相应的应用上下文。最后,Spring Boot 会刷新应用上下文,启动所有注册的 bean,并发布应用启动事件。
2024-05-24 10:32:00
434
原创 说说SpringBoot自动配置原理
在selectImports方法内部,AutoConfigurationImportSelector会加载spring.factories文件,并基于条件注解(如@ConditionalOnClass、@ConditionalOnProperty等)来过滤和选择需要自动配置的类。Spring Boot的自动配置原理可以概括为:通过读取jar包中的配置信息,并根据项目依赖和条件注解自动配置应用程序所需的bean,从而减少手动配置的工作量。那是不是不管三七二十一,都给它创建出来呢?而是放在下面这个文件下。
2024-05-09 10:45:55
424
原创 最实用的Nginx配置笔记
例如将www.abc.com和www.bca.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。当网站并发量大时,一台服务器已经无法承受,此时需要部署多个服务器来分担压力,这时候可以通过Nginx配置来将请求,通过一定分发规则,分发到不同的服务器来达到负载的作用。反向代理是针对服务器来说的,一般来说是 客户端直接访问服务器,反向代理是客户端->Nginx->后端接口。
2024-05-07 11:31:07
169
原创 Spring框架Aware接口的作用和应用
实现该接口的 Bean 可以在初始化时获取 Spring 的 Environment 环境对象,从而获取配置文件中的属性值、系统属性、环境变量等,Bean 可以根据不同的环境进行相应的逻辑处理,例如根据配置文件中的属性值决定 Bean 的行为,或者根据环境变量来动态调整 Bean 的配置等,使 Bean 在不同的环境下具有更灵活的适应性和可配置性。实现该接口的 Bean 可以在初始化时获取资源加载器ResourceLoader对象,用于加载各种资源,例如文件、URL、类路径等,实现更灵活的资源管理和处理。
2024-05-06 14:53:25
1133
原创 SpringBoot项目启动成功后,我们需要在某个组件里提前执行一些操作应该怎么做?
Spring官方推荐首先使用@PostConstruct注解方法进行初始化,但在某些特定情况下,实现InitializingBean接口可以提供更多控制,例如当需要访问Spring的特定功能或在初始化过程中处理Spring特定的异常时。也就是说,static变量的生命周期与类的加载和卸载相同,而被@Value注解的变量的生命周期则由Spring容器的bean生命周期管理决定。@PostConstruct注解的方法在Bean构造函数执行后和所有依赖注入完成后调用,这确保了所有必需的依赖都被设置。
2024-05-06 14:18:36
1028
原创 21条实用Linux命令
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。使用 “+” 设置权限,使用 “-” 用于取消。(向一个命令启动的进程发送一个信号)pwd 显示工作路径。
2024-04-25 11:30:20
271
原创 SpringBoot常见的52个注解
用于定义Bean初始化顺序,可以用在@Configuration、@Component、@Service、@Repository等注解以及@Bean方法上。用于定义配置类或Bean仅在特定的Profile激活时才会生效,可以用在@Configuration类或@Bean方法上。用于定义在特定Bean存在或不存在时的条件配置,可以用在@Configuration类或@Bean方法上。用于定义在特定类存在或不存在时的条件配置,可以用在@Configuration类或@Bean方法上。
2024-04-19 14:17:25
608
原创 超实用IDEA技巧,让生产力突飞猛进
尽管本质都是去改变 .vmoptions配置文件,但推荐使用Change Memory Settings去调整,选择Edit Custom VM Options 或者在本地磁盘目录更改,通过某些方法破解的idea 很可能造成idea打不开的情况。与eclipse类似,idea也可以自己关闭代码检查 减少资源使用,但不推荐全部关闭,(是大佬当我没说),把我们项目中不会使用到的关闭就好了。idea默认是选择显示单行的,我们把这个去掉,就可以显示多行tab了,在打开tab过多时的场景非常方便!
2024-02-23 13:35:09
449
原创 Java 的 8 种异步实现方式
如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。Future件彼此孤立:有时某一个耗时很长的异步任务执行结束之后,你想利用它返回的结果再做进一步的运算,该运算也会是一个异步任务,两者之间的关系需要程序开发人员手动进行绑定赋予,Future并不能将其形成一个任务流(pipeline),每一个Future都是彼此之间都是孤立的,所以才有了后面的CompletableFuture,CompletableFuture就可以将多个Future串联起来形成任务流。
2024-02-19 14:22:40
1403
原创 @Transactional 事务注解
在这里我也放个问题吧,希望有高手可以回复指点指点我,因为JVM动态代理是基于接口实现的,那么是不是service层都要按照接口和实现类的开发模式,注解才会生效呢,就是说controller层直接调用没有接口的service层,加了注解也一样不起作用吧,这个懒了,没有测试,其一是因为没有人会这么开发吧,其二是我就认为是不起作用的,哈哈。代码太长了,超过屏幕了,粘贴出来截的图,红框注释需要仔细看,希望不要影响你的阅读体验,至此,本篇关于@Transactioinal注解的使用就到此为止啦,
2024-01-09 17:09:31
431
1
原创 Spring中Bean的生命周期
值得注意的是:实例化和初始化是两个完全不同的过程,前者只是给Bean分配内存空间,而后者则是将程序执行权从系统级别转到用户级别,执行用户添加的业务代码。进行初始化工作(使用注解 @PostConstruct 初始化 或者 使用(xml)init-method 初始化, 前者技术比后者技术先进~);: 给Bean分配内存空间(对应JVM中的“加载”,这里只是分配了内存);: 进行Bean的注入和装配;执行初始化的前置工作;执行初始化的后置工作;
2024-01-09 16:18:17
441
原创 一个 Java 对象到底有多大?
Object Header占4byte,Pointer占4byte,一个int字段(size)占4byte,elementData数组本身占12(4+4+4),数组中10个Integer对象占10×16。一个long比一个int才多4byte,但是你要想,如果内存中有100W个long,那就白白浪费了约4MB空间,不要小看这一点点的空间浪费,因为随便一个跑着在线应用的JVM中,对象都能达到上千万!结果是16byte!一个int在java中占据4byte,所以Integer的大小为4+4+4=12byte。
2023-10-13 15:12:33
385
原创 Java 序列化和反序列化为什么要实现 Serializable 接口
如果不显示指定serialVersionUID, JVM在序列化时会根据属性自动生成一个serialVersionUID, 然后与属性一起序列化, 再进行持久化或网络传输. 在反序列化时, JVM会再根据属性自动生成一个新版serialVersionUID, 然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功, 否则报错..先说结论, 被transient关键字修饰的属性不会被序列化, static属性也不会被序列化.。
2023-10-11 13:58:11
137
原创 多线程并发之线程通信
场景:当你有很大一个List的时候,有时候业务处理时就需要将List拆分处理,比如你调用依赖方接口,Get请求中包含这个超长的List入参,这样请求URL就会出现过长的问题,所以可以使用Lists.partition进行分割。结合Semaphore是为了控制并发量,以防依赖方接口不能支撑住很大并发量,使用Semaphore控制并发量以保证不给依赖方接口打死。多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信。
2023-07-10 16:32:24
171
原创 Java8之Stream
第一、Java8 Stream之filter,distinct,skip,limit,map,flatmap详细介绍List<Integer> list= Arrays.asList(1,2,3,4,5,1);//1.filter过滤流中的数据。List<Integer> result=list.stream().filter(i->i%2==0).collect(Collectors.toList());System.out.println("filter过滤流中的数
2022-05-22 18:19:24
1215
原创 Java内置线程池ExecutorService介绍及商品秒杀案例
第一、ExecutorService接口是java内置的线程池接口,通过学习接口中的方法,可以快速的掌握java内置线程池的基本使用常用方法:void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。List shutdownNow() 停止所有正在执行的任务,暂停处理正在等待的任务,并返回等待执行的任务列表。 Future submit(Callable task) 执行带返回值的任务,返回一个Future对象。Future<?> submit(Ru
2022-05-14 19:52:19
907
原创 自定义线程池
第一、什么是线程池线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队里中,然后在创建线程后自动启动这些任务。这里的任务就是实现了Runnable或Callable接口的实例对象。第二、为什么使用线程池使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有线程进行统一的管理和控制,从而提高系统的运行效率,降低系统运行压力;第三、使用线程池有哪些优势a.线程和任务分离,提升线程重用性b.控制线程并发数量,降低服务器压力,统一管理所有线程c.提升系统响应速
2022-05-08 21:02:32
1011
原创 Oracle的SQL优化建议
第一、SQL语句尽量用大写的因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行第二、使用表的别名当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。第三、选择最有效率的表名顺序(只在基于规则的优化器(RBO)中有效)ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表也称为驱表,driving table)将被最先处理,在FROM子
2022-05-04 22:07:33
1455
原创 docker查询日志输出到文件的优雅实践
第一、创建日志文件vim file.txt顺便普及一下vim退出的方式按 ESC,左下角就可以进行输入:w 保存但不退出:wq 保存并退出:q 退出:q! 强制退出,不保存:e! 放弃所有修改,从上次保存文件开始再编辑命令历史第二、查询容器iddocker ps第三、写入指定容器在某时间段的日志--将最近225分钟的日志写到file.txt文件docker logs --since 225m 4261ce7f5c14 >>file.txt第四、将file.tx
2022-01-15 15:13:18
19764
原创 序列化与反序列化
1.序列化与反序列化的概念序列化:将对象写入到IO流中反序列化:从IO流中恢复对象Serializable接口是一个标记接口,不用实现任何方法,标记当前类对象是可以序列化的,是给JVM看的。序列化机制允许将这些实现序列化接口的对象转化为字节序列,这些字节序列可以保证在磁盘上或者网络传输后恢复成原来的对象。序列化就是把对象存储在JVM以外的地方,序列化机制可以让对象脱离程序的运行而独立存在。序列化在业务代码也许用的不多,但是在框架层面用的是很多的。先给出序列化的例子。package com.s
2021-12-16 15:34:11
574
原创 Java代码优化之超搞笑的小技巧
前言代码优化是一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的:呜呼!泰山不让土壤,故能成其大;河海不择细流,故能就其深;王者不却众庶,故能明其德。一点一滴的优化都是未来系统飞速疾驰的巨大动力。代码优化的目标是:1.减小代码的体积。2.提高代码运行的效率。优化细节1、尽量指定类、方法的final修饰符带有 final 修饰符的类是不可派生的。在 Java 核心 API 中,有许多应用 final 的例子,例如 jav
2021-09-29 11:03:50
231
原创 Spring MVC及Spring Boot项目中RestTemplate的运用
第一、RestTemplate简介RestTemplate是Spring提供的用于访问Rest服务的客端, RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如Android或者第三方服务商都是使用RestTemplate请求restful服务。第二、Spring MVC项目中RestTemplate的使用1、使用RestTemplate之前,需要初始化其实例。创建一个工具类如下,初始化实例后,可以通过注解注入调用类中。import or
2021-03-09 19:21:22
925
原创 Tomcat配置图片保存路径
1.使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项目路径下,那么再次打war包发布项目可能会造成图片的丢失,每次重启前将图片先保存再copy到服务器明显不方便,这时可以配置图片保存位置,将图片保存到项目外的地方,方法如下:打开tomcat - conf下的server.xml文件,在Host节点下添加<Context docBase="D:/imgs" path="/imgs" />docBase为图片保存的位置,path为图片的访问路径。例如:1.该
2020-12-24 10:06:44
2284
基于 Spring MVC 的教辅平台的设计与实现
2024-03-11
基于 Java 的在线学习网站的设计与实现
2024-03-11
JSP+Servlet+cos文件上传下载Jar包.rar
2020-08-09
jquery.validate+jquery.form.rar
2020-08-08
Oracle之分析函数.pdf
2019-08-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人