自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Star's Tech Blog

分享一些有用的技术文章

  • 博客(91)
  • 收藏
  • 关注

原创 理解什么是 JMM

理解什么是 JMM本文已收录至 GitHub https://github.com/yifanzheng/java-notesJava 虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——Java 内存模型。也就是说,Java 内存模型是 Java 虚拟机中定义的一种并发编程的底层模型机制。JMM 概念JMM(Java Memory Model)就是 Java 内存模型,是 Java 虚拟机规范中所定义的一种内存模型。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一

2020-09-28 21:26:24 1161

原创 聊一聊 Java 中的 ThreadLocal

前言提到 ThreadLocal, Java 开发者并不陌生。在面试中,也经常被面试官提及,对 Java 开发者而言也是一个必须掌握的知识点,所以将它理解透彻是很有必要的。文章稍微有点长,不过介绍的还是比较细致。ThreadLocal 是什么ThreadLocal 是一个关于创建线程局部变量的类,主要作用是做数据隔离,保存到 ThreadLocal 中的数据只属于当前线程,该数据对其他线程而言是隔离的。也就是说,使用 ThreadLocal 保存的数据只能被当前线程访问,其他线程无法访问和修改。在多

2020-08-17 15:51:15 216

原创 volatile 关键字,你真的理解吗?

这里我们将引出一个概念:内存屏障指令内存屏障指令为了实现 volatile 内存语义(即内存可见性),JMM 会限制特定类型的编译器和处理器重排序。为此,JMM 针对编译器制定了 volatile 重排序规则表,如下所示:使用 volatile 修饰变量时,根据 volatile 重排序规则表,Java 编译器在生成字节码时,会在指令序列中插入内存屏障指令来禁止特定类型的处理器重排序。内...

2020-05-06 23:34:04 2267 8

原创 一文读懂 Java 集合中的快速失败(fail-fast)和安全失败(fail-safe)机制

快速失败采用快速失败机制的集合容器,使用迭代器进行遍历集合时,除了通过迭代器自身的 remove() 方法之外,对集合进行任何其他方式的结构性修改,则会抛出 ConcurrentModificationException 异常。在 java.util 包下的集合类都采用的是快速失败机制,不能在多线程下发生并发修改(迭代过程中被修改)。原理迭代器在遍历时直接访问集合的内容时,因此集合中的内容...

2020-04-21 16:31:20 426

原创 Angular:使用 [@Directive] 自定义指令

指令介绍在 Angular 中有三种类型的指令:组件,有模板的指令,组件是继承于指令的,只是扩展类与 UI 相关的属性。属性型指令,改变 DOM 元素、组件或其他指令的行为和外观的指令。如,NgStyle、NgClass。结构型指令,通过添加或移除 DOM 元素改变 DOM 布局的指令。如,NgIf、NgFor。然而,在实际的开发中,根据业务的需要,我们经常会拓展 Ang...

2020-03-09 16:56:30 3291 1

原创 Spring Security With JWT 入门 Demo

spring security jwtGitHub :https://github.com/yifanzheng/spring-security-jwt.git概述Spring Security 是 Spring 全家桶中一个功能强大且高度可定制的身份验证和访问控制框架。与所有 Spring 项目一样,我们可以轻松扩展 Spring Security 以满足自定义要求。由于 Spring ...

2019-10-05 00:55:57 1237 1

原创 Angular: [ControlValueAccessor] 自定义表单控件

Angular: [ControlValueAccessor] 自定义表单控件我们在实际开发中,通常会遇到各种各样的定制化功能,会遇到有些组件会与 Angular 的表单进行交互,这时候我们一般会从外部传入一个 FormGroup 对象,然后在组件的内部写相应的逻辑对 Angular 表单进行操作。如果我们只是对表单中的一个项进行定制,将整个表单对象传入显然不合适,并且组件也会显得臃肿。&lt...

2019-09-29 20:53:55 2432 1

原创 设计原则:接口隔离原则

