![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后台开发 java
TonyPaPa
这个作者很懒,什么都没留下…
展开
-
kotlin SpringBoot 使用自定义注解(或AOP)后,成员属性NPE问题
在用kotlin写的SpringBoot项目中,在其中一个方法上使用了自定义注解,出现类内@Autowired注入的成员属性NPE问题原创 2020-12-15 16:56:49 · 527 阅读 · 0 评论 -
kotlin使用AOP要注意的点
在kotlin中强调一种显式的声明,比如一个类要想被继承就要显式地写出open,否则一个类默认就是final类型的,这点和Java是不同的。在SpringBoot项目(和Spring有关的)中使用kotlin并使用AOP,此时要注意,Spring中AOP的实现是动态代理,动态代理有两种方式:1.jdk动态代理 2.cglib动态代理, 不管使用哪种方式,需要类是可继承的,否则无法生成代理,所以需要将所切的类和方法上加上open,不然会造成AOP相关注解不起作用的现象。...原创 2020-12-01 21:20:07 · 1223 阅读 · 0 评论 -
Springboot测试过程中遇到的404 not found
简要说明一下背景,项目后端使用了SpringBoot,并且是多人合作的方式,通过git进行版本管理,分pc端和小程序端。我负责的小程序端。之前已进行过全部测试,现将项目部署到线上服务器再做最后测试。这几天前端在测试项目小程序端接口的时候遇到了404,而pc端的接口却没有问题,百思不得其解,一开始我看到404以为是没有找到接口即路径不对,之后一直在这个方向找原因,耽误了不少时间,后来发现不对劲,如果是404 not found路径不对的话应该是访问不到接口的,而我随意传参测试发现返回了我自定义的参数不正确原创 2020-11-19 10:43:04 · 3438 阅读 · 0 评论 -
Java线程池实现原理及线程复用
先来看看线程池的类图(借用了别人的图):可以看到,Executor是顶层的一个接口,线程池的实现类是ScheduledThreadPoolExecutor和ThreadPoolExecutor,而Executors是一个工具类,用于创建实际的线程池,接下来看看源码。点进源码查看(是 JDK1.8 版本加入的一种线程池,stealing 翻译为抢断、窃取的意思,它实现的一个线程池和上面4种都不一样,用的是 ForkJoinPool 类),以CachedThreadPool为例:可以原创 2020-10-04 21:23:04 · 591 阅读 · 0 评论 -
ReentrantLock中acquireQueued关于挂起,中断的一些理解
熟悉ReentrantLock获取锁流程的小伙伴们应该能看懂下面的步骤,如果不熟悉的话可能会有点懵acquireQueued在acquire方法里,当获取锁失败时会进入此方法当shouldParkAfterFailedAcquire()返回true的时候,会进入parkAndCheckInterrupt()方法parkAndCheckInterrupt()方法:看到LockSupport.park(this)进行了线程的挂起,这里不讨论底层如何实现挂起的现在关注关于int原创 2020-09-17 21:39:27 · 3616 阅读 · 9 评论 -
SpringBoot2.2 配置druid连接池
SpringBoot2.2默认使用的连接池是HikariCPDruid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。这里不进行两者的对比分析,单纯讲如何配置druid连接池1.添加依赖添加druid还有另一种,其它与下面相同,<artifactId>换成<artifactId>druid</artifactId>,好像说不用star原创 2020-07-29 21:38:42 · 1602 阅读 · 0 评论 -
Springboot2.2.2 读写excel
pom.xml引入依赖可能版本有更新代码接下来直接贴代码了,代码里都有注释,我写的是最基本的读写情况,根据自己实际需要增加即可代码直接写在了控制器里,想要更规范的需要自行写成一个工具类或者service中读excel @PostMapping("test") public void test(@RequestParam(value = "excel_file",re...原创 2020-04-06 22:38:31 · 543 阅读 · 0 评论 -
JVM类加载 + clinit理解
Java虚拟机通过装载、连接和初始化一个类型,使该类型可以被正在运行的Java程序使用。1.装载:把二进制形式的Java类型读入Java虚拟机中。2.连接:把装载的二进制形式的类型数据合并到虚拟机的运行时状态中去。 1. 验证:确保Java类型数据格式正确并且适合于Java虚拟机使用。 2. 准备:负责为该类型分配它所需内存。 3. 解析:把常量池中的符号引用转换为直接引用。(可推迟到运行中的...原创 2020-03-16 22:13:54 · 410 阅读 · 0 评论 -
jdk1.8 JVM内存模型
Hotspot虚拟机 jdk1.7 JVM内存模型是这样的jdk1.8 做出了些改变做出的改变有:jdk1.8取消了永久代,在jdk1.7及之前的Hostspot虚拟机永久代实现了方法,取而代之的是元空间(Metaspace),补充一点:方法区只是JVM规范,方法区为具体实现,元空间也是绝大多数的类元数据的空间都在本地内存中分配字符串常量池移至堆内存,其他内容包括类元信息、字段、静态...原创 2020-03-01 00:28:00 · 2392 阅读 · 2 评论 -
Java8 String.intern()
在 JAVA 语言中有 8 中基本类型和一种比较特殊的类型 String 。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个 JAVA 系统级别提供的缓存。在 JDK6 及以前的版本中,运行时常量池是放在永久代。在 JDK7 及之后的版本中,运行时常量池从永久代移到堆区域String 类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声...原创 2020-02-27 11:45:30 · 952 阅读 · 0 评论 -
SpringBoot2.2.2 配置redis+jedis
因项目业务需要,所以使用上redis在 springboot 1.5.x版本的默认的Redis客户端是 Jedis实现的,springboot 2.x版本中默认客户端是用 lettuce实现的。先来看看lettuce和redis的区别关系Lettuce 和 jedis 的都是连接 Redis Server的客户端,Jedis 在实现上是直连 redis server,多线程环境下非线程安全,...原创 2020-02-23 01:15:29 · 3485 阅读 · 0 评论 -
SpringBoot2.2.2 发送邮件
pom.xml添加依赖这里要注意,原本以为SpringBoot会自动匹配版本,所以一开始没添加,然后运行报错了java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger查阅Stack Overflow后得到答案,需要明确版本并且版本要最新的,查maven依赖最新版本可在这里查接下来的直接上代码// 服务器地址: ...原创 2020-02-19 23:17:28 · 392 阅读 · 0 评论 -
算法 查找算法总结
总结一下各种查找算法的性能下表:各种符号表实现的渐进性能的总结算法(数据结构)最坏情况的运行时间的增长数量级(N次插入后) 查找 插入平均情况下的运行时间的增长数量级(N次随机插入之后) 查找命中 插入关键接口内存使用(字节)顺序查找(无序链表)N NN/2 Nequals()48N二分查找(有序数组)lgN NlgN N/2compare...原创 2020-02-16 23:21:42 · 150 阅读 · 0 评论 -
Nginx 500 Internal Server Error nginx/1.10.3 ubuntu
一个上线的项目,最近产品反映有一个接口用户反馈说不能用了,前端跟我说接口返回500,这个bug我解决了好几天,这里记录一下排查解决过程简单介绍一下情况,这个接口是一个上传用的接口,包含一张图片1.我最开始使用postman进行测试,发现成功,没有报错而前端说报错2.让前端检查端口是否写错了,检查后前端没有写错3.让前端截图,他用postman测试都不通过,发现参数不带图片确实访问到了准确的...原创 2020-02-09 13:19:05 · 2156 阅读 · 0 评论 -
Java开发手册 异常日志,安全规约,MySQL数据库,工程结构
本文的规范摘自阿里的JAVA开发手册,并记录下需要提醒我本人注意的规范(并不全),仅供大家参考目录异常日志(一)异常处理(二)日志规约单元测试安全规约MySQL数据库(一)建表规约(二)索引规约(三)SQL语句(四)ORM映射工程结构服务器异常日志(一)异常处理【强制】异常不要用来做流程控制,条件控制。说明:异常设计的初衷是解...原创 2020-02-07 22:15:32 · 220 阅读 · 0 评论 -
Java开发规范 编程规约(Java开发手册)
本文的规范摘自阿里的JAVA开发手册,并记录下需要提醒我本人注意的规范(并不全),仅供大家参考目录(一)命名风格(二)常量定义(三)代码格式(四)OOP规约(五)集合处理(六)并发处理(七) 控制语句(八)注释规约(九)其它(一)命名风格【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO /...原创 2020-02-07 21:55:15 · 549 阅读 · 0 评论 -
nested exception is java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as
使用带图片访问服务器的一个接口时(服务器使用了tomcat作服务器,使用了ssm框架),服务器直接500报错出现这个报错的原因是linux上未开启x server,我们需要在tomcat上配置一下,把它开起来需要加上JAVA_OPTS="-Djava.awt.headless=true"解释一下headlessHeadless模式是系统的一种配置模式。在系统可能缺少显示设备、键盘或鼠标这...原创 2020-02-05 13:22:24 · 10310 阅读 · 2 评论 -
Java 静态代码块,构造代码块和构造方法执行顺序的理解
静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次输出结果为:可以看到静态代码块只执行了一次接下来看探讨静态代码块,构造代码块和构造方法间的执行顺序输出结果为:看到main方法中的第一行语句并不是最先被执行,同时也看到static块只会执行一次static块(静态代码块)可以置于类中的任何地方,类中可以有多个static块。它的执行优先级是最...原创 2020-01-25 21:23:13 · 1580 阅读 · 0 评论 -
SpringBoot2.2.2 logback配置+深层理解
SpringBoot采用的默认的日志框架就是slf4j+logback,所以配置的时候无需在pom.xml中添加依赖,我们只需要手动添加配置文件就好(即便不添加SpringBoot也默认开启了)启动项目的时候SpringBoot也会打印出日志现在来手动配置在resources目录下新建logback-spring.xml,这样命名加个spring后缀是为了可以使用SpringBoot的高级...原创 2020-01-10 23:34:07 · 3019 阅读 · 1 评论 -
Java 共变数组和类型擦除
共变数组(covariant array), 类型擦除(type erasure)数组的共変性如果类A是类B的基类,那么A[]是B[]的基类但泛型是不可变的(invariant)看一个例子:编译的时候没有报错(IDEA没有报红在写上这段代码的时候),因为数组是共变的,Object是String的基类,但运行时会报错类型擦除把上面的代码改成:IDEA就报红了,我们也强行运行一...原创 2020-01-09 11:37:30 · 507 阅读 · 1 评论 -
SpringBoot mybatis 启动类扫描dao层
SpringBoot需要在启动类上加上mapper的扫描,告诉启动类dao层接口的位置见下图红框为什么要这么加呢,因为不加的话自己写的dao层的mapper是不会装配成bean的,使用mapper的时候会报错,所以要让启动的时候扫描到。这里讲一下之前使用ssm的时候为什么“好像”没有这个操作,其实不是没有,而是我们把这个dao层mapper的装配写在了Spring的配置文件applicat...原创 2020-01-03 15:58:54 · 2156 阅读 · 0 评论 -
SpringBoot 连接mysql异常:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represent
使用SpringBoot连接mysql的时候报错了通过报错信息看到是时区的问题,原因是没有在application.properties设置好application.properties mysql的配置修改serverTimezone=GMT%2B8 (格林尼治标准时间,曾是世界时)也可以设置成其它时区如UTC(协调世界时,现作为世界标准时间使用)...原创 2020-01-02 10:35:46 · 2307 阅读 · 0 评论 -
SpringBoot mybatis整合(xml形式非注解)
这里讲一下SpringBoot如何与mybatis整合,包括使mvn mybatis-generator:generate创建项目的时候我只勾选了web,没有勾选mysql和mybatis,现在以这种创建项目来讲与mybatis的整合pom.xml添加依赖 <dependency> <groupId>mysql</groupId>...原创 2020-01-02 10:24:09 · 181 阅读 · 0 评论 -
SpringBoot @Controller,@RestController,@SpringBootApplication一点理解
SpringBoot @Controller和@RestController注解的区别@RestController注解相当于@ResponseBody + @Controller合在一起@ResponseBody相当于自动帮我们把返回序列化,如果在controller上用@RestController,那么这个controller里的方法都不能返回视图页面,如jsp等;如果controlle...原创 2019-12-31 17:11:41 · 650 阅读 · 0 评论 -
Java 自动装箱和拆箱
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型Java的类型分为两部分,一个是基本类型(primitive),如int、double等八种基本数据类型;另一个是引用类型(reference type),如String、List等。而每一个基本类型又各自对应了一个引用类型,称为包装类型(或装箱类型,boxed primitive)通过一个例子来理解,每个输...原创 2019-11-23 11:32:52 · 171 阅读 · 0 评论 -
ssm 单独使用@Transactional声明式事务管理
简单聊一聊ssm单独使用@Transactional(不配合AOP)要使用@Transactional注解要先进行以下配置在applicationContext.xml中(有的人关于mybatis的配置不是配在这个文件的,而是配在别的文件,再在applicationContext.xml中import进来),写上这一行配置好后我们需要在需要进行事务管理的类(实现service接口的类,不建...原创 2019-11-20 17:32:09 · 303 阅读 · 0 评论 -
IDEA ssm generatorConfig.xml 逆向自动生成配置使用
1.pom.xml<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> &...原创 2019-11-16 21:24:09 · 323 阅读 · 0 评论 -
SpringMVC @RequestParam注解
原始1.获取提交的参数2.对传入参数指定参数名2.1 通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传required=false的时候不传参数,会给参数赋值null。这里注意一个问题,当形参类型是int时会报错,因不能把null赋值给int类型,把int类型改为Integer即可解决问题2.2对传入的参数设置默认值注意的点...原创 2019-10-30 20:57:50 · 99 阅读 · 0 评论 -
maven project ssm部署到linux
我们将maven风格的ssm部署到linux上我仍然用centos7作为例子与j2ee部署到linux上相似,1,2,3,5的步骤都一样,可以参考我的上一篇博客所以上述1,2,3,5步骤这里就不重复了,这里讲4步骤4.maven project ssm部署到linux一般说来是先通过maven生成对应的war 文件,然后再把war文件部署到tomcat上去eclipse,I...原创 2019-10-18 22:32:42 · 300 阅读 · 1 评论 -
j2ee部署到linux
我用的是centos7,这里以centos7为例目录1.安装java2.安装tomcat3.MySQL安装4.部署j2ee项目5.云服务器安全组配置6.检验效果,能否成功运行j2ee项目1.安装javayum -y install java-1.8.0-openjdk.x86_64最后出现Complete! 就成功了//查看java版本java ...原创 2019-10-18 20:47:45 · 281 阅读 · 0 评论 -
IntelliJ IDEA tomcat配置原理理解
在用IntelliJ IDEA配置tomcat的时候发现项目部署在tomcat后,在tomcat安装目录/webapps下没有找到对应的项目目录,觉得不太理解 关于tomcat配置理解,可以看我另一篇博客先看看IDEA启动tomcat的信息发现 CATALINA_BASE和CATALINA_HOME的路径并不一样,在eclipse中配置tomcat两者是同一个目录。来看看这两个目录的意...原创 2019-10-16 19:57:31 · 1004 阅读 · 0 评论 -
tomcat配置 理解
Tomcat是一个JSP/Servlet容器。Tomcat目录tomcat|—bin Tomcat:存放启动和关闭tomcat脚本;|—conf Tomcat:存放不同的配置文件(server.xml和web.xml);|—doc:存放Tomcat文档;|—lib/japser/common:存放Tomcat运行需要的库文件(JARS);|—logs:存放Tomcat执行时的LOG文...原创 2019-10-12 19:20:58 · 297 阅读 · 0 评论 -
Java mybatis 循环遍历map
有次需要完成一个功能的时候sql语句用到id NOT IN一开始这个参数我在impl 用字符串拼接好了,如 (123,456,789)通过dao层的mapper传入xml,运行后,报错拉到下面看详细信息,Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in...原创 2019-09-27 15:03:34 · 2483 阅读 · 0 评论 -
Java String(Object) String.valueOf()和Object.toString的区别
java常用的String类型转换主要有一下三种:String(Object);Object.toString();String.valueOf();先来讲讲第一种,这是标准的类型转换,需要注意的是该类型能被转为String类型,否则会出现CalssCastException异常2.java.lang.Object类里有 .toString()方法,严格意义上的java对象...原创 2019-09-25 20:20:08 · 418 阅读 · 0 评论 -
Junit Spring 下的测试简单应用
junit在Spring下的简单测试我们要用到Spring下的注释,必须加上@RunWith(SpringJUnit4ClassRunner.class), 让测试运行于Spring测试环境@ContextConfiguration用来加载Spring配置文件直接上代码加上后才能使用Spring的注释,如@Autowired@Test注释是Junit包的,和Spring无关...原创 2019-09-24 14:29:26 · 98 阅读 · 0 评论 -
Spring AOP 之 通知、连接点、切点、切面
1:知识背景软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点。而为直切关注点提供服务的,就是横切关注点。2:面向切面的基本原理什么是面向切面编程横切关注点:影响应用多处的功能(安全、事务、日志)切面 (Aspect):横切关注点被模块化为特殊的类,这些类称为切面优点:每个关注点现在都集中于一处,而不是分散到多处代码中服务模...转载 2019-09-20 11:50:40 · 561 阅读 · 0 评论 -
Java String类型和null一点认识
先来谈谈Java中null是什么null是关键字,是区分大小写的,不能写成Null或NULL或其它null是所有引用类型的默认值,注意是引用类型,不是基本类型null既不是一种对象,是特殊的值,可以将null赋值给所有引用类型,但不能赋给基本类型,否则会在运行时报空指针异常当一个对象可能出现null值时,如果不对它进行处理,将会报错,所以要进行判断这里讲一讲String类型的判断,Str...原创 2019-09-15 17:39:00 · 2475 阅读 · 0 评论 -
jsp在本地编辑的跨域问题
假设我们有一个项目用Sping MVC, 跨域并不是在Spring里做,而是在nginx上做,那么当我们需要在本地编写jsp(网页)并在本地查看效果的时候就有可能会遇到跨域的问题(每次做好都丢到服务器上再查看实际上并不可能),又因为跨域是做在nginx上的,所以一些请求地址写成公网访问的地址就会有跨域的问题有一个方案不用在spring上做跨域,也不需要用网上的方法jsonp请求对象,我们把请求...原创 2019-09-13 15:38:07 · 312 阅读 · 0 评论 -
java 时间戳问题
先来说说时间戳的问题java使用的是unix timestamp,unix时间戳定义为从格林威治时间(GMT)1970/1/1 0:0:0秒起到现在的毫秒数。时间戳是不分地区的,地球的任意地方时间戳都是一样的,不存在时区问题,其实,操作系统内部的计时器也是这个标准的时间戳,只有在显示给用户的时候,才转换为字符串格式的本地时间。不同的编程语言都提供了获取生成时间戳的方法。时间戳可以看这里http...原创 2019-08-17 15:31:58 · 868 阅读 · 0 评论 -
java jdbc连接mysql
java连接mysql需要驱动包,官网下载地址解压后得到jar包,把包添加到所需要的项目里面对项目右键,选择build path->configure build path后1.注册jdbc驱动2.用DriverManager.getConnection创建一个数据库连接类的实例对象3.用connection对象创建一个 Statement 对象实例,用于执行sql语句4.返回...原创 2019-08-05 23:26:39 · 102 阅读 · 0 评论