Java
DanceDonkey
这个作者很懒,什么都没留下…
展开
-
SpringBoot根据配置类动态加载不同环境下的自定义配置
Profile 注解可以根据当前环境加载当前配置类,而@PropertySource可以加载其他jar包下的classpath文件。原创 2024-03-31 22:11:13 · 420 阅读 · 0 评论 -
自定义封装异步任务组件,实现FutureTask功能
就是取决于当前对象的标签,例如我有一个翁,标签是 钥匙,那我需要一个处置东西的工具、而这个处置东西的工具也可以打标签,例如可以处置杯子、处置木头、处置钥匙等,那这个地方的意思就是我需要一个Consumer类型的对象,这个对象的标签是T,而T是哪里来的,T是在创建当前对象的时候定义好的,也就是类似常说的出厂设置,这个实例在创建的时候就知道自己的泛型,即 某个翁在制造好出厂的时候就打好标签了。泛型就相当于翁的一个标签,标识着此翁装配的东西,有的实例方法需要的参数也是带着泛型的,例如AsyncTask中的。原创 2023-09-07 21:17:50 · 196 阅读 · 0 评论 -
线上集群数据不同步问题解决
生产环境部署101、102两台服务器,使用Nginx做负载均衡返回html页面,两台JVM分别做了内存的数据缓存,前端页面在进行数据修改时,随机发送到了某台服务器上,此台服务器更新了自己的缓存,但另一台服务器还是修改之前的数据,这就导致两台JVM的数据不一致,自然发生了问题。在负载均衡 高可用的情况下 要慎用 JVM 内存做缓存。原创 2023-08-25 16:55:45 · 124 阅读 · 0 评论 -
Java反射-反射API、类加载过程
Java反射API是Java语言实现动态性的关键,它允许动态的创建对象、赋值、以及调用对象的方法,同时反射也是实现动态代理的关键,涉及到反射相关的几个类主要有 Class、ClassLoader,Field、Method、Constructor、Proxy等。因为在Java中一切皆对象,当然,编译后的class字节码文件也会被JVM创建出一个唯一的Class类型对象,类就是类,对象就是对象,对象有属性可以调方法,任何对象也不例外,无需把这些对象想复杂化。这个时候仅仅是完成了类的加载过程,之后才是创建对象。原创 2023-07-12 23:07:41 · 222 阅读 · 0 评论 -
HttpServletResponse 设置ContentType
通过设置响应头 Content-Disposition 让浏览器实现弹窗下载,这里下载的话,ContentType可以根据文件名动态获取也可以直接写成application/octet-stream,只因下载不是预览,只是下载下来查看。可以设置成图片、PDF等。如果浏览器无法识别或者无法解析文件类型,会直接进行下载,可以处理的类型为预览效果。这里的ContentType比较重要,浏览器根据此响应头来判断需要如何解析响应体的内容类型。原创 2023-05-18 16:29:56 · 2300 阅读 · 0 评论 -
说说Java日志那些事
日志是每个应用程序在开发的过程中必不可少的组件,通过日志输出可以获取项目的一些运行信息,监控项目的运行指标等,同时,通过学习Java日志框架还可以学习到桥接器与适配器模式等。原创 2023-04-23 23:36:14 · 459 阅读 · 0 评论 -
Apache POI 实现分栏以及去表格边框实现
注意,新的单元格调用getCTTc()方法时返回的是null,所以此时要先为此单元格添加一个Tc,调用addNewTcPr()方法。首先需要获取到表格的单元格,根据获取到的单元格来具体实现去掉哪边对应的边框,分别有top、bottom、left、right。目前没有直接的POI分栏Word API,只能是用表格来模拟实现,创建一个1行2列的表格,然后将表格的边框去掉。通过表格来间接模拟实现分栏。原创 2023-03-20 17:01:27 · 1442 阅读 · 0 评论 -
Maven项目单元测试路径相关问题踩坑
单元测试中的相对路径不是相对于项目的根路径的,可能会因为路径问题导致输出结果找不过。此时输出的路径是相对于项目的跟目录的,读取文件也是相对于项目的根目录的。在有路径的相关测试中,还是要用main方法测试。原创 2023-02-27 10:49:14 · 238 阅读 · 0 评论 -
NoClassDefFoundError错误解决
A项目引入了B依赖,而B依赖中又用了C依赖,假设C依赖的版本是2.0,此时A项目自己又引入了C依赖,A项目引入的C依赖版本为1.0,那么根据Maven的就近原则,此时1.0版本的C依赖是生效的,如果B依赖用到了C依赖相关的API在1.0版本中是没有的,那么此时依然会抛出此异常。鄙人也是第一次遇见此问题,排查过后发现还是依赖版本的问题,将低版本的依赖排除掉以后,保留高版本的依赖即可。所以此类问题出现以后,往往就需要考虑依赖缺少,或者引入的依赖版本过低,导致没有相关API问题。原创 2023-02-03 16:12:50 · 4440 阅读 · 0 评论 -
maven打包报错-There are test failures
修改在测试程序的注解中指定主测试类,如果出现 Failed to clean project: Failed to delete 类似错误,可检查是否有其他程序或者cmd窗口占用了相关文件。将包名修改为一致的包名,如果修改后无效,则先执行一下clean命令 在执行package。如果工程中有测试程序,需要检查测试程序的包名与主程序的包名是否一致。如果将主启动类包名与测试类包名规则一致,则一般可解决此问题。原创 2023-02-03 11:47:52 · 1023 阅读 · 0 评论 -
Mybatis整合Spring的事务控制与SqlSession线程安全问题
发现最终还是调用了openSession这个方法,但是这里要注意了,每次调用任何mapper的任何方法,都会重新开启一个openSession,每个session中的事务管理器也都是spring管理,这样的话就避免了线程安全问题,保证每一个mapper方法的调用都会有独立的sqlSession,同时事务又交由Spring管理。代理对象的实现逻辑封装在了SqlSessionTemplate.SqlSessionInterceptor类中,我们只需要弄清这个类的实现原理即可。原创 2023-01-09 14:56:47 · 1821 阅读 · 0 评论 -
Java中基本数据类型与引用数据类型
new User()后,在堆内存中根据User类的属性大小,计算出所需内存空间,然后将内存地址赋值给u变量,例如堆内存的地址为0x002,而u这个变量地址是0x003,那么在输出u时,会先根据u的地址0x003找到这个地址保存的值,发现这个地址保存的值依然是一个地址,则会进一步找0x002,进而找到0x002对应的对象,从而进行输出。堆内存中的对象是所有线程共享的,如果这个对象是在方法栈中创建的,则一般不会有线程安全问题,但是如果这个对象是作为某个对象的属性,则此时可能会有线程安全问题。原创 2023-01-06 10:13:20 · 204 阅读 · 0 评论 -
去除字符串中的转义字符
在字符串转Json时,如果字符串中存在不合适的转义字符,则往往会转换失败。此时需要先去掉字符串中的转义字符。原创 2023-01-03 10:21:36 · 2056 阅读 · 0 评论 -
Apache Ftp客户端工具FtpClient
FtpClient默认使用的是ASCII形式传输的,如果只传输英文字符的文件没有问题,如果是二进制文件就会有问题,所以统一将传输编码改为UTF-8,将传输内容改为二进制内容。注意设置这几个参数的顺序,要在login方法调用之后。原创 2022-11-16 11:03:47 · 504 阅读 · 0 评论 -
获取当天日期是年度的第几周以及该周的起始和结束日期
【代码】获取当天日期是年度的第几周以及该周的起始和结束日期。原创 2022-11-10 13:27:30 · 316 阅读 · 0 评论 -
Java中的引用数据类型赋值问题
那么此时将p3赋值给top,那一样的道理,只是将p3的地址赋值给了top,top这个引用此时保存的是p3的地址。在top赋值给p3.goodFriend时还是保存的p2的地址,此时只是让top重新保存p3的地址,也就是一个变量的赋值只影响当前保存的值是什么,不会影响已经赋值过的,已经赋值过的依然会保存在堆内存中。数据类型除了基本数据类型就是引用数据类型,两者的本质区别就是一个是保存的真正的值,而另一个是保存的地址,在JVM解析引用数据类型变量的时候,会根据变量保存的地址进一步解析到其保存的值。原创 2022-09-13 13:29:27 · 1211 阅读 · 0 评论 -
使用代理对象执行实现类目标方法异常
这个其实也可以很好想明白target是一个代理对象,是BaseController的代理对象,本身和BaseControllerImpl是没有关系的,他俩都实现了BaseController接口,因此可以说是兄弟关系,但是兄弟之间就不能实现相同方法的调用了,必须得是父类或自身得方法可以。所以在JDK实现的代理中,在调用接口目标方法时,是调用的接口的方法。此时的target就是一个代理对象,同时是Proxy与BaseController的实例,此时以接口的形式来调用方法调用的时接口的方法是可以的,什么意思?.原创 2022-08-03 15:00:39 · 256 阅读 · 0 评论 -
伪代码实现几种常见的时间复杂度算法
2n +5 = O(n)n^2 + 2n +5 = O(n^2)2n^2 + 2n +5 = O(n^2)2n^3 +5 = O(n^3)5 = O(1)O(1) < O(log2n (log以2为底n的对数) ) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)O(log2n)如果i是每次i*3的话,那么执行次数就是 log3^1003.O(n)O(nlog2n)O(n^2)O(n^3)o原创 2022-06-30 10:28:05 · 1653 阅读 · 0 评论 -
idea设置vm optionsjavaagent参数
idea设置vm options原创 2022-06-27 20:10:13 · 2489 阅读 · 0 评论 -
SpringBoot使用hibernate-validate数据校验
代码实现校验在实体类属性上标注校验注解其他功能校验注解如下:在controller层方法上的参数位置添加校验注解此时如果校验不通过会抛出MethodArgumentNotValidException异常,通过编写全局异常处理器来处理该校验异常校验组的使用在校验时某些字段并不是特定的为空或者不为空,例如修改逻辑,当修改某一条数据时,会需要该条数据携带id,id属性不能为空,此时如果在id属性上面标注@NotEmpty注解在修改时是没问题的,但是如果是新增呢?新增时需要后端生成id,所以原创 2022-06-24 15:22:09 · 448 阅读 · 0 评论 -
EasyExcel单sheet页与多sheet页写出
单sheet页导出没什么问题此时可能会遇到文件生成问题此时需要调一下excelWriter.finish()方法将缓冲区中的数据全部写出。原创 2022-06-23 10:44:32 · 2082 阅读 · 0 评论 -
根据时间戳获取年月以及当月第几周
long ts = 156326356561l;LocalDateTime ldt = LocalDateTime.ofEpochSecond(ts,0,ZoneOffset.of("+8"));//将当前时间戳转为日期 + 时间//获取日期部分LocalData ld = ldt.toLocalDate();//得到这个日期所属的星期是这个月的第几周int weekOfMonth = ld.get(WeekFields.of(DayofWeek.MONDAY,1).weekOfMonth());原创 2022-05-24 14:46:45 · 1005 阅读 · 0 评论 -
内部类对象引用外部类对象
在SeqList类中声明了一个内部类MyInt ,通过调用SeqList类的iterator方法,返回该内部类对象。但是该内部类对象是用到了外部类层成员变量的。如何获取?package com.suanfa.xxb;import com.suanfa.utils.Assert;import java.util.Arrays;import java.util.Iterator;public class SeqList<T> implements Iterable<T>原创 2022-05-09 20:09:39 · 531 阅读 · 0 评论 -
log4j2设置每天日志文件数和每个日志文件大小
RollingFile:使用文件方式记录日志- fileName:记录日志的文件- filePattern:当日志记录文件超过指定大小时,以指定的文件格式生成新的文件SizeBasedTriggeringPolicy- size:指定每个日志文件大小,如果超过该大小,则生成新的日志文件DefaultRolloverStrategy - max 指定相同规则文件最多保留多少个,如果规则是root-%d{yyyy-MM-dd}-%i.log,那么此时是以天为单位记录,会依次生成root-2022-0原创 2022-05-07 14:31:40 · 4958 阅读 · 0 评论 -
【源码分析】SpringMVC-DispatchServlet初始化
发现DispathcheServlet中没有init方法,最终在HttpServletBean中找到了init方法,在init方法中调用了initBeanWrapper,而在该方法中调用了initWebApplicationContext,得到了一个ioc容器,具体研究一下这个方法即可。紧接着调用了本类的onRefresh方法,由于创建的是DispatchServlet,那么来到该类的这个方法,关键的核心就是在这,DispatcherServlet拿到容器以后,从容器中获取了各种组件,并进行了初始化。...原创 2022-07-19 21:42:59 · 208 阅读 · 0 评论 -
关于SpringAop创建的对象类型
测试一下没有任何Aop情况下的bean定义 UserServicepublic interface UserService { void saveUser(String user);}2.定义一个UserService的实现,并加入IOC容器@Servicepublic class UserServiceImpl implements UserService{ @Override public void saveUser(String user) { .原创 2022-04-09 22:21:05 · 442 阅读 · 0 评论 -
JDK动态代理
动态代理在不用编写class文件的情况下,利用JDK的反射机制,在程序运行期间,动态的创建出一个对象来代理目标对象。动态代理在设计上有点像装饰者模式、适配器模式。但不同就不同在“动态”二字。实现细节1.必须基于接口实现,也就是说被代理的类必须实现了某个接口2.动态代理对象只会是代理接口的实例和Proxy类的实例,而不是代理对象的实例。...原创 2022-04-05 20:08:30 · 526 阅读 · 0 评论 -
利用反射模拟创建一个Spring容器
定义两个注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface Component {}@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface AutoWired {}定义几个测试类@Componentpublic class UserMapper { }.原创 2022-03-07 21:44:53 · 305 阅读 · 0 评论 -
File类方法、获取指定目录下的指定文件
File类常用方法 @Test public void testFile() throws Exception { File file = new File("C:\\Users\\Administrator\\Desktop\\sql.txt"); System.out.println("file.getName() = " + file.getName()); //获取文件或目录名 System.out.println("file.getPa.原创 2022-03-02 21:15:05 · 1297 阅读 · 0 评论 -
JDK8StreamAPI
StreamApi中间操作 filter distinct skip limit map sorted peed终止操作 forEach allMatch noneMatch anyMatch findFirst findAny count max min分组与分区 partitioninng groupby收集操作 set list map原创 2022-02-28 21:37:29 · 192 阅读 · 0 评论 -
Optional类避免空指针问题
原始判空方式: if(user != null){ System.out.println(user) }JDK8封装了Optional类解决空指针问题创建Optional实例User u = new User();Optional<User> opUser = Optional.of(u); //of方法不能传入null,会抛出空指针异常Optional<User> opUser = Optional.ofNullable(u); // ofNullable允许原创 2022-02-28 11:58:28 · 1094 阅读 · 1 评论 -
SpringCore获取方法形参名
依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId></dependency>使用 LocalVariableTableParameterNameDiscoverer localVariableTableParameterNameDiscoverer = .原创 2022-01-04 17:28:52 · 994 阅读 · 0 评论 -
利用ThreadLocal实现不同方法的值获取
假设有这么个需求,用户登录系统以后,将用户的token存入浏览器的本地存储,每次发送请求时将用户token携带上,方便后台控制层或业务层获取,那么此时可以有什么解决方案?利用拦截器获取请求头中的token,然后将token存入请求域中,然后将这个request传入controller,controller再传给service,其实这里也不用再将token存入请求域,我们可以直接将这个request传入service,这样看起来也确实可以,但是假如业务方法很多,每个方法都需要token,难道还需要每个方原创 2021-11-30 21:49:32 · 1837 阅读 · 0 评论 -
一文搞懂Java的ClassPath
声明:本文是作者在独立思考和实验后发布,如有不正确的地方,请多指正。创建一个空的maven项目myBoot,编写一段测试代码package com.lhb.rc;public class DateTest { public static void main(String[] args) throws Exception{ System.out.println("test"); }}运行结果查看idea执行的完整的java.exe..原创 2021-11-24 22:01:41 · 4894 阅读 · 5 评论 -
SpringBoot使用Log4j2
log4j2日志组件SpringBoot使用log4j2原创 2021-11-21 22:02:42 · 509 阅读 · 0 评论 -
JUL日志配置
JUL日志组件大体执行过程原创 2021-11-20 20:31:46 · 1212 阅读 · 0 评论 -
基于Axios和Jquery的文件上传
Jquery上传jquery文件时,后端好像并没有经过SpringMVC处理,没有被封装成一个MultiPartFIle对象,可通过原生的Servlet API request.getInputStream()获取。至于为什么没被SpringMVC封装成MultipartFile对象目前还没有研究透彻。可能是请求内容类型没有设置成 multipart/form-data。下面是jquery上传文件的代码示例,文件名,文件大小等参数可通过拼在url后面使用request.getParameter()获取。原创 2021-11-19 20:27:28 · 670 阅读 · 0 评论 -
使用ByteArrayOutputStream解决输出乱码问题
先来看一段看似没问题的代码这是一个使用utf-8编码的文本内容,下面使用输入流读取文件内容,打印到控制台。 FileInputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\char.txt"); byte[] bytes = new byte[1024]; int read = is.read(bytes); while (read != -1){.原创 2021-10-23 21:49:41 · 9642 阅读 · 0 评论 -
JDBC的理解
概述JDBC是sun公司提供的一套Java程序访问数据库的接口API,只提供接口,而不提供实现,具体的实现由数据库厂商提供。这样使得Java开发人员在操作数据库时,只需要面向统一的接口编程,而不需要关注底层的细节,同时,也大大提高了我们程序的可移植性,如果将来由某种数据库切换为另一种数据库,则只需要修改少量的配置代码和切换一下驱动,就可以实现数据库的切换,因为整个过程是面向的接口编程,程序中没有出现任何的第三方的API。同时,由于各个驱动实现了同一套JDBC规范,在真正创建驱动对象时,其实是创建的第三方实原创 2021-09-19 13:26:06 · 189 阅读 · 0 评论 -
mybatis动态sql问题
List<User> selectUserByIf(String age); select * from user where 1 = 1 and <if test="age == 0"> </if>mybatis的动态sql在进行if判断时如果出现 xxx == ‘0’ 或者 xxx == 0的情况,mybatis会把xxx的值转为int类型比较,就是说等号两边若出现了数字型,则mybatis就会把另一边也转为数字。所以这个age参数如果传的是一个非数字类原创 2021-07-17 09:07:50 · 185 阅读 · 0 评论