接口隔离原则(ISP)接口隔离原则的英文翻译是 “Interface Segregation Principle”,缩写为 ISP。 Robert Martin 是这样定义它的:“Clients should not be forced to depend upon interfaces that they do not use。” 直译成中文的话就是:客户端不应该强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。实际上,“接口”这个名词可以用在很多场合中。生活中我们可以用它来

2021-01-11 20:36:07 365 1

原创 在 Spring 中 Mock RestTemplate

如果我们程序中使用了 RestTemplate 进行 HTTP API 调用。通常在编写单元测试时,为了让测试可控,会将 RestTemlate 调用进行 mock,而不是进行真实的 HTTP API 调用。这里,我们将介绍两种 mock RestTemplate 调用的方法。一个是比较流行的 Mockito 模拟库,另一个是使用 Spring Test 提供的 MockRestServiceServer 模拟服务器,它可以创建模拟服务器以定义服务器交互。使用 Mockito 模拟使用 Mockito

2020-12-28 20:44:22 4561 3

原创 Spring 单元测试中如何进行 mock

我们在使用 Spring 开发项目时,都会用到依赖注入。如果程序依赖了外部系统或者不可控组件,比如依赖数据库、网络通信、文件系统等,我们在编写单元测试时,并不需要实际对外部系统进行操作,这时就要将被测试代码与外部系统进行解耦,而这种解耦方法就叫作 “mock”。所谓 “mock” 就是用一个“假”的服务代替真正的服务。那我们如何来 mock 服务进行单元测试呢?mock 的方式主要有两种:手动 mock 和利用单元测试框架 mock。其中,利用框架 mock 主要是为了简化代码编写。我们这里主要是介绍利用

2020-12-21 23:17:37 2904

原创 设计原则:里式替换原则

里式替换原则(LSP)里式替换原则的英文翻译是:Liskov Substitution Principle,缩写为 LSP。这个原则最早是在 1986 年由 Barbara Liskov 提出,他是这么描述这条原则的:If S is a subtype of T, then objects of type T may be replaced with objects of type S, without breaking the program。大概意思就是:子类对象能够替换程序中父类对象出现的任

2020-12-16 21:06:44 223

原创 设计原则:开闭原则

开闭原则(OCP)开闭原则的英文全称是 Open Closed Principle,简写为 OCP。它的英文描述是:softwareentities (modules, classes, functions, etc.) should be open forextension but closed formodifcation。我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。简单地说就是,添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修

2020-12-15 21:40:49 169

原创 设计原则:单一职责原则

单一职责原则(SRP)单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。这个原则的英文描述是这样的:A class or module should have a single reponsibility。如果我们把它翻译成中文,那就是:一个类或者模块只负责完成一个职责(或者功能)。如何判断类的职责是否单一评价一个类的职责是否足够单一,我们并没有一个非常明确的、可以量化的标准,可以说,这是件非常主观、仁者见仁智者见智的事情。实际上,在真正的软件开发中

2020-12-15 21:39:42 188

原创 Token 刷新并发处理解决方案

对 Token 进行刷新续期,我们要解决并发请求导致重复刷新 Token 的问题,这也是设计刷新 Token 的难点。这里我会分别介绍前端和后端各自的处理方案。后端方案:利用 Redis 缓存当同时发起多个请求时,第一个接口刷新了 Token,后面的请求仍然能通过请求,且不造成 Token 重复刷新。那么,后端在用户第一次登录时,需要将生成的 Token 数据(token 和 createTime)缓存一份到 Redis 中。当 Token 过期时,重新生成新的 Token 数据并更新 Redis 缓

2020-12-03 21:02:23 3806 1

原创 Angular 集成 Editor.md 实现 Markdown 编辑功能

最近,尝试在 Angular 项目中实现 Markdown 编辑功能。在网上搜索了一番之后,决定使用 Editor.md 插件来实现 Markdown 编辑功能。 Editor.md 功能比较丰富,但是文档不是很友好。示列地址:https://github.com/yifanzheng/ngx-markdown-editor使用首先,下载 Editor.md 文件,放到 assets 目录下。使用 npm 下载 jquery。npm install jquery在 angular

