自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(358)
  • 收藏
  • 关注

原创 Java设计模式类型——桥接模式

文章目录1:需求2:使用传统方式2.1 使用传统方式优缺点3:桥接模式3.1 桥接模式解决手机操作问题4:桥接模式的注意事项和细节1:需求现在对不同品牌的手机类型实现操作编程(比如:开机,关机,上网等)2:使用传统方式使用传统方式思路2.1 使用传统方式优缺点扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加 一个手机品牌,也要...

2020-01-15 18:05:28 1296 7

原创 Java设计模式类型——单例设计模式

文章目录1:单例设计模式介绍2:单例设计模式八种方式2.1 饿汉式(静态常量)2.2 饿汉式(静态代码块)2.3 懒汉式(线程不安全)2.4 懒汉式(线程安全,同步方法)2.5 懒汉式(线程安全,同步代码块)2.6 双重检查2.7 静态内部类2.8 枚举3 :单例模式注意事项和细节说明1:单例设计模式介绍所谓类的单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只可以存在一个对象实...

2020-01-14 15:29:53 654 8

原创 Tomcat的文件目录作用

bin目录:一些可执行文件目录(startup.bat,shutdown.bat)conf目录:相关的配置文件(server.xml)lib目录:相关的加包(tomcat依赖的jar包文件)logs目录:储存相关的运行日历(记录出错的信息)temp目录:相关缓冲文件webapps目录:把事先编好的代码放到web容器中(可执行项目,将我们开发的项目,放入该目录)work:存放的由jsp翻...

2019-08-24 13:27:49 442 4

原创 Spring Boot下Spring MVC框架的启动原理——SpringBoot应用的启动过程——万字长文

文章目录1:创建 SpringApplication1.1 创建 SpringApplication过程的源码调试1.2 创建 SpringApplication过程的源码解读1.2.1 推断是否是Web环境1.2.2 通过spring工厂设置应用组件1.2.3 推断main方法所在的启动类2:运行 SpringApplication2.1 应用环境的创建与准备2.2 应用上下文的创建(创建IOC容器)2.3 应用上下文的准备(准备IOC容器的基本信息)2.4 应用上下文的刷新(刷新IOC容器)Spr

2021-05-28 21:57:17 1164 4

原创 DispatcherServlet的九大组件——处理器异常解析器组件——源码和实现——万字长文

文章目录1:为什么要学习DispatcherServlet的九大组件2:处理器异常解析器介绍3:ExceptionHandlerExceptionResolver3.1 @ExceptionHandler 解析器概述3.2 @ControllerAdvice+@ExceptionHandler处理全局异常——底层ExceptionHandlerExceptionResolver3.3 全局异常的源码调试4:ResponseStatusExceptionResolver4.2 @ResponseStatus+

2021-05-25 00:35:11 455

原创 DispatcherServlet的九大组件——ViewResolver组件——万字长文

文章目录1:为什么要学习DispatcherServlet的九大组件3:视图解析器的查找过程4:视图的渲染过程5:SpringMVC对视图的支持1:为什么要学习DispatcherServlet的九大组件在如下的这篇文章中从一个请求入口来带你探究DispatcherServlet的奥秘——SpringMVC的核心组件——万字长文已经探讨过了,为什么一个请求最终会到DispatcherServlet中的doDispatch方法中实现和该方法中的执行可以分为11个逻辑代码块。那为什么今天要聊这个话题呢?

2021-05-23 22:30:07 662 5

原创 从解决重复提交表单的问题中教会你RedirectAttributes和重定向(redirect)的简单使用

文章目录1:重复提交表单的演示和原因2:解决重复提交表单——redirect的使用1:重复提交表单的演示和原因今天回顾自己做的一个SSM项目的时候,忽然发现有一个小瑕疵,那就是重复提交表单的问题。那么什么叫重复提交表单呢?我们直接用大白话解释,举例:当你从登录界面跳转到自己的主页的时候,我们的后端中肯定会有一个带有 @PostMapping注解的方法,这个时候我们如果跳转到自己的主页,并不断的点击刷新就会出现重复提交表单的问题。如果没理解上面的意思,我们来通过代码和图片演示来进行理解login.htm

