Java设计模式(8)-建造者模式

建造者模式(Builder Pattern),旨在解决复杂对象的创建过程,将对象与其创建过程分离,通过相同的创建过程创建多种不同的对象。 生活中有很多复杂对象构建的例子。例如,汽车生产线的组装,都要经过车架、车身、变速箱、发动机、车轮等零部件的组装过程,如果将这些组装过程单独抽取出来,将组装结果——汽车独立出来,那么这个组装过程就可以重用,比如组装不同颜色、不同品牌的各种汽车。再比如,建房子,需要经过打地基、搭框架、砌墙、封顶等一系列复杂过程,如果对这个过程进行抽象,将房子和其建造过程分离,则更灵活,如通过这个建造过程可以建造高层建筑、低层建筑、普通民房等房屋。 ...

2020-08-23 · 6 分钟 · 2857 字 · 老墨

Spring扩展原理

Spring的扩展点很多,本文讨论Spring的 BeanPostProcessor、BeanFactoryPostProcessor、ApplicationListener 和 SmartInitializingSingleton 这四个扩展的基础类或接口。 ...

2020-08-12 · 12 分钟 · 5537 字 · 老墨

Java设计模式(7)-原型模式

某些情况下,我们需要重复的创建多个对象,但是这些对象仅仅只有某几个属性不一致,大部分的信息都是相同的,如果使用传统的构造函数来创建对象,我们需要不断的实例化对象,并且反复调用属性的set方法来设置值,而这些值大多都是相同的。有没有一种模式,能够快速而高效的创建这些差别不大的对象呢?这就需要使用到原型模式。 ...

2020-07-15 · 7 分钟 · 3485 字 · 老墨

Java设计模式(6)-抽象工厂模式

如果工厂模式中需要生产多种类型的产品,那么工厂方法模式就适合了,需要用到抽象工厂模式。 1. 简介 抽象工厂模式,定义抽象工厂,并将产品生产延迟到具体工厂实现中,而它生产的产品都是同种类型的。比如,电视机工厂生产的都是电视机,电视机是一个抽象产品,而它的具体实现有黑白电视、彩色电视、液晶电视等等,但是都属于同一种产品类型-电视机。 ...

2020-06-09 · 8 分钟 · 3734 字 · 老墨

Java设计模式(5)-工厂方法模式

工厂方法模式,是工厂模式的一种,它对简单工厂模式进行进一步抽象化。它将工厂和产品进行抽象,抽象出来的工厂负责定义创建产品的规范,而抽象的产品负责定义产品规范,然后通过具体的工厂实现类来创建具体的产品。 ...

2020-06-06 · 4 分钟 · 1521 字 · 老墨

Java设计模式(4)-简单工厂模式

工厂模式,一般分为三种,包括:简单工厂模式(也叫静态工厂模式)、工厂方法模式、抽象工厂模式。在GOF提及的23中设计模式中,没有简单工厂模式,但对于简单的软件开发中,简单工厂模式使用的还是很普遍的。 ...

2020-06-05 · 3 分钟 · 1166 字 · 老墨

Java设计模式(3)-单例模式

单例模式(Singleton Pattern),Java中最简单的设计模式之一,它定义了如何在整个系统范围内仅创建只有单个实例的类。单例模式是一种创建型模式,系统中的类只有一个实例,该类负责自己创建自身的唯一单个实例,并提供一个静态方法来获取自身实例。 ...

2020-05-29 · 5 分钟 · 2381 字 · 老墨

Java设计模式(2)-软件设计遵循的七大原则

设计模式为面向对象软件设计的前进道路照亮了明灯,而设计模式遵循面向对象软件设计的七大原则,这些原则也是设计模式的基础。 1. 单一职责原则 单一职责原则(Single Responsibility),它的定义是:对类来说的,一个类应该只负责一项职责。即是说,一个类只负责一种职责,让其职责单一化,如果有其他的职责则应该设计另外的类来进行协助。比如:订单处理类只负责处理订单,而不该去处理支付的逻辑。单一职责原则也可以引申到方法、类、模块甚至服务和子系统中。 ...

2020-05-27 · 14 分钟 · 6620 字 · 老墨

Java设计模式(1)-什么是设计模式?

什么是设计模式?顾名思义,设计模式是一种软件设计所使用的方法,适用于面向对象软件设计。设计模式是一种方法,或者说是一种方法论,它是软件前辈们经历了无数的软件工程设计中的痛点和教训之后,总结出来的经验的结晶。设计模式是一种软件设计方法,不是代码,也不是规范。 ...

2020-05-26 · 5 分钟 · 2018 字 · 老墨