2020-11-16 22:22:54 732 2

原创 IntelliJ IDEA 创建 Maven 项目遇到 pom.xml 无法识别的解决方案

问题描述有时候,使用 IDEA 创建 Maven 项目会出现 pom.xml 无法识别的情况,而是当成一般的 xml 文件了:解决方案借助 IDEA 工具:

2020-11-12 18:21:25 1815

原创 Angular: Program ng failed to run No application is associated

Program ng failed to run No application is associated今天,搭建 Angular CLI 框架的时候,遇见了一个奇怪的问题。当我将 Angular CLI 搭建完成以后, 我在 Windows PowerShell 和命令提示符上输入 ng 命令是工作正常的,但在 VSCode PowerShell 上却失败。问题描述当我在 VSCode PowerShell 上输入 ng 命令时出现如下错误。Program 'ng' failed to run:

2020-10-22 21:24:40 573

原创 Angular: ‘ng’ is not recognized as an internal or external command, operable program or batch file

无法将“ ng”识别为内部或外部命令,可操作程序或批处理文件问题说明安装Angular CLI后无法识别ng命令。无法将“ ng”识别为内部或外部命令,可操作程序或批处理文件。要么无法将术语“ ng”识别为cmdlet的名称解析度我发现此错误是由于本地计算机中Angular CLI的不正确安装或配置引起的。以下是我如何解决此问题的方法。解决问题的步骤提供以下修补程序之前,请确保在Node.js命令提示符下运行以下命令ng –version如果有效,则一切就绪!如果问题仍然存在,请查看

2020-10-22 21:17:09 4897 1

原创 Spring Boot 入门示例合集(附源代码)

Spring Boot 入门实战示例本项目是自己在学习 Spring Boot 时整理的一系列笔记,包含 Spring Boot 使用的各种示例,可以快速上手 Spring Boot 整合的一些子项目。我把项目放到了 GitHub 上,项目名称叫 springboot-action。Hello World 示例springboot-helloworld: Spring Boot 的一个 Hello World 示例定制 Banner 示例springboot-banner: Spring B

2020-09-14 20:29:25 793

转载 设计模式也可以这么简单

一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的????????????,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分别为创建型模式、结构型模式和行为型模式。有一些重要的设计原则在开篇和大家分享下,这些原则

2020-09-14 15:25:23 397

原创 Java 设计模式(十三):模板方法模式

