-
Spring Boot 内置Tomcat启动原理
问题:Spring Boot是如何创建Tomcat的我们都知道,SpringBoot启动只有一个main方法的入口,只需要运行main方法就能把web项目部署到tomcat容器中,在main方法中,tomcat到底是如何启动的(本文基于SpringBoot 2.2.2.RELEASE)我们从SpringBoot的main方法一路进去,就会进入到以下的run方法当Spring的环境和参数初始化设置好以后,创建ConfigurableApplicationContext成功后会调用refres...…
-
Spring Boot IOC 容器初始化之Xml文件Bean定位加载
Xml文件Bean加载入口 读取XML过程 加载Bean 解析Bean参数大致的加载过程Xml文件Bean加载入口 /** * Create a new ClassPathXmlApplicationContext with the given parent, * loading the definitions from the given XML files. * @param configLocations array of resource locations * ...…
-
Spring Boot 使用FastJson实现Jsonp返回
JSONP返回实现思路在Java Web项目中,Jsonp 是非常常用的东西,这里实现Jsonp返回是通过fastjson实现的,实现效果如下测试访问接口:localhost:8080/testJsonp?platform=efunenplatform&userId=435654&language=en-US&flag=paypal&jsonpcallback=jsonp_1571018438835_11返回结果:jsonp_1571018438835_11...…
-
适配器模式(Adapter pattern)
定义适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。适用场景1、 你想使用一个已经存在的类,而它的接口不符合你的需求2、 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口不一定兼容的类)协同工作。3、 (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的...…
-
手写JDK动态代理(Implememt your own JDK dynamic proxy)
手写自己的动态代理需要重写那些内容 动态生成的 $Proxy0 对象长什么样? 反编译$Proxy.class代码分析 实现动态代理的关键 实现完整代码 自定义代理类实现 测试方法 运行结果 总结手写自己的动态代理需要重写那些内容首先我们来看看,上一篇文章代理模式(Proxy pattern)的动态代理类中,使用到了那些内容,从中找出需要重新实现的类和方法。动态生成的 $Proxy0 对象长什么样?...…
-
策略模式(Strategy pattern)
定义 示例代码场景描述 源代码 支付简单工厂(switch 和反射两种实现) 测试客户端 运行结果 总结定义策略模式:指的是对象具备某个行为,但是在不同的场景中,该行为有不同的实现算法。举个几个生活的例子,就是不同收入的人群采用不同的税率,登录的不同方式,支付的不同方式;在代码我们也见过策略模式,如ArrayList的排序传入的Comparator ArrayList list = new ArrayList(); list....…
-
代理模式(Proxy pattern)
定义 组成部分 静态代理 静态代理分析 动态代理(这里以JDK的动态代理为例,动态代理一般有两个主流实现:①JDK,②cglib) 动态代理分析 动态代理的优点 总结定义设计模式来源于生活,这次讲的代理模式也是生活中非常常见的一种场景,如:中介,媒婆,黄牛,VPN网络代理。代理模式:对某一个目标对象提供它的代理对象,并且由代理对象控制对原对象的引用。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托...…
-
Java类静态代码块初始化顺序
代码块和构造方法的执行顺序 测试代码 执行结果: 总结 一个类中的初始化顺序 两个具有继承关系类的初始化顺序 代码块和构造方法的执行顺序我相信大家多做过一道笔试题,有父类和子类都有静态代码块和普通代码块,写出个代码块的执行顺序,今天就是来看一下其初始化执行的顺序测试代码/** * 父类 */public class Father { public Father(){ System.out...…
-
单例模式(Singleton pattern)
为什么要使用单例模式 饿汉式 懒汉式 单例模式的其他实现方式 静态内部类实现 枚举实现 破解单例 反射破解法 反序列化破解法 总结为什么要使用单例模式单例模式属于上篇说过的设计模式三大分类中的第一类——创建型模式。顾名思义,单例设计模式就是为了保证创建出来的对象实例只有一个。 通过控制创建对象的数量,节约系统资源开销。 有些场景下,不使用单例模式,会导致系统同一时刻出现多个状态缺乏同步,用户自...…
-
Redis缓存相关
一、为什么要使用缓存 高性能 在频繁访问不改变的数据场景中,频繁访问数据库会带来较高的延时,使用缓存可以提升百倍性能 高并发 单机MySQL的QPS推荐是不超过2000,而Redis可以达到10W+的QPS 使用缓存会有哪些问题,有何解决方案1. 缓存与数据库双写不一致(1)串行化:读请求和写请求串行化,串到一个内存队列里去串行化能保证一定不会出现不一致的情况,但是也会导致系统的吞吐量大幅度降低(2)Cache Aside Pattern:读的时候,先读缓存,缓存...…
-
MySQL解压版安装
MySQL下载 1. 选择社区版 2. 选择对应的版本和系统,点击下载 3. 可以不登录直接下载,解压 配置MySQL默认配置文件 1. 在解压完的目录下,新建一个 my.ini 配置文件,把以下配置保存到 my.ini 文件中 2. 修改配置文件中的 数据库路径 和 数据保存路径 成自己的解压目录和想要保存的数据目录(数据保存目录不用创建,后面初始化数据库时会自动创建) 初始化My...…
-
Java集合HashMap 源码分析
一、HashMap简介 二、底层数据结构分析 (1)存放元素的结构 (2)红黑树节点的数据类型定义为: (3)HashMap类的一些属性 三、HashMap的构造方法 四、HashMap的关键方法 (1)put方法 (2)get方法 (3)resize方法 (4)containsKey方法 (5)containsValue方法 五、高频HashMap面试题一、...…
-
VM Box 安装CentOS7.6和网络设置
安装Oracle VM VirtualBox 网络配置 Linux 用户管理 使用XShell连接安装Oracle VM VirtualBox 官网下载安装包,官网地址:https://www.virtualbox.org/ 下载CentOs镜像,官网:https://www.centos.org/ 建议使用阿里云的镜像地址 建议采用迅雷下载比较快 安装Virtual Box,一路点击next就好了 安装Virtual ...…
-
JVM内存模型(JMM)
JMM构成…
-
MySQL的并发控制与加锁分析(转)
注: 本文转载自原博客地址:https://www.cnblogs.com/yelbosh/p/5813865.html 1.1 MVCC:Multi-Version Concurrent Control 多版本并发控制 1.2 隔离级别 1.3 死锁 1.4 InnoDB的MVCC实现机制 1.6 一个复杂的SQL的加锁分析本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty...…
-
Java中正负数二进制表示
在Java/C++中正数和负数的存储方式 正码(正数使用) 反码(正码取反) 补码(反码加1) 为什么计算机负数要以补码的形式存储 在Java/C++中正数和负数的存储方式正数是以正码的形式存储负数是以补码的形式存储正码(正数使用)正码就是一个数的真实值假设有一个 int (32位)类型的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 000001015转换成二制是101,不过...…
-
JVM运行时数据区(JVM Runtime Data Area)
JVM运行时数据区组成 程序计数器(Program Counter Register) 虚拟机栈(VM Stack) 在讲述栈帧具体的构成前需要一个辅助程序 局部标量表 操作数栈 动态链接 出口(返回值) 本地方法栈(Native Method Stack) 方法区(Method Area) 堆(Heap) 线程运行内存模型图JVM运行时数据区组成Java虚拟机在执行Java程序的过程中会将其管理的内存划...…
-
模板方法模式(Template Method Pattern)
定义 业务场景 UML图 代码表现 模板方法类 具体支付类 运行main方法示例 定义模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。什么叫做模板?既然是模板,那么就是说我使用这个模板必须要遵循模板的设计原则,以达到规范业务代码的作用业务场景小A是一间公司的程序...…
-
装饰模式(Decorator Pattern)
定义 应用场景 特点 讲故事 UML类图(以男性为例) 代码表现形式 定义接口和类 下面是三个具体的男性衣服装饰类 运行的main方法 最后附上运行结果 总结定义装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。应用场景从定义可以得出,装饰模式的作用是在不改变原来对象的情况下,往对象添加一些特定功能,符合对象的修改封闭——扩展开放原则...…
-
double保留两位小数
返回类型为double(四舍五入) 返回类型是 String我们都知道double和float都是浮点型,在转型或者比较的时候可能出现问题,这里讲一下怎么针对double类型做精度处理返回类型为double(四舍五入) 使用Math.round转成long再转回double double dou = 3.1487426; dou = (double) Math.round(dou * 100) / 100; System.out.println...…