给Spring中注册Bean的几种方式

1. 使用@Bean定义单个Bean 基于 @Bean 注解导入单个Bean。这种方式跟xml中 <bean> 标签等价,可以添加外部自定义Bean,但是需要自己创建Bean实例,而且只能导入单个Bean。注解定义如下: ...

2020-05-07 · 9 分钟 · 4126 字 · 老墨

分布式事务的几种解决方案

分布式系统,与传统单体架构系统相比,其结构复杂的多,系统间靠网络传输数据,系统存在诸多不确定因素,如硬件故障、网络波动等,都会影响整个系统的稳定性。而分布式事务更是分布式系统的一大难题,本篇将讨论业界分布式事务的几种常见解决方案。 ...

2020-04-15 · 12 分钟 · 5555 字 · 老墨

Java编程思想(第4版)中文高清版PDF下载

Java编程思想一书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。 ...

2020-04-14 · 5 分钟 · 2450 字 · 老墨

Spring IoC容器实现原理

1. IOC容器接口设计 Spring IOC容器接口设计如下图所示: Figure 1. Spring IoC容器接口设计 IOC容器两个核心的接口为BeanFacotry 和ApplicationContext,前者提供容器管理Bean的基本功能,后者则扩展 BeanFactory,提供了容器级的强大功能,如国际化支持、资源加载、事件、应用上下文环境等。 ...

2020-04-08 · 12 分钟 · 5759 字 · 老墨

Docker时间和系统时间不匹配,相差8小时

使用 maven docker 插件部署时,发现docker容器时间与本地时间相差8小时。 因为docker的时区与系统时区不同,docker容器默认的时区采用的UTC, 而中国时区为CTS,与之差8小时(东8区),可以进入容器使用date命令查看时区: ...

2020-03-11 · 1 分钟 · 260 字 · 老墨

Spring Bean自动扫描原理

Spring 基于注解的Bean自动扫描是由后置处理器 ConfigurationClassPostProcessor 来实现的。 1. ConfigurationClassPostProcessor类 ConfigurationClassPostProcessor 是一个 BeanDefinitionRegistryPostProcessor 实现,它的核心功能就是在容器启动时处理Spring的Java代码配置类(被 @Configuration 注解标记)。而且该类实现了 PriorityOrdered 接口,表示它是一个高优先级的后置处理器,会首先被执行。 ...

2020-03-10 · 15 分钟 · 7043 字 · 老墨

Docker开启监听TCP端口,解决修改docker配置文件无效

Jenkins配置了Docker插件,结果发现不能远程调用远端的docker,原来是tcp端口没有打开。 ubuntu版本号:16.04 root@ubuntu:/etc/docker# cat /proc/version Linux version 4.4.0-62-generic (buildd@lcy01-30) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 ...

2020-02-18 · 1 分钟 · 353 字 · 老墨

IntelliJ IDEA 2019.3.3激活

IntelliJ IDEA 2019.3.3版本已经可以成功激活了,更新了非常多的性特性并极大的提升了性能。理论上此种激活方式适合2019.3的所有版本,不过笔者仅测试了3.3版本。 ...

2020-02-14 · 3 分钟 · 1054 字 · 老墨

Spring IoC容器启动过程

1. 容器启动入口 一般而言,都使用 ApplicationContext 容器实现,这里使用了基于注解的 AnnotationConfigApplicationContext 实现。 要跟踪Spring的源码,可能需要结合不同的功能测试代码,以便跟踪源码时查看Spring具体的功能实现。比如:要了解Spring @ComponentScan 注解的原理,则首先需要编写一个配置类(@Configuration),然后定义组件扫描。 ...

2020-02-06 · 13 分钟 · 6097 字 · 老墨

修改docker容器端口映射

在docker run创建并运行容器的时候,可以通过 -p 指定端口映射规则。但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改。当docker start运行容器后并没有提供一个-p选项或设置,让你修改指定端口映射规则。那么这种情况我们该怎么处理呢?今天Docker君教你如何修改运行中的docker容器的端口映射? ...

2020-01-20 · 2 分钟 · 844 字 · 老墨

Docker入门系列八——使用Dockerfile构建镜像

Dockfile就是一个文本文件,里边包含了一行行的指令,用来描述如何创建自定义镜像。 1. 使用 使用 docker build 命令来基于Dockerfile文件和上下文构建镜像,构建上下文指的是特定路径(PATH或URL)的文件集合,PATH用来指定本地文件系统目录,而URL用来指定Git仓库的地址,它们包含的所有文件(子目录或子模块)都会被递归处理。在大多数情况下,最好以空目录作为上下文,并将Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。 ...