模板方法模式模板方法(Template Method)定义了执行方法的固定顺序,它可以提供默认实现,该实现对于所有或某些子类可能是通用的;也可以提供抽象的方法,让子类决定具体要做什么。在含有继承结构的代码中,模板方法模式是非常常用的。模板方法模式比较简单,这里就使用一个简单的示例进行说明。模板方法示例在模板方法模式中,需要有一个抽象类来定义一些默认方法或需要子类实现的抽象方法,同时需要一个模板方法来固定这些方法的顺序。在不改变方法执行顺序的前提下,由子类来决定这些方法的具体内容。抽象类:/**

2020-09-02 15:27:42 175

原创 如何规范地提交 Git Commit Message

如何规范地提交 Git Commit Message本文首发于我的个人博客:http://yifanstar.top/Commit message 是开发的日常操作,它可以提供更多的历史信息,方便,还可以有效的生成 Change log,对项目的管理实际至关重要,但是实际工作中却常常被大家忽略。Commit Message 格式目前,社区有多种 Commit message 的写法规范,但使用较多的是 Angular 团队的规范, 继而衍生了 Conventional Commits speci

2020-07-21 17:58:18 484

原创 使用 GitHub Actions 自动部署 Hexo 博客到 GitHub Pages

前言最近,看到网上有很多人开始使用 GitHub Actions 进行项目的持续集成(CI)以及持续部署(CD)。于是,我也心血来潮,开始使用 GitHub Actions 来进行个人博客的自动部署。不得不说,GitHub Actions 真香!之前,我部署 Hexo 博客时,先通过 hexo g 将写好的 Markdown 文件转化为 HTML 文件,然后再使用 hexo d 把生成的 public 文件推送到 Github 仓库中,然后又使用 git 命令将 Hexo 博客开发源码推送到仓库的另一个

2020-07-19 22:18:52 1297

原创 Java 设计模式(六):代理模式

代理模式代理模式(Proxy)意图是为另一个对象提供代理,以控制对其的访问。即通过代理类访问目标类,这样做可以通过代理对象扩展目标类的功能以及控制对目标类的访问。代理模式主要有三种形式,分别是静态代理、动态代理、CGlib 代理。示例假设,我们要记录老师授课前和授课后的信息,分别使用上面三种代理模式实现。静态代理若代理类在程序运行前就已经存在,那么这种代理方式被成为静态代理 ,这种情况下的代理类通常都是我们在 Java 代码中定义的。使用静态代理实现时,需要定义接口或者父类,被代理类(即目标类)

2020-07-16 22:25:11 135

原创 Java 设计模式(十二):享元模式

享元模式享元模式(Flyweight),使用共享技术有效地支持大量细粒度的对象。常用于系统底层开发,解决系统的性能问题。比如,数据库连接池技术。享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时,不需总是创建新对象,可以从缓冲池里获取。这样可以降低系统内存消耗,同时提高效率。享元模式经典的应用场景就是池技术了,String 常量池、数据库连接池、缓冲池等等都是享元模式的应用,它是池技术的重要实现方式。要应用享元模式,我们需要将对象属性分为内部属性和外部属性。内部属性使对象

2020-07-15 20:05:07 217 1

原创 Java设计模式(十):外观模式

外观模式外观模式(Facade),为子系统中的一组接口提供统一的接口。此模式定义了一个高层接口,这个接口使子系统更易于使用。简而言之,外观模式提供了到复杂子系统的简化接口。外观模式解析角色介绍Facade:外观类,知道哪些子系统负责处理请求,将客户的请求代理给适当的子系统。SubSystemOne/SubSystemTwo:子系统类,实现子系统的功能,处理 Facade 对象指派的任务。外观模式基本代码Facade 类:外观类/** * Facade */public cla

2020-07-15 11:07:44 205

原创 CentOS 7 安装 MySQL 教程

CentOS 7 安装 MySQL前言检查系统添加 MySQL Yum 存储库安装 MySQL启动 MySQL 服务器登录 MySQL,修改密码添加远程账户防火墙开放 3306 端口设置数据库编码字符集设置开机启动参考前言最近,将家里的旧电脑装成了 Linux 系统,当作自己的一个私人服务器,用于编程学习。于是,我首先在上面安装了 MySQL 数据库,中间也遇到了不少问题,所以安装过程以及一些...

2020-04-24 22:37:24 174

原创 ElasticSearch 多字段分组求和

