
Java
文章平均质量分 76
Java相关知识以及踩坑的记录。
Evan Wang
终身学习者,优快云博客专家,系统架构师,AWS、阿里云认证云架构师,精通云原生、Spring生态、微服务、分布式体系等相关技术,擅长解决高并发场景下,各种技术问题。
展开
-
CompletableFuture的使用
现在大部分的CPU都是多核,我们都知道想要提升我们应用程序的运行效率,就必须得充分利用多核CPU的计算能力;Java为我们提供了大量多线程API,使用它们可以让我们的代码避免同步阻塞,从而达到提升运行效率的目的,CompletableFuture就是其中一个非常强大且重要API,下面我们就来介绍一下CompletableFuture的概念和使用。原创 2023-03-20 15:42:05 · 10046 阅读 · 0 评论 -
@AliasFor的使用方法
注意,我们需要在MyCombinedAnnotation中加上@MyAnnotation1、@MyAnnotation2、@MyAnnotation3三个注解,表示这个新注解中包含了这三个注解的所有属性,可以通过@MyCombinedAnnotation来代替这三个注解的使用。当然,你也可以理解为将一个注解上的属性值传递给另一个注解,我个人更习惯采用这种理解,因为后续可以通过一个注解组合多个注解进行使用,通过一个注解将值传递给多个注解,而这与java的继承的概念并不相同。原创 2023-03-07 12:48:13 · 3174 阅读 · 2 评论 -
flyway的快速入门教程
一、简单介绍 Flyway是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。 在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。flyway官方文档https://flywaydb.org/documentation/二、为什么要使用flyway.原创 2022-04-12 21:35:45 · 41503 阅读 · 15 评论 -
分布式锁的介绍和实现(附源码)
在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理。但是,普通的锁只能在单机的情况下使用。如果业务发展,需要做集群,一个应用需要部署到几台机器人然后做负载均衡,如下图所示:...原创 2022-03-09 20:27:16 · 1324 阅读 · 0 评论 -
BeanFactory和FactoryBean区别
一、BeanFactory1、简单介绍这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一套规范,给IOC容器提供了一套完整的规范,比如我们常用到的getBean方法等。进入到这个类,我们可以看到如下注释,意思是:访问Spring bean容器的根接口。2、定义方法getBean(String name): Spring容器中获取对应Bean对象的方法,如存在,则返回该对象。 containsBean(String name):Spring容器中是否存在该原创 2022-02-07 17:41:43 · 3593 阅读 · 1 评论 -
关于Java代码中的日志处理规范
一、使用slf4j使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。实现方式统一使用: Logback框架。二、打日志的正确方式1.什么时候应该打日志当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支。经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程。2.基本格式必须使原创 2020-06-03 22:32:23 · 893 阅读 · 0 评论 -
基于spring mvc的Restful API示例
在之前的文章中我们介绍了如何理解RESTful API,这里为了让大家更好的理解restful架构风格,开始之前先介绍几个spring mvc的注解:@RestController 我们通常使用ajax+json实现restful架构风格,请求和响应的数据都使用json格式,那就需要在controller的每个方法上加上@ResponseBody来标注该方法返回值放到响应体中,这样就不太方...原创 2018-12-25 16:11:02 · 877 阅读 · 2 评论 -
什么是RESTful API?
提到RESTful API 大家势必或多或少听说过。但是什么是RESTful API ?如何理解RESTful API 呢?请大家耐心读完这篇文章,相信您读完后一定会有一个更好的理解。我个人认为,要弄清楚什么是RESTful API,首先要弄清楚什么是REST。REST 全称:REpresentational State Transfer,英文翻译过来就是“表现层状态转化”。如果...原创 2018-12-25 16:01:42 · 104204 阅读 · 15 评论 -
使用新版本EasyExcel优雅的导入和导出Excel文件
一、需求描述最近系统后台有个关于使用Excel文件导出数据的需求,首先想到了POI和阿里的EasyExcel。经过技术选型和结合具体场景,最终决定使用EasyExcel。使用过程中,遇到了一些问题,然后去查找资料,发现大多数资料都比较老旧,都是使用1.x或者一些beta版本,没办法就自己去亲自去查阅资料,为了方便后续使用,在此记录一下,也和大家分享一下,如何优雅的使用EasyExcel导入和导...原创 2020-04-02 15:00:29 · 10460 阅读 · 4 评论 -
常用的正则表达式及校验工具
一、校验数字的表达式数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$ 正数、负数、和小...原创 2020-02-05 13:06:43 · 484 阅读 · 0 评论 -
@JsonFormat与@DateTimeFormat注解的使用
最近做开源项目,持久层使用了Spring Data JPA。前面一篇文章介绍过@CreatedDate和@LastModifiedDate的使用,有兴趣的可以先去看下那篇文章。通过前面的注解实现了自动插入时间,这里获取显示时间却又出了问题。所以特此来介绍下这两个注解。一、@JsonFormat注:这个注解来自jackson。使用前需要导入Jackson依赖,但是如果你使用的是spring...原创 2020-01-12 17:32:21 · 1815 阅读 · 0 评论 -
Function.identity()的使用详解
一、Function.identity()简单介绍当我们使用Stream时,要将它转换成其他容器或Map。这时候,就会使用到Function.identity()。Stream<String> stream = Stream.of("This", "is", "a", "test");Map<String, Integer> map = stream.collect(...原创 2020-01-12 00:41:52 · 61972 阅读 · 5 评论 -
BlockQueue线程容器的使用
blockQueue 作为线程容器、阻塞队列,多用于生产者、消费者的关系模式中,保障并发编程线程同步,线程池中被用于当作存储任务的队列,还可以保证线程执行的有序性。一、常用方法1.生产add(obj):往队列里面增加一个对象,如果队列没有空间抛出异常,反之返回true。offer(obj): 往队列增加一个对象,返回true/false。put(obj): 往队列增加一个对象,如果...原创 2020-01-02 10:14:09 · 648 阅读 · 0 评论 -
TimeUnit的使用
此时正进行西班牙国家德比,而我在中场休息时间还不忘记写篇博客,我真的是敬业哦 : )一、TimeUnit简单介绍TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段。顺便膜拜下大神Doug Lea。主要是用来做不同粒度的时间转换。二、使用介绍1、时间粒度转换public long toMillis(long d) ...原创 2019-12-19 04:08:48 · 592 阅读 · 0 评论 -
isAssignableFrom与instanceof的区别
在看spring源码时候,可以频繁的看到用isAssignableFrom()方法做判断,这里记录一下。顺便比较下与instanceof的区别。一、isAssignableFrom假设有两个类Class1和Class2。Class1.isAssignableFrom(Class2)表示:类Class1和Class2是否相同。 Class1是否是Class2的父类或接口。调...原创 2019-12-09 23:53:27 · 8946 阅读 · 1 评论 -
java中new一个对象要经历哪些过程
我们要了解new一个对象经历哪些过程,就要知道new对象之前会做什么事情。首先Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名将对象所属的.class文件加载到内存中。加载并初始化类完成后,再进行对象的创建工作。我们先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。一、类加载过程(...原创 2019-11-12 13:17:30 · 5580 阅读 · 0 评论 -
Java中自定义注解的使用详解
一、注解的概念1.注解的概念注解是一种元数据形式。即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。 注解用来修饰,类、方法、变量、参数、包。 注解不会对所修饰的代码产生直接的影响。2.注解的使用范围注解又许多用法,其中有:为编译器提供信息- 注解能被编译器检测到错误或抑制警告。编译时和部署时的处理- 软件工具能处理注解信息从而生成代码,XML文件等等。运行时...原创 2019-11-06 18:42:45 · 9318 阅读 · 0 评论 -
实体类为什么要实现Serializable接口
一、序列化相关概念介绍1.什么是序列化序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象;序列化保存对象转态,不保存静态变量。即把Java对象转换为字节序列的过程。2.什么是反序列化把字节序列恢复为Java对象的过程。...原创 2019-11-06 13:42:28 · 788 阅读 · 0 评论 -
使用CGLIB enhancer实现类的增强
今天在读spring源码的时候,比较深入如的研究了一下@Configuration注解。发现@Configurtion注解的类,实际实现了CGLIB动态代理,这个后续会写一篇博客专门说明。这里简单的记录下CGLIB动态代理的使用。一、使用CGLIB代理需要注意的问题如果类是抽象类,只能调用已实现方法方法,如果调用抽象方法的时候会报java.lang.AbstractMethodErr...原创 2019-10-31 16:31:56 · 1463 阅读 · 0 评论 -
JDBC中PreparedStatement接口提供的execute、executeQuery和executeUpdate之间的区别及用法
用惯了orm框架,今天在对一个开源项目做扩展的时候,发现个方法放回的数据有问题,debug追到底层jdbc代码,发现有些东西记得不够清楚,特在此记录,温故而知新。一、方法简介PreparedStatement接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。一般的使...原创 2019-10-28 21:29:56 · 3160 阅读 · 0 评论 -
JDK动态代理Proxy.newProxyInstance和InvocationHandler
一、关于动态代理1.什么是动态代理,有什么优势?主要用来做方法的增强,让你可以在不修改源代码的情况下,增强一些方法,在方法执行前后做任何你想做的事情(甚至根本不去执行这个方法),因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象,具体应用的话,比如可以添加调用日志,做事务控制等。动态代理是设计模式当中代理模式的一种。动态,指的是代...原创 2019-10-16 21:02:10 · 1922 阅读 · 3 评论 -
System.getenv()和System.getProperty()
一、方法使用介绍Java提供了System类的静态方法getenv()和getProperty()用于返回系统相关的变量与属性,getenv()方法返回的变量大多于系统相关,getProperty()方法返回的变量大多与java程序有关。System.getenv()方法是获取指定的环境变量的值。 System.getenv(String str)接收参数为任意字符串,当存在指定环境...原创 2019-10-15 18:28:03 · 4886 阅读 · 0 评论 -
SpringBoot获取容器中注入的Bean
我们都知道在new出来的类中,是无法注入其他类的。因为Spring IOC的必要条件就是,要把当前类托管给Spring才行。所以我们要换个思路,如果要在我的当前类中注入其他类(使用自动注入),那么就意味着我们不能采取new的方式,而且要把当前类托管给Spring。这就引出了一系列的知识,例如:1.如何把当前类托管给Spring ? 2.托管了以后,不能采用new的方...原创 2019-10-04 22:55:38 · 1883 阅读 · 0 评论 -
StringBuilder的清空方法及其效率比较
平时会用StringBuilder做字符串的频繁拼接,有些时候,在循环中拼接完字符串后需要将StringBuilder清空,然后从循环开始再次拼接。这里介绍一下StringBuilder的清空方法,及其性能比较。注意:我发现网上很多关于清空方法和效率比较的问题,都是复制一篇文章。链接:Java中StringBuilder的清空方法比较然后得出下面的效率上 2优于3优于1。...原创 2019-09-29 16:57:13 · 7316 阅读 · 0 评论 -
bean注入失败原因总结:NoSuchBeanDefinitionException: No qualifying bean of type
问题描述:Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.test.service.PersonService' available.bean注入失败,可以分为两种情况:第一种,即要注...原创 2019-10-09 21:32:47 · 46943 阅读 · 1 评论 -
Java中newInstance()和new()的区别
在Java开发开发中,我们经常会用到Class.forName( )这个方法。通过查询Java相关文档我们了解到使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象,以便后续操作。因此,仅使用Class.forName( )来动态加载类是不够的,我们的最终目的是为了实例化对象。那么这里我们就...原创 2019-10-10 16:47:35 · 458 阅读 · 0 评论 -
关于newInstance()方法有参数和无参数
一、通过反射创建新的类实例的两种方式:Class.newInstance() Constructor.newInstance()二、两种创建方式的比较:Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; Constructor.newInstance() 可以根据传入的参数,调用任意构造函数。Class.newInstance()...原创 2019-10-10 17:43:26 · 6891 阅读 · 0 评论 -
Java程序编译和运行的过程
转载自:https://www.cnblogs.com/qiumingcheng/p/5398610.htmlJava整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程。 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。因为java程...转载 2019-01-15 10:12:47 · 3050 阅读 · 0 评论 -
run()方法和start()方法的区别
一、start()和run()方法的区别:1、start方法用来启动相应的线程;2、run方法只是thread的一个普通方法,在主线程里执行;3、需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;4、run方法必须是public的访问权限,返回类型为void。二、进一步的理解线程的run()方法是由java虚拟机直接调用的,如果我们没有...原创 2019-09-15 12:58:55 · 14310 阅读 · 0 评论 -
如何优化代码中大量的if/else
日常我们在写代码或者读代码时,有时会发现代码中存在大量的if/else。甚至会嵌套多层,这样会大大降低代码的可读性,使得代码维护起来费时费力。那么有什么方案可以优化代码中大量的if/else呢,下面就给大家简单的介绍几种方法。1. 提前return在写判断条件时,选择取反判断,这样的话代码在逻辑表达上会更清晰,看下面代码:if (condition) { // do somet...原创 2019-09-14 17:33:43 · 5482 阅读 · 0 评论 -
Java后端技能树
原创 2019-04-25 21:43:23 · 941 阅读 · 0 评论 -
java中遍历Map的几种方法
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点先初始化一个mappublic class TestMap { public static Map<Integer, Integer> map = new HashMap<Integer, Intege...原创 2019-03-10 19:46:15 · 128 阅读 · 0 评论 -
JVM的内存结构
JVM内存结构:1:java堆(Heap)java堆是java内存中最大的一块,被所有线程共享,在虚拟机创建时创建,堆的唯一目的就是存放对象实例。java堆是垃圾收集器管理的主要区域,所以又被叫为GC堆,现在收集器基本都是采用分代收集算法,所以java堆很可以细分新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间2:方法区(Met...原创 2019-03-03 15:09:52 · 750 阅读 · 0 评论 -
理解String的compareTo()方法
因为觉得自身基础不牢固,所以最近在看《core java》,经常发现一些自己理解不够的知识,在此记录下。有兴趣的朋友也可以看看这本书,非常不错。compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值。如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符作比较,也是返回差...原创 2019-02-14 10:18:54 · 1147 阅读 · 0 评论 -
JDK1.7 文件I/O:Path 类用法说明
在NIO.2的文件 I/O 中,Path是必须掌握的关键类之一。Path通常代表文件系统中的位置,比如 C:\Windows\System32 什么是根目录、绝对路径和相对路径比如说,代码要读取位于 /java7dev/src/main/Demo.java目录下的文件名。根路径为 /java7dev 绝对路径为 /java7dev/src/main/ 进入到 绝对路径下 可使...原创 2019-02-18 17:55:42 · 593 阅读 · 0 评论 -
使用try/catch和throws的原则和常见场景
try/catch是java程序员经常用的程序块,怎么用,什么时候catch异常,什么时候抛出异常?用不好,程序可能会有致命性错误。下面我们就来简单的介绍一下。使用的基本原则: 对异常的处理,两种方式,一是添加 throws exceptions,向上抛出,交由方法的调用方处理该异常;二是使用try/catch块,捕捉异常,自己处理。 选择哪...原创 2019-01-10 11:59:05 · 2350 阅读 · 0 评论 -
java中final修饰类、变量、方法
final修饰特点:修饰类,类不能被继承 修饰变量,变量就变成了常量,只能被赋值一次 修饰方法,方法不能被重写 public static final double PI=3.14; final 一般跟static一起用! final class person { //final修饰类 不能被继承String name ;int age;publ...原创 2019-01-14 11:09:15 · 1018 阅读 · 0 评论 -
fastJson常用方法总结
1、了解json json就是一串字符串 只不过元素会使用特定的符号标注。 {} 双括号表示对象 [] 中括号表示数组 "" 双引号内是属性或值 : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象) 所以 {"name": "Kobe"} 可以理解为是一个包含name为Kobe的对象 而[{"name": "Michael"},{"name":原创 2018-12-19 10:38:58 · 477 阅读 · 0 评论 -
转发和重定向详解
转发转发是指浏览器发送请求到servlet1之后,servlet1需要访问servlet2,因此在服务器内部跳转到的servlet2,转发有时也称为服务器内跳转。整个过程浏览器只发出一次请求,服务器只发出一次响应。所以,无论是servlet1还是servlet2,整个过程中,只存在一次请求,即用户所提交的请求。因此servlet1和servlet2均可从这个请求中获取到用户提交请求时所携带的相...原创 2018-12-22 10:44:08 · 9179 阅读 · 0 评论 -
解决警告:spring mvc No mapping found for HTTP request with URI错误的方法
今天学习spring MVC的时候,引入了jquery。死活访问不到,控制台里有个警告,然后再谷歌浏览器里面发现错误 Failed to load resource: the server responded with a status of 404 ().Uncaught ReferenceError: $ is not defined.如图: 话不多说,重点来了:...原创 2018-10-26 18:05:57 · 1391 阅读 · 0 评论