祁娥安
我是一名90后程序员,终身学习者。 背景很普通,来自农村,毕业于一所普通大学。 没有光环,所以从大学起一路自学,大四开始做开发工作。 平时喜欢研究各种技术,目前在一家小厂从事前/后端开发工作。 爱好一切有趣的事物,热爱生活、热爱工作、热爱coding、热爱交朋友。在业内混迹多年, 酷爱各种技术,不论前端后端还是移动端,总之各种端。 平时喜欢看技术书籍、逛技术博客论坛、爱玩吉他唱歌和打篮球, coding,根本停不下来。 The Code Can Change The World.
展开
-
从Java到json:探索 Jackson 的魔力
你可以创建自定义序列化器和反序列化器以自定义特定字段或类的序列化和反序列化行为。为此,请创建一个实现JsonSerializer或JsonDeserializer接口的类,并在需要自定义的字段或类上使用@JsonSerialize和@JsonDeserialize注解。@Override// ...其他代码...Jackson的优势和局限性。原创 2024-03-21 18:35:39 · 212 阅读 · 0 评论 -
为什么要进行URL编码?
我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。针对“name1=value1&name2=value2”我们来说一下客户端到服务端的概念上解析过程:上述字符串在计算机中用ASCII吗表示为:6E616D6531 3D 76616C756原创 2021-11-27 20:36:07 · 655 阅读 · 0 评论 -
MyBatis 三种批量插入方式的比较,我推荐第3个
数据库使用的是SQLServer,JDK版本1.8,运行在SpringBoot环境下 对比3种可用的方式反复执行单条插入语句xml拼接sql批处理执行先说结论:少量插入请使用反复插入单条数据,方便。数量较多请使用批处理方式。(可以考虑以有需求的插入数据量20条左右为界吧,在我的测试和数据库环境下耗时都是百毫秒级的,方便最重要)无论何时都不用xml拼接sql的方式。拼接SQL的xmlnewId()是sqlserver生成UUID的函数,与本文内容无关<insert id="insert原创 2021-11-23 14:43:37 · 457 阅读 · 0 评论 -
private修饰的方法可以通过反射访问,那么private的意义是什么?
在一个类中,为了不让外界访问到某些属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的,这就是java反射带来的便利。利用反射访问类的私有属性及方法如下:/** * @Description: 反射 * @author: Mr_VanGogh */public class Reflect { private String name; private int age; p原创 2021-11-22 19:17:24 · 468 阅读 · 0 评论 -
进程间通信和线程间通信的几种方式及区别
进程和线程的区别:对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品。而线程,相对于进程而言,是一个更加接近于执行体的概念,可以和同进程的其他线程之间直接共享数据,而且拥有自己的栈空间,拥有独立序列。共同点:它们都能提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点。线程执行开销比较小,但不利于资源的管理和保护,而进程相反。同时,线程适合在SMP机器上运行,而进程可以跨机器迁移。他们之间根本区别在于 多进程中每个进程有自己的地址空间,线程则原创 2021-11-22 19:11:28 · 610 阅读 · 0 评论 -
JavaBean为什么要重写hashCode()方法和equals方法
记得有一次去面试Java软件开发工程师,面试官问了我一个关于JavaBean为什么要重写hashCode()方法和equals方法,我记得当时我巴拉巴拉半天就是没有说到重点,现在想一想归根到底还是我对这两个的理解不深刻,现在我特定来总结下:hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。一、我们为什么需要重写hashCode()方法和equals()方法?(Why)有时在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种原创 2021-11-22 19:09:18 · 309 阅读 · 0 评论 -
Springboot 解决跨域的四种姿势
简介跨域我就不多说了,我们今天开门见山直接解决跨域的几种姿势,那就上姿势姿势姿势一实现WebMvcConfigurer#addCorsMappings的方法import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.co原创 2021-11-20 21:31:41 · 258 阅读 · 0 评论 -
Docker + Intellij IDEA,提升10倍生产力
IDEA是Java开发利器,springboot是Java生态中最流行的微服务框架,docker是时下最火的容器技术,那么它们结合在一起会产生什么化学反应呢?一、开发前准备1.Docker安装可以参考:https://docs.docker.com/install/2.配置docker远程连接端口vi /usr/lib/systemd/system/docker.service 找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375,如下图所示3.重启doc原创 2021-11-19 20:17:13 · 333 阅读 · 0 评论 -
数据治理常犯的7个错误
相信,所有 CIO 都明白一个道理,如果数据治理失败,会给企业带来重大损失,包括财产损失、品牌名誉受损等,甚至会带来法律方面的风险。所以,如何制定一个强大的数据治理策略,以确保企业数据在满足安全和合规性要求的同时,更易于访问和管理,成为企业数字化转型过程中必修的一个课题。随着企业对数据重视程度的不断增加,数据治理解决方案越来越成熟,技术越来越先进。但不幸的是,仍有很多IT从业者,正陷入数据治理的泥潭中,无法自拔。为了帮助更多企业解决数据治理难题,本文梳理了7个常犯的错误。把数据治理视为一个技术项目数据原创 2021-11-19 19:56:04 · 2037 阅读 · 0 评论 -
Http 会话Cookie与Session
Cookie技术会话数据保存在浏览器客户端。Cookie类:用于存储会话数据1.构造Cookie对象Cookie(java.lang.String name, java.lang.String value)2.设置cookievoid setPath(java.lang.String uri) :设置cookie的有效访问路径void setMaxAge(int expiry) : 设置cookie的有效时间void setValue(java.lang.String newValue原创 2021-11-17 21:38:18 · 482 阅读 · 0 评论 -
从 Spring 的环境到 Spring Cloud 的配置
需求不知不觉,web 开发已经进入 “微服务”、”分布式” 的时代,致力于提供通用 Java 开发解决方案的 Spring 自然不甘人后,提出了 Spring Cloud 来扩大 Spring 在微服务方面的影响,也取得了市场的认可,在我们的业务中也有应用。前些天,我在一个需求中也遇到了 spring cloud 的相关问题。我们在用的是 Spring Cloud 的 config 模块,它是用来支持分布式配置的,原来单机配置在使用了 Spring Cloud 之后,可以支持第三方存储配置和配置的动态修原创 2021-11-15 17:50:34 · 770 阅读 · 0 评论 -
JAVA内存模型与线程
主内存与工作内存java内存模型规定了所有的变量都存储在主内存(Main Memory)中。每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。线程间变量值的传递均需要通过主内存来完成。内存间交互操作lock(锁定)作用于主内存的变量,把一个变量标识为一条线程独占的状态unlock(解锁)作用于主内存的变量,把一个处于锁定状态的变量释放出原创 2021-11-13 11:14:38 · 1071 阅读 · 0 评论 -
写时复制(Copy-On-Write)在Java中是如何被应用的吗?
前言写时复制(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这个过程对其他的调用者是透明的(transparently)。此作法的主要优点是如果调用者没有修改该资源,就不会有副本(private copy)被建立原创 2021-11-12 11:06:36 · 985 阅读 · 0 评论 -
Java类加载过程梳理
最近在看Java虚拟机,正好看到类加载这块,所以简单记录下所学到的知识,作为笔记。首先,我们编写好的Java代码,经过编译变成.class文件,然后类加载器把.class字节码文件加载到JVM中,接着执行我们的代码,最后将类卸载出JVM。而从类加载到虚拟机到卸载出虚拟机的这一整个生命周期总共可以分为7个步骤,分别为加载、验证、准备、解析、初始化、使用和卸载,其中验证、准备和解析又称为连接阶段。接下来简单介绍下各个阶段是干嘛的。加载是“类加载”的第一个阶段,就是将需要用到的类对应的.class字节码文件加原创 2021-11-11 16:06:23 · 608 阅读 · 0 评论 -
再见MybatisPlus,阿里推出新ORM框架
使用fluent mybatis也可以不用写具体的 xml 文件,通过 java api 可以构造出比较复杂的业务 sql 语句,做到代码逻辑和 sql 逻辑的合一。不再需要在 Dao 中组装查询或更新操作,或在 xml 与 mapper 中再组装参数。那对比原生 Mybatis,Mybatis Plus 或者其他框架,FluentMybatis提供了哪些便利呢?需求场景设置我们通过一个比较典型的业务需求来具体实现和对比下,假如有学生成绩表结构如下:create table `student_scor原创 2021-11-08 22:10:47 · 470 阅读 · 0 评论 -
Spring Boot 进行优雅的字段校验
前段时间提交代码审核,同事提了一个代码规范缺陷:参数校验应该放在controller层。到底应该如何做参数校验呢?Controller层 VS Service层去网上查阅了一些资料,一般推荐与业务无关的放在Controller层中进行校验,而与业务有关的放在Service层中进行校验。那么如何将参数校验写的优雅美观呢,如果都是if - else,就感觉代码写的很low,还好有轮子可以使用常用校验工具类使用Hibernate Validate引入依赖<dependency>原创 2021-11-08 10:26:33 · 401 阅读 · 0 评论 -
Java类(接口)的新类型——密封类
密封类是Java 17正式支持的一个新特性,它让Java中类的继承可以更加细粒度的进行控制。今天就来认识一下这个新的功能。密封类在以往的Java类继承中,Java类的继承控制非常有限,仅能通过final关键字和访问控制符来控制类的继承。例如final类无法被集成;包私有类仅仅只能在该包下进行继承。这显然是不够的。如果一个功能只允许出现在Phone和Pad上,不允许出现在Computer上。如果不对该功能的继承实现进行限制,开发人员将很容易滥用该功能的实现类,错误地重用一些代码。这就是密封类产生的原因。原创 2021-11-07 19:05:10 · 214 阅读 · 0 评论 -
一次 QPS 翻倍的 Java 服务性能优化
| 背景前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了。在很低的 QPS 压力下服务器 load 就能达到 10-20,CPU 使用率 60% 以上,而且在每次流量峰值时接口都会大量报错,虽然使用了服务熔断框架 Hystrix,但熔断后服务却迟迟不能恢复。每次变更上线更是提心吊胆,担心会成为压死骆驼的最后一根稻草,导致服务雪崩。在需求终于缓下来后,leader 给我们定下目标,限我们在两周内把服务性能问题彻底解决。近两周的排查和梳理中,发现并解原创 2021-11-07 15:41:42 · 257 阅读 · 0 评论 -
为什么IDEA不推荐你使用@Autowired ?
@Autowired注解相信每个Spring开发者都不陌生了!在DD的Spring Boot基础教程(https://blog.didispace.com/spring-boot-learning-2x/)和Spring Cloud基础教程(https://blog.didispace.com/spring-cloud-learning/)中也都经常会出现。但是当我们使用IDEA写代码的时候,经常会发现@Autowired注解下面是有小黄线的,我们把小鼠标悬停在上面,可以看到这个如下图所示的警告信息:.原创 2021-11-06 14:17:43 · 659 阅读 · 0 评论 -
SpringBoot中实现通用Auth认证的几种方式
前言最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大,代码方面不明显,但感觉自己抹掉了 java、Tomcat、Spring 一直挡在我眼前的一层纱。对它们的理解上了一个新的层次。挑一个方面总结一下,希望在梳理过程中再了解一些其他的东西。由于 Java 繁荣的生态,下面每一个模块都有大量的文章专门讲述。所以我选了另外一个角度,从实际问题出发,将这些分散的知识串联起来,各位可以作为一个综述来看。各个模块的极致详细介绍,原创 2021-11-05 22:39:10 · 225 阅读 · 0 评论 -
Java并发:五种线程安全类型、线程安全的实现、枚举类型
1.Java中的线程安全Java线程安全:狭义地认为是多线程之间共享数据的访问。Java语言中各种操作共享的数据有5种类型:不可变、绝对线程安全、相对线程安全、线程兼容、线程独立① 不可变不可变(Immutable) 的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要能正确构建一个不可变对象,该对象永远不会在多个线程之间出现不一致的状态。多线程环境下,应当尽量使对象成为不可变,来满足线程安全。如何实现不可变?如果共享数据是基本数据类型,使用final关键字对其进行修饰原创 2021-11-04 11:18:19 · 323 阅读 · 0 评论 -
Spring Cloud 最佳实践方案(2021版本)
Spring Cloud 从H版本之后命名方式改为2021.x.x.使用组件列表:注册中心:nacos,替代方案eureka、consul、zookeeper配置中心: nacos ,替代方案sc config、consul config调用:feign,替代方案:resttempate熔断:sentinel、,替代方案:Resilience4j熔断监控:sentinel dashboard负载均衡:sc loadbalancer网关:spring cloud gateway链路:spri原创 2021-10-17 15:22:50 · 604 阅读 · 0 评论 -
SpringBoot+WebSocket实时监控异常
写在前面此异常非彼异常,标题所说的异常是业务上的异常。最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理。因为需要服务端主动向客户端发送消息,所以很容易的就想到了用WebSocket来实现这一功能。WebSocket就不做介绍了,上链接:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket前端略微复杂,需要在一张位置分布图上进行鼠标描点定位各个设备和原创 2021-10-17 15:06:44 · 183 阅读 · 0 评论 -
Java中Swing表格组件
表格是最常用的数据统计形式之一,在日常生活中经常需要使用表格统计数据,如对销售数据的统计、日常开销的统计,以及生成员工待遇报表等。利用JTable类直接创建表格表格是最常用的数据统计形式之一,在Swing中由JTable类实现表格。创建表格在JTable类中除了默认的构造方法之外,还提供了利用指定表格列名数据数组创建表格的构造方法,代码如下:JTable(Object[][] rowDa...原创 2019-11-11 16:26:12 · 2692 阅读 · 0 评论 -
Java中Swing树组件
树状结构是一种常用的信息表现形式,它可以直观地显示出一组信息的层次结构。Swing中的JTree类用来创建树。简单的树原创 2019-11-19 16:14:27 · 1003 阅读 · 0 评论 -
Java中this和super
thisthis是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。this的用法在java中大体可以分为3种:1.普通的直接引用这种就不用讲了,this相当于是指向当前对象本身。2.形参与成员名字重名,用this来区分:class Person { private int age = 10; public Person(){ System.ou...原创 2019-10-24 22:34:16 · 179 阅读 · 0 评论 -
Java中Swing程序设计
Swing程序设计Swing较早期版本中的AWT更为强大、性能更加优良,Swing中除了保留AWT中的几个重要的重量级组件之外,其他组件都为轻量级,这样使用Swing开发出的窗体风格会与当前运行平台上的窗体风格一致,程序员也可以在跨平台时指定窗体统一的风格与外观。Swing的使用很复杂,Swing基本要素:容器、组件、窗体布局、事件和监听器。1.Swing概述GUI(图像用户界面)为程序提供...原创 2019-10-29 14:38:00 · 915 阅读 · 0 评论 -
Java中I/O输入输出
在变量、数组和对对象中存储的数据是暂时的,程序结束后它们会自动消失。为了能够永久地保存程序创建的数据,需要将其保存在磁盘文件中,这样就可以在其他程序中使用它们。Java的I/O技术可以将数据保存到文本文件,二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求。1.流概述流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流。I/O(Input/Output,输入输出) 流提供了一...原创 2019-11-01 16:44:58 · 339 阅读 · 2 评论 -
Java集合类
集合类可以看作是一个容器,对于集合中的各个对象很容易将其放到集合中,也很容易将其从集合中取出来,还可以将其按照一定的顺序进行摆放。Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法以方便用户对集合进行遍历、添加、删除以及查找指定的对象。1.集合类概述java.util包中提供了一些集合类,这些集合类又称为容器。提到容器不难想到数组,集合类数组不同之处是,数组的长度...原创 2019-10-30 19:37:12 · 240 阅读 · 0 评论 -
Java抽象类和接口
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是...原创 2019-11-01 17:09:32 · 211 阅读 · 0 评论 -
Spring之AOP在XML中的配置方法
AOP 即 Aspect Oriental Program 面向切面编程先来一个栗子:<aop:config> <aop:pointcut id="loggerCutpoint" expression= "execution(* com.how2java.service.ProductService.*(..)) "/> <aop:aspect id="logAspe原创 2020-06-30 19:05:40 · 280 阅读 · 0 评论 -
HttpServletRequest中getRequestDispatcher()与sendRedirect()差异
尽管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。下面是HttpServletResponse.sendRedirect方法实现的请求重定向与RequestDispatcher.forward方法实现的请求转发的总结比较:(1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而 HttpServlet原创 2020-06-19 11:26:57 · 558 阅读 · 0 评论 -
Java学习路线超强总结(2020最新版)
我一直觉得,一个优秀的程序员,平时应该具备记录问题解决方案和总结知识点的习惯。不管你是新手还是入行多年,Java的知识体系都是通用的,今天我替大家整理了一份最新的Java学习路线,包含了作为一个Java工程师在开发工作学习中需要用到或者可能用到的绝大部分知识。如有变化会随时更新。2020最新Java学习路线一、JavaSE1.Java环境搭建2.Java核心语法3.面向对象4.数组&算法5.异常处理6.常用类7.集合&泛型8.集合&数据结构9.线程&通原创 2020-05-15 15:32:08 · 1021 阅读 · 0 评论 -
Spring 和 Spring Boot 的区别是什么?
概述对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累、我慢慢理解了这两个框架到底有什么区别,相信对于用了 SpringBoot很久的同学来说,还不是很理解 SpringBoot到底和 Spring有什么区别,看完文章中的比较,或许你有了不同的答案和看法!什么是Spring作为 Java开发人员...原创 2020-04-16 20:54:10 · 295 阅读 · 0 评论 -
详解Java String、StringBuffer 和 StringBuilder
StringString:字符串常量,字符串长度不可变。Java 中 String 是 immutable(不可变)的。String 类的包含如下定义:/** The value is used for character storage. */private final char value[];/** The offset is the first index of the sto...原创 2020-03-26 18:07:34 · 294 阅读 · 0 评论 -
Java项目构建基础
统一结果返回目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。统一结果的一般形式是否响应成功;响应状态码;状态码描述;响应数据其他标识符结果类枚举前三者可定义结果枚举,如:success,code,message@Getterpublic enum ResultCodeEnum { SUCCESS(tr...原创 2020-03-25 13:37:26 · 349 阅读 · 0 评论 -
来了来了,Java14它真的来了!
语言必须发展,否则它们就有变得无关紧要的风险,” Brian Goetz (甲骨文公司)在2019年11月在 Devoxx 举行的“ Java 语言期货”演讲中说。作为 Java 语言架构师,他扮演了一个重要的角色,尽管 Java 已经发展了25年,但仍然远远没有过时。在本文中,我们将研究 JDK 14的创新近年来,甲骨文做出了一些突破性的决定。他们包括新的半年发布模式与预览功能和更短的发布和反...原创 2020-03-25 13:15:16 · 762 阅读 · 0 评论 -
手把手教你实现 Docker 部署 Redis 集群
摘要接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群。首先,我们需要理论知识:Redis Cluster是Redis的分布式解决方案,它解决了redis单机中心化的问题,分布式数据库——首要解决把整个数据集按照分区规则映射到多个节点的问题。这边就需要知道分区规则——哈希分区规则。Redis Cluster ...原创 2020-03-23 16:18:34 · 279 阅读 · 0 评论 -
SpringBoot 几个优质的开源项目
今天跟大家分享SpringBoot 几个优质的开源项目的知识。1 SpringBoot 几个优质的开源项目1、spring-boot-examplesstar 数 14821•项目地址:https://github.com/ityouknow/spring-boot-examples这个项目中整合了 Spring Boot 使用的各种示例,以最简单、最实用为标准,此开源项目中的每个示例都...原创 2020-03-23 15:54:56 · 1207 阅读 · 0 评论 -
一文带你深入理解 Spring 事务原理
Spring事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:1.获取连接 Connection con = DriverManager.getConnection()2.开启事务con.setAutoCommit(true/false);3.执行CRUD...原创 2020-03-22 23:26:54 · 216 阅读 · 0 评论