2019-11-15 · 11 分钟 · 5013 字 · 老墨

使用Springboot开发websocket程序(四)——使用RabbitMQ作为STOMP消息代理

上一篇,我们在介绍了Spring中如何使用websocket的子协议stomp,并使用简单的基于内存的stomp消息代理来编写了一个web聊天室实例。基于内存的stomp消息代理,虽然能够满足基本需求,但还是存在一些不足,比如由于stomp代理在应用内部,多个外部websocket应用需要消息互通,那么就难以满足了。在本篇,我们来学习如何使用RabbitMQ作为stomp代理。 ...

2019-11-12 · 11 分钟 · 5095 字 · 老墨

使用Springboot开发websocket程序(三)——基于子协议STOMP的web聊天室

我们使用Spring Boot对原生WebSocket的支持来编写了一个简单的聊天室程序。它仅支持群发,如果要做到点对点消息,我们还需要编写代码自己实现。本篇,我们将使用websocket的子协议STOMP来更新我们的聊天室程序,使其可以支持单聊。 ...

2019-11-02 · 19 分钟 · 9227 字 · 老墨

使用Springboot开发websocket程序(二)——基于原生websocket的web聊天室

上一篇介绍了什么是websocket,说到websocket是一种由HTML5定义的浏览器和服务器保持长连接的通信协议,可以进行实时数据交换。在本篇,我们将使用Spring boot,基于原生websocket开发一个web聊天室,并一步步介绍如何在spring boot中开发websocket程序。 ...

2019-11-01 · 7 分钟 · 3453 字 · 老墨

使用Springboot开发websocket程序(一)——什么是websocket

在互联网飞速发展的当代,浏览器和服务器之间的实时通信已经越来越重要,传统的HTTP协议难以解决实时通信的需求。因此,由HTML5定义的websocket协议应运而生。这里我将用三篇文章来介绍websocket,并使用Springboot开发一个web聊天室的程序,其中会使用原生websocket协议开发,也会单独来介绍使用STOMP协议来开发。 ...

2019-11-01 · 5 分钟 · 2500 字 · 老墨

使用Redis实现分布式锁

在单体Java应用中,由于代码运行于同一个JVM,使用实现资源加锁是比较容易的,例如使用synchronized或ReentrantLock加锁来控制并发访问;但是在分布式系统中,多个分布式系统之间也需要控制并发访问,由于处于不同的JVM,此时就不能简单使用java的锁机制来进行控制。这种跨进程或者跨服务器的加锁,需要额外使用全局的获取锁的服务,就是本文探讨的分布式锁。 ...

2019-10-17 · 7 分钟 · 3086 字 · 老墨

IntelliJ IDEA 2019.2.x激活

IntelliJ IDEA 2019.2.x版本已经可以成功激活了,理论上此种激活方式适合2019的所有版本,不过笔者仅测试了2.3版本。具体激活步骤如下: 1、下载最新版本的idea, 目前版本为2019.2.3 ...

2019-10-12 · 2 分钟 · 776 字 · 老墨

Docker入门系列七——端口映射与容器互联

1. 端口映射 1.1. 外部访问容器内的应用 如果外部要访问容器,需要将容器的端口开放出来,使用 -p 或 -P (大写)参数来映射容器端口和宿主机端口的关系: -p:明确指定端口映射,每个端口只能绑定一个容器,格式包括:IP:HOST_PORT:CONTAINER_PORT|IP:CONTAINER_PORT|HOST_PORT:COINTAINER_PORT ...

2019-09-15 · 3 分钟 · 1086 字 · 老墨

SpringBoot自定义日志配置

当系统出现问题时,先从表现分析问题远远不够,要快速、准确地分析并定位问题原因,日志就是一个非常重要且必不可少的手段。Java而言,日志框架有很多,常用的有Common-logging、Java自带的Logging、Log4J、Logback等。另外,还有一个Slf4J的框架,主要目的是将这些框架进行整合。本篇主要介绍的是SpringBoot中的日志支持,如何进行日志自定义。 ...

2019-09-06 · 5 分钟 · 2410 字 · 老墨

Mysql binlog格式

在前一篇,我们开启了Mysql的binlog,当Mysql在进行数据更改操作时会自动记录binlog日志,以便进行主从服务,或者恢复丢失的数据。Binlog的日志内容可以设置不同的格式,以满足不同的需求。 ...

2019-08-28 · 6 分钟 · 2708 字 · 老墨

Mysql开启Binlog并做数据备份