2021-05-20 23:03:43 616 4

原创 从一个请求入口来带你探究DispatcherServlet的奥秘——SpringMVC的核心组件——万字长文

文章目录1:十万个为什么?2:Debugger的使用3:Spring MVC的请求处理路口——processRequest4:DispatcherServlet类中的doDispatch方法探究——请求分发处理4.1 doDispatch方法—— 请求分发概述4.2 获取请求处理器4.3 查找处理适配器4.4 处理适配器执行4.5 处理返回值与响应4.5.1 render核心方法——对结果统一处理的渲染方法5:DispatcherServlet请求分发过程总结6:doDispatch方法的完整源码调试7:一

2021-05-17 00:30:27 950 1

原创 idea中Debugger的使用——工欲善其事,必先利其器

文章目录2.1 调试图解2.2 调试使用此篇文章的主要目的是给我的另外一篇文章从一个请求入口来带你探究DispatcherServlet的奥秘——SpringMVC的核心组件做个铺垫,里面的有关内容都是按照上面的文章讲解2.1 调试图解以如下示例代码MyController为例,展示对控制器方法添加断点后的调试页面。在debug方法的第一行添加断点。使用调试模式 启动应用,启动成功后, 通过浏览器访问http://localhost:8080/some.do此时进入断点,如下图所示。下再面根据

2021-05-15 01:27:20 1192 1

原创 Spring MVC框架——第二章

文章目录1:MVC介绍2:Spring MVC框架介绍在各种开发框架出现之前,是Web开发的洪荒时期,在Servlet标准与Servlet容器出现后,开拓了Java Web开发的领域,但是原始的Servlet容器还是比较低级的,要开发大型应用,会导致Servlet组件的逻辑异常复杂,甚至充斥着各种判断与硬编码, 而Spring MVC框架则完美地解决了此问题,通过注解标记机制,形成了应用层无需判断,只需关注处理逻辑即可开发的方式Spring Web相关的模块都是支持Web项项目开发的模块,其中具有名的就

2021-05-11 20:49:02 186 1

原创 Spring框架介绍——第一章

文章目录1: Spring的进化2:Spring的功能3:Spring模块介绍在所有的框架体系中,Spring 框架是其中最明亮的一颗星星。Spring框架在Java的发展过程中是不可或缺的,其为Java 语言在企业级应用开发的推广中立下了汗马功劳。本章主要介绍Spring框架体系的生态系统和演化Spring框架经久不衰,必定有一定的原因。其中很重要的一个原因便是保持活力。Spring框架根据当前时代的发展与理念的变更持续更新,使自己保持新鲜的活力。下面就简单介绍一 下 Spring 框架的发展过程。

2021-05-11 11:52:49 241 1

原创 为什么启动一个线程是start方法而不是run方法

文章目录1:一个例子来说明你是否启动一个线程2:从源码角度看调用start方法为什么会启动一个线程1:一个例子来说明你是否启动一个线程看下面代码演示,我们使用Thread.currentThread().getName()来打印当前线程名字public class ThreadStartAndRun { public static void main(String[] args) { new Thread(()->{ for (int i=0;i&

2021-05-05 18:51:00 250 4

原创 Java反射——反射获取类的结构信息——第四章

文章目录1:通过反射获取类的结构信息1.1 java.lang.Class类1.2 java.lang.reflect.Field类1.3 java.lang.reflect.Method类4:java.lang.reflect.Constructor类5:反射爆破创建实例1:通过反射获取类的结构信息1.1 java.lang.Class类getName:获取全类名getSimpleName:获取简单类名getFields:获取所有public修饰的属性,包含本类以及父类的ge

2021-05-04 22:10:11 261 3

原创 Java反射——类加载——第三章

文章目录1:动态和静态加载2:类加载的过程接下来跟大家说一下类加载,类加载就是我们把编译阶段生成的字节码通过类加载器生成到运行时数据区中的堆里面和在方法区中生成字节码二进制数据,接下来我们就讲一下类加载的过程1:动态和静态加载基本说明反射机制是Java实现动态语言的关键,也就是通过反射实现类动态加载。1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强2.动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性静态加载案例演示:我们如果写在idea

2021-05-04 19:45:20 284 5

原创 Java反射——Class类——第二章

文章目录1:Class类基本介绍2:Class常用方法演示3:获取Class对象的6种方式4:那些类型有Class对象1:Class类基本介绍Class也是类,因此也继承Object类Class类对象不是new出来的,而是系统创建的如下代码演示,可以在7,12行分别进行断点调试,可以追到ClassLoader加载器中的loadClass方法 public Class<?> loadClass(String name) throws ClassNotFoundExce

2021-05-04 14:19:49 234 3

原创 Java反射——反射机制问题——第一章

文章目录1:一个需求引出反射2:反射入门3:反射原理图4:反射是我们框架的灵魂,反射也是我们框架的一个底层基石,没有反射也就没有框架,如果我们学好了反射,对我们阅读框架底层是有很大班助的——阿俊。有些文章上来就讲反射,就会很懵逼,不知道是干啥的,所以我们就引出一些问题来看看为什么需要反射1:一个需求引出反射看下面的问题根据配置文件reflection.properties指定信息,创建People对象并调用方法hiclassullpath= com.reflection.Peoplemethod

2021-05-03 23:32:00 1092 22

原创 JUC——并发容器ConcurrentLinkedQueue源码解读

文章目录1:ConcurrentLinkedQueue的介绍1.1 初始化分析1.2 入队列分析1.3 出队列情况分析1.4 队列判空分析2:使用debug进行源码分析1:ConcurrentLinkedQueue的介绍ConcurrentLinkedQueue 的实现 原理:是基于 CAS,通过head/ail指针记录队列头部和尾部。首先,它是一个单向链表,定义如下。public class ConcurrentLinkedQueue<E> extends AbstractQueue&

2021-04-15 11:50:21 166 2

原创 JUC——并发容器ConcurrentHashMap源码解读

文章目录1:JDK1.8中ConcurrentHashMap的实现方式1.1 构造函数分析1.2 初始化分析1.3 put方法分析1.4 get方法分析HashMap通常的实现方式是“数组”+“链表”,这种方式被称为拉链法。HashMap源码解读ConcurrentHashMap在这个基本原理上进行了各种优化,在JDK1.7和JDK1.8中的实现有很大差异。我在这里只说在JDK1.8中的实现方式。ConcurrentHashMap是一个高效的并发HashMap,可以把它理解为一个线程安全的HashMa

2021-04-15 01:28:07 282 1

原创 ThreadPool线程池——线程复用——超级详细骗

文章目录1:线程池介绍2:JDK对线程池的支持——Executor3:核心线程池的内部实现——ThreadPoolExecutor4:拒绝策略——RejectedExecutionHandler——超负载解决办法5:ThreadFactory——自定义线程创建6:优化线程池数量多线程的软件设计方法确实可以最大限度地发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,若不加控制和管理,随意使用线程,对系统的性能反而会产生不利的影响。 Thread thread = new Thread(ne

2021-04-13 01:26:34 499 9

原创 线程池——线程池创建的5种方法

文章目录1 newFixedThreadPool 方法2 newSingleThreadExcutor方法3 newCachedThreadPool方法4 newSingleThreadScheduledExecutor方法5 newScheduledThreadPool方法1 newFixedThreadPool 方法newFixedThreadPool() 方法:该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的

2021-04-13 01:25:04 1305 1

原创 线程池——ThreadFactory——自定义线程创建

大家有没有想过 线程池中的线程是从哪里来的呢?之前介绍过,线程池的主要作用是为了线程复用,也就是避免了线程的频繁创建,但是,最开始的那些线程从何而来呢?答案就是ThreadFactory(根据需要创建新线程的对象。使用线程工厂,允许应用程序使用特殊的线程子类、优先级等。)ThreadFactory 是一个接口,它只有一个用来创建线程的方法。Thread newThread (Runnable r);//r:一个由新的线程实例执行的可运行程序当线程池需要新建线程时,就会调用这个方法。自定义线程池

2021-04-13 01:22:26 3813 1

原创 线程池——拒绝策略——RejectedExecutionHandler——超负载解决办法

1:拒绝策略——超负载解决办法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Ru

2021-04-13 01:21:15 1719 1

原创 JUC——并发容器BlockingQueue数据共享通道源码解析

文章目录1:BlockingQueue数据共享通道介绍2:BlockingQueue的用处3:BlockingQueue的核心方法4:BlockingQueue工作机制——源码解析5:BlockingQueue实现生产者消费者模式1:BlockingQueue数据共享通道介绍对于并发程序而言,高性能自然是个我们需要追求的目标,但多线程的开发模式还会引入一个问题,那就是如何进行多个线程间的数据共享呢?比如,线程A希望给线程B发一条消息,用什么方式告知线程B是比较合理的呢?一般来说,我们总是希望整个系统是

2021-04-12 15:28:46 174 2

原创 JUC——ReadWriteLock读写锁

文章目录1:ReadWriteLock读写锁介绍2:ReadWriteLock读写锁演示1:ReadWriteLock读写锁介绍ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效地帮助减少锁竞争,提升系统性能。用锁分离的机制来提升性能非常容易理解,比如线程A1、 A2. A3进行写操作,B1、B2、B3进行读操作,如果使用重入锁或者内部锁,从理论上说所有读之间、读与写之间、写和写之间都是串行操作。当B1进行读取时,B2、 B3 则需要等待锁。由于读操作并不对数据的完整性造成破坏,

2021-04-11 22:25:05 138

原创 JUC——JUC强大辅助类讲解

文章目录1:JUC是什么2:倒计数器——CountDownLatchDemo3:循环栅栏——CyclicBarrier4:允许多个线程同时访问——Semaphore(信号量)1:JUC是什么JUC全名java.util.concurrent是一种在并发编程中使用的工具类JUC主要是三大包构成:并发包,并发原子包,并发lock包如下介绍的三种辅助类都是在java.util.concurrent包下2:倒计数器——CountDownLatchDemoCountDownLatch是一个非常实用的多线

2021-04-11 21:26:31 297 1

原创 JUC包——并发容器CopyOnWriteArrayList类的源码解析——高效读取

文章目录1:CopyOnWriteArrayList源码解析1.1 源码解析1:CopyOnWriteArrayList源码解析CopyOnWriteArrayList:ArrayList的线程安全变体,其中所有可变操作(添加、设置等)都是通过创建底层数组的新副本来实现的。(写时复制是读写分离思想的一种体现)ArrayList的线程安全变体,其中所有可变操作(添加、设置等)都是通过创建底层数组的新副本来实现的。生活例子每一个同学都要进行花名册签到,会出现什么情况呢?正常情况下,老师会按顺序给同

2021-04-11 01:14:34 146

原创 线程安全概念与关键字synchronized

文章目录1:线程安全重要性2:关键字synchronized1:线程安全重要性并行程序开发的一大关注重点就是线程安全。一 般来说, 程序并行化是为了获得更高的执行效率,但前提是,高效率不能以牺牲正确性为代价。如果程序并行化后,连基本的执行结果的正确性都无法保证,那么并行程序本身也就没有任何意义了。因此,线程安全就是并行程序的根基。大家还记得那个多线程读写long型数据的案例吧!它就是一个典型的反例。但在使用volatile 关键字后,这种错误的情况有所改善。但是,volatile 关键字并不能真正保证线

2021-04-10 11:26:02 697 1

原创 线程间通信——等待(wait)和通知(notify)

文章目录1:等待(wait)和通知(notify)的介绍2:等待(wait)和通知(notify)的执行机制1:等待(wait)和通知(notify)的介绍JDK提供了两个非常重要的接口线程:等待wait()方法和通知notify()方法。这两个方法在Object类中,意味着任何对象都可以调用这两个方法。方法签名如下public final void wait() throws InterruptedException {public final native void notify();当在一

2021-04-10 10:32:41 675

原创 Java集合——Map接口实现类的源码剖析——最认真的图解——第三章

文章目录1:集合体系图2:Map接口特点和方法3:Map六大遍历方式4:HashMap底层机制以及源码剖析5:HashTable使用6:Properties7:集合选型规则8:Collections工具类1:集合体系图Collection:单列集合,该接口有两个重要的子接口List Set,他们的实现子类都是单列集合Map:双列集合,Map接口的实现子类,存放K-V2:Map接口特点和方法Map与Collection并列存在。用于保存具有映射关系的数据:Key-ValueMap中的k

2021-04-06 23:52:50 238 1

原创 Java集合——Set接口实现类的源码剖析——最认真的图解——第二章

文章目录1:集合体系图2:Set接口和常用方法3:HashSet全面说明3.1 HashSet底层机制说明3.2 HashSet底层机制——扩容和转成红黑树机制再说明4:HashSet实战5:LinkedHashSet介绍1:集合体系图Collection:单列集合,该接口有两个重要的子接口List Set,他们的实现子类都是单列集合Map:双列集合,Map接口的实现子类,存放K-V2:Set接口和常用方法Set接口基本介绍1)无序(添加和取出的顺序不一致)没有索引(没有get方法,所以也没

2021-04-05 23:54:16 171 1

原创 Java集合——Collection接口以及ArrayList,Vector,LinkedList的源码剖析——最认真的图解——第一章

文章目录1:集合体系图2:Collection方法2.1 Collection接口和常用方法2.2 Collection接口遍历元素的方式2.2.1 使用Iterator(迭代器)基本介绍2.2.2 for循环增强3:List接口和方法3.1 List接口基本介绍3.2 List接口的常用方法3.3 List接口的三种遍历方式4:ArrayList源码剖析5:Vector源码剖析6:LinkedList源码剖析6.1 LinkedList的全面说明和底层操作机制6.2 LinkedList源码剖析7:Lis

2021-04-05 11:11:03 254 1

原创 深入理解Java虚拟机——JVM命令行监控工具——第十四章——下篇

文章目录1:概述2:jps:查看正在运行的Java进程2.1 基本情况2.2 jps命令格式3:jstat:查看JVM统计信息3.1 基本情况3.2 jstat命令格式4:jinfo:实时查看和修改JVM配置参数4.1 基本情况4.2 jinfo命令格式5:jmap:导出内存映像文件&内存使用情况5.1 基本情况5.2 jmap命令格式5.3 jmap的三种使用6:jhat: JDK自带堆分析工具7: jstack:打印JVM中线程快照1:概述性能诊断是软件工程师在日常工作中需要经常面对和解决的

2021-03-30 21:02:26 228

原创 深入理解Java虚拟机——性能监控与调优概述——第十三章——下篇

文章目录1:大厂面试题2:性能监控与调优的背景3:调优概述4:性能优化步骤4.1 (发现问题):性能监控4.2 (排查问题):性能分析4.3 (解决问题):性能调优5:性能评价/测试指标1:大厂面试题支付宝:支付宝三面: JVM性能调优都做了什么?小米:有做过JVM内存优化吗?从SQL、JVM、架构、数据库四个方面讲讲优化思路蚂蚁金服:JVM的编译优化,JVM性能调优都做了什么,JVM诊断调优工具用过哪些?二面:JVM怎样调优,堆内存、栈空间设置多少合适三面:JVM相关的分析工具使用

2021-03-29 22:57:17 126

原创 javac编译原理简介

文章目录1:javac的七个阶段1.1 第一阶段:parsejavac这种将源代码转化为字节码的过程在编译原理上属于前端编译,不涉及相关代码的生成和优化。JDK中的javac本身是用Java语言编写的,在某种意义上实现javac语言自举。javac没有使用类似的YACC和Lex这样的生成器工具,所有词法分析和语法分析等功能都是自己实现,代码精简高效通过以下学习,我们可以知道javac编译过程的七个阶段和各阶段作用1:javac的七个阶段1 ) parse:读取java源文件,做词法分析(LEX

2021-03-26 14:43:45 1310 5

原创 深入理解Java虚拟机——线程安全

文章目录1:概述2:线程安全2.1 Java语言中的线程安全2.2 线程安全实现方法1:概述并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因对于高并发来说,首先需要保证并发的正确性,然后在此基础上实现高效,所已,我们要先从如何保证并发的正确性和如何实现线程安全讲起2:线程安全线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得

2021-03-13 21:55:04 129

原创 深入理解Java虚拟机——Java内存模型与线程

文章目录1:Java内存模型1.1 主内存与工作内存1.2 内存间交互操作1.3 对于volatile型变量的特殊规则1.4 对long和double型变量的特殊规则1.5 原子性,可见性,有序性2:Java与线程2.1 线程的实现2.2 Java 线程调度2.3 状态转化1:Java内存模型Java虚拟机试图定义一种Java内存模型(JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都可以达到一致内存访问效果。之前的主流C/C++直接使用物理硬件和操作系统的内存

2021-03-11 22:34:41 101

原创 Java高并发——走入并行世界——第一章

文章目录1:为什么需要并行2:有关并行必须知道的几个概念3:并发级别4:有关并行的两个重要定律5: 回到Java:JMM1:为什么需要并行Linus是一个传奇的人物,是他给出了Linux的原型,并且一直致力于推广和发展Linux系统。1991年,他在网络上发布Linux源码,从此Linux迅速崛起壮大,成为目前最广泛的操作系统之一。由于他和BitMover之间的分歧,因此Linus决定自行研发版本控制工具,于是,Git诞生了。正是这位传奇人物,给目前红红火火的并行计算泼了一个凉水,他说到:并行计算只可

2021-01-31 23:25:34 160 1

原创 Java后端技术体系-学习顺序总结

2020-12-24 11:09:33 891

原创 电商项目——分布式事务——第十三章——中篇

文章目录1:本地事务在分布式下的问题2:本地事务隔离级别&传播行为等复习3:分布式CAP&Raft原理4:BASE5:分布式事务常见解决方案6:Seata&环境准备7:Seata分布式事务体验8:最终一致性库存解锁逻辑1:本地事务在分布式下的问题 @Transactional @Override public SubmitOrderResponseVo submitOrder(OrderSubmitVo vo) { confirmVoThrea

2020-11-25 15:00:25 387

原创 电商项目——订单服务——第十二章——中篇

文章目录1:订单基本概念2:订单登录拦截3:订单确认页模型抽取4:订单确认页数据获取5:Feign远程调用丢失请求头问题和Feign异步调用丢失请求头问题6:bug修改7:订单确认页渲染8:订单确认页库存查询9:订单确认页模拟运费效果10:订单确认页细节显示11:接口幂等性讨论12:订单确认页完成13:原子验令牌14:构造订单数据15:构造订单项数据16:订单验价17:保存订单数据18:锁定库存19:提交订单的问题1:订单基本概念2:订单登录拦截mall-orderOrderInter

2020-11-24 14:35:51 576

空空如也

空空如也

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

TA关注的人

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