GET report_consumer_*/_search{ "query": { "bool": { "must": [ { "range": { "reportTimestamp": { "gte": 1586500020000, "lte": 15865...

2020-04-12 23:25:50 8104

原创 良好的开发习惯助你一臂之力——程序员日常开发注意事项总结

作为一名刚入行不久的菜鸟 Java 程序员,经常被自己的一些不好的开发习惯给坑,导致明明运行好好的项目突然出现意想不到的 Bug。然后,我就被导师叫过去进行了一番细心的指导,这里要特别感谢一下我的导师,可以说他是我目前开发路上的指路明灯。注意事项这里,我总结了几条开发中我认为比较重要的注意事项:1. 完善代码注释我相信很多小伙伴跟我一样,自己写的代码过一段时间去看就不知道是怎么回事了,而且...

2020-04-12 12:50:50 365

原创 推荐几款比较好用的 IntelliJ IDEA 插件

最近换了新电脑,然后给电脑安装一些常用的开发工具和配置开发环境。这里给大家分享一下,IDEA 中比较好用的一些插件,帮助提高开发效率。同时,欢迎各位大佬些补充。Translation在开发中,经常会遇到不认识的英文单词或句子,特别是在查看一些源码时,很多注释都是英文。相信大家遇到这些认识的英文时,常规操作就是打开浏览器,搜索 Google 翻译,然后粘贴,哈哈哈。Translation 是一...

2020-03-14 21:22:47 3245

原创 在 VS Code 中调试 Angular 程序

准备工具在 VS Code 中安装 Debugger for Chrome 插件。配置 lanch.json{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information,...

2020-03-06 22:14:17 464 1

原创 MySQL 基础(一):数据类型与表管理

文章目录概念相关术语MySQL 相关操作数据库相关操作MySQL 存储引擎概念简单一句话概括,数据库(DataBase)是按照数据结构来组织、管理和存储数据的仓库。常见的数据库OracleDB2SQL ServerPostgre SQLMySQL相关术语数据库系统(DataBase System)DBS数据库(DataBase)数据库管理系统(DataBase Man...

2020-02-23 15:33:31 252

原创 MySQL 基础(二):数据操作与常用函数

目录添加记录更新记录删除记录查询记录WHERE 条件GROUP BY 分组多表查询创建外键联合查询MySQL 常用的数学函数MySQL 常用的字符串函数MySQL 常用的日期函数其他常用函数添加记录# 语法INSERT [INTO] tbl_name[(col_name,....)] VALUE|VALUES(values...);# 不指定字段名INSE...

2020-02-23 15:10:14 181

原创 一文带你入门 HTTP 协议

HTTP 协议入门HTTP 是 HyperText Transfer Protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,是客户端与服务端进行交互时必须遵循的规则。它用于定义 Web 浏览器与 Web 服务器之间交换数据的过程以及数据本身的格式,底层是靠 TCP 进行可靠地信息传输。客户端向服务端发送 HTTP 请求返回的完整过程:网络模型介绍应用层...

2020-02-12 21:43:27 544

原创 Widows 环境下安装 ElasticSearch 并配置 ElasticSearch Head 插件

Widows 环境下安装 ElasticSearch 并配置 ElasticSearch Head环境准备JDK 1.8 以上ElasticSearch 7.0 以上ElasticSearch 安装包下载地址:https://www.elastic.co/cn/downloads/elasticsearch安装 ElasticSearchElasticSearch 安装包下载完成...

2020-02-04 10:38:16 373

原创 Guava EventBus 使用

Guava EventBus 使用EventBus 是 Google Guava 提供的消息发布-订阅类库,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现,消息通知负责人通过 EventBus 去注册/注销观察者,最后由消息通知负责人给观察者发布消息。对于事件监听和发布订阅模式,EventBus 是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。基本用法创建事件...

2020-01-19 16:07:59 3031

原创 Java 设计模式(十一):组合模式

组合模式组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式解析角色介绍Component:组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理 Component 的子部件。Leaf:在组合中表示叶节点对象,叶节点没有子节点。Compos...

2020-01-16 21:39:24 216

原创 Java 设计模式(八):装饰器模式

装饰者模式装饰者模式(Decorator),动态地给一个对象添加一些额外的功能,就增加功能来说,装饰者模式比继承更灵活。装饰者模式解析角色介绍Component:定义一个对象接口,可以给这些对象动态地添加功能。ConcreteComponent:是定义了一个具体的对象,也可以给这个对象添加一些功能。Decorator:装饰抽象类,继承了 Component,从外类来扩展 ...

2020-01-07 23:20:16 155

原创 Spring 事务管理及失效总结

Spring 事务管理及失效总结所谓事务管理,其实就是“按照给定的事务规则来执行提交或者回滚操作”。Spring 并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给 Hibernate 或者 JTA 等持久化机制所提供的相关平台框架的事务来实现。Spring 事务管理器接口: org.springframework.transaction.PlatformTransact...

2019-12-19 00:09:33 303

原创 Java 设计模式(七):桥接模式

桥接模式桥接模式(Bridge),将抽象部分和它的实现部分分离,使它们都可以独立地变化。桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。也就是说,实现系统可能有多种方式分类,每一种分类都有可能变化。桥接模式的核心意图就是把这些分类独立出来,让它们各自独立变化,减少它...

2019-12-13 22:38:37 467

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除