某些时候,一不小心删除了数据库的数据甚至某些表、库,顿时慌得一P,是不是想死的心都有了?尤其是在小公司或者小项目中,没有遵循严格的规章制度,每个开发人员都有测试数据库甚至生产库的权限,一些没有经验的程序员一顿胡乱操作,导致数据库的数据丢失的情况时有发生。此时,我们就需要用到Mysql的binlog了。 ...

2019-08-28 · 8 分钟 · 3875 字 · 老墨

Docker入门系列六——数据管理

容器的数据管理有两种方式: 数据卷(Data Volumes):容器内数据直接映射到本地主机环境 数据卷容器(Data Volume Containers):使用特定容器维护数据卷 ...

2019-08-20 · 5 分钟 · 2328 字 · 老墨

Docker入门系列五——仓库

docker 仓库的概念与java的maven仓库非常类似,它们都用来存储数据,maven仓库存储的是 jar 包,docker 仓库存储的是镜像。许多第三方私有仓库工具如 nexus 既可以构建 maven 仓库,也支持 docker 仓库。 ...

2019-08-12 · 2 分钟 · 810 字 · 老墨

Docker入门系列四——容器

前一篇我们介绍了Docker的核心概念–镜像,知道了镜像是只读的创建容器的指令模板,由不同的层组成,也提到了镜像运行后就成为了容器,容器启动后回家镜像上增加一个可写的容器层,容器和镜像最主要的区别就在于容器层,容器层可读写,新写入或者修改的数据都存储在容器层上。在本篇,我们再来详细了解一下Docker的容器。 ...

2019-07-29 · 12 分钟 · 5577 字 · 老墨

Docker入门系列三——镜像

上一篇介绍了如何在Windows、macOS、Ubuntu上安装docker,安装完成后,我们将开始正式学习docker。Docker的三大核心概念分为是:镜像、容器和仓库,在本篇,我们将介绍第一个核心概念----镜像。 ...

2019-07-23 · 10 分钟 · 4816 字 · 老墨

Docker入门系列二——安装

在上一篇 Docker简介中,我们介绍了Docker的概念、优势以及Docker结构,也提到了Docker是基于Linux系统的cgroup技术实现的,既然如此,那么Docker是否支持非Linux系统上使用呢?答案是肯定的。Docker官方提供了Docker Machine工具,用于在非Linux系统上构建虚拟机并在其上安装Docker;Docker官方还提供了Docker Toolbox工具包,用来在旧版本的操作系统上安装Docker;另外,Docker还专门针对Windows和Mac OS,提供了更简单易用的Docker Desktop,用来一键安装Docker及其相关组件。\n 在本篇,我们将来看看如何在Linux、Mac OS和Windows上安装Docker。\n ...

2019-07-12 · 10 分钟 · 4990 字 · 老墨

Docker入门系列一——简介

1. 简介 容器化技术,是对Linux容器的一种封装,将程序打包为镜像文件,运行该文件创建容器,最终达到使用容器进行快速、简单、高效的开发、部署、运行软件程序的目的。相对于虚拟化技术 [1],容器化技术有着更高的资源利用率、更高的性能、更低的开发和维护成本。 ...

2019-07-03 · 12 分钟 · 5568 字 · 老墨

使用Github的Webhook实现代码库与应用的交互

很早之前,博主的的网站评论模块已经更改为了 gitalk,Gitalk是一个基于GitHub Issue和Preact的现代评论组件。更换评论组件后有一个问题:我不想每次去github上查看别人的评论,如果别人评论了文章,然后我能够在网站后台看到,这样就很方便了。此时,github的webhook功能就可以登场了。 ...

2019-07-02 · 9 分钟 · 4311 字 · 老墨

Spring AMQP消息转换

上一篇,我们介绍了如果使用Spring AMQP注解来实现消息发送和监听,示例都是使用的默认的消息转换器,即SimpleMessageConverter,它只能处理byte[]、String、java序列化对象(实现了Serializable接口的对象)。 ...

2019-06-17 · 8 分钟 · 3597 字 · 老墨

Spring AMQP注解的使用

上一篇 "Spring AMQP简介和使用",我们介绍了Spring AMQP的一些基本要素和概念,也通过一些示例代码介绍了消息的发送和接收,但是都是使用的原始编码方式来实现,并不依赖Spring环境。其实,Spring AMQP也支持使用注解的方式来进行异步接收消息,极大的简化了编码。 ...

2019-06-13 · 10 分钟 · 4638 字 · 老墨

Spring AMQP简介和使用

1. 前言 很早之前写过几篇关于RabbitMQ的一些基础文章,在本篇中,我们将来学习Spring AMQP。 Spring AMQP 是 Spring 对 AMQP( http://www.amqp.org) 协议的封装和扩展,它提供了模板来对消息的发送和接收进行高级抽象,还提供了基于消息驱动的POJO的支持(类似JMS,Java消息服务)。 ...

2019-06-05 · 17 分钟 · 8251 字 · 老墨

Spring boot集成quartz并实现任务调度

最近在实现任务调度服务,使用 quartz调度框架,由于使用的spring boot版本为1.5.10,该版本并没有提供quartz的starter,在集成的时候还是遇到了很多问题。本文并不会详细介绍quartz框架,请自行查阅相关资料。如果对Spring boot不太熟悉,可以看前边几篇关于spring boot的文章。 ...

2019-01-22 · 8 分钟 · 3677 字 · 老墨

Spring boot工程Feign请求时Get请求无法传递body的问题

前一篇,我们解决了Spring的RestTemplate在发送Get请求不能传递body,相比RestTemplate,我们更多的还是采用更方便的申明式服务调用框架Feign。本篇不会介绍Feign,而是解决Feign发送Get请求时仍然不能传递body的问题。 ...

2019-01-22 · 3 分钟 · 1200 字 · 老墨

使用Spring的RestTemplate发送GET请求,并支持传递Request body参数

最近在使用Spring Boot实现微服务,都是使用RESTful风格的Api接口,服务间使用RestTemplate来进行HTTP通信,遇到这样一个需求:开发一个查询请求Api,参数使用JSON格式的字符串来提交。 ...

2018-10-31 · 4 分钟 · 1687 字 · 老墨

Spring Boot参数验证(下)——Bean Validation在Web中的应用

在 Spring Boot参数验证(上)--Bean Validation及其Hibernate实现 一篇中,我们介绍了验证标准Bean Validation和其Hibernate实现,在本篇,我们看看它们是如何应用在Spring Boot Web项目中。 ...

2018-10-12 · 8 分钟 · 3978 字 · 老墨

Spring boot全局异常处理和自定义异常页面

Spring boot提供了默认的异常处理机制,但是难以满足业务需要,一般需要编码来实现自己的业务处理机制。在本篇,将介绍如何自定义异常页面,和进行全局的异常处理。 ...

2018-10-10 · 5 分钟 · 2056 字 · 老墨

Spring Boot参数验证(上)——Bean Validation及其Hibernate实现

通常,web项目都需要对请求的参数进行校验,一般是前端JavaScript需要校验,然后后台还需要再进行校验,而校验逻辑大多数是重复的。如果在后台通过硬编码的方式,对Controller参数进行逐个校验,将会非常耗时和低效的,尤其是在使用Spring Boot和Spring Cloud的微服务体系中,大多数服务均会对外提供RESTFul的api,如果有统一的验证机制和框架,将大大提高生产力。幸运的是,Java已经提供了标准的验证API,称为Bean Validation。 ...

2018-10-10 · 18 分钟 · 8585 字 · 老墨

Spring Cloud服务注册中心Eureka高可用

在 上一篇,我们通过编码,分别编写了服务注册中心、服务提供者、服务消费者,但是服务注册中心仍然是单节点,如果服务注册中心不可用,则会导致整个体系的所有服务都不可用。所以,有必要保证服务注册中心的高可用,本章将来讨论整个问题。 ...

2018-08-16 · 6 分钟 · 2947 字 · 老墨

Spring Cloud服务注册中心Eureka

上一篇,我们学习了Spring Cloud配置集成化组件Config,在本篇,我们来学习Spring Cloud微服务架构的一个核心组件----Eureka。 ...

2018-08-15 · 7 分钟 · 3330 字 · 老墨

Spring Cloud Config之配置集成化

在 Spring Cloud简介中,我们了解了Spring Cloud的基本概念、特点、各大组件和其作用,还介绍了Spring Cloud的版本定义和发布规则,对Spring Cloud应该有了一定的了解。在本篇,我们来看看实现配置集成化的重要组件----Spring Cloud Config。 ...

2018-08-14 · 11 分钟 · 5350 字 · 老墨

Visio替代者-亿图9.0破解版下载

1. 简介 亿图,一款windows平台的微软Office风格的绘图软件,不仅简单易用,而且拥有强大的功能,支持的图形图表种类非常丰富,所绘制的图形也十分美观,你可以用来轻松绘制各种图形, 如流程图、框图、思维导图、工程设计图、平面图、时装设计等等。 ...

2018-07-31 · 3 分钟 · 1331 字 · 老墨