自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 扒一扒 ScheduledThreadPoolExecutor

前言 因为 ScheduledThreadPoolExecutor 是ThreadPoolExecutor 的子类,它只是对ThreadPoolExecutor 进行一些功能的扩充,所以好多核心原理都是在ThreadPoolExecutor 实现的。因为之前都已经聊过了,所以本篇文章不会再重复。所以建议先把前面的文章看完理解之后再来看本篇文章。关于 Java 线程与线程池的那些事https://blog.csdn.net/paralysed/article/details/12276...

2022-02-08 13:23:19 813

原创 什么是 Callable? 什么又是 FutureTask

前言我们前面的文章聊了通过 Thread 和 Runnable 创建一个线程,但是这两种创建线程的方式都是无法获取线程的返回结果的。有时候写业务代码的时候,为了加快任务的执行时间,我们会想要把一个大的任务分割成一个没有依赖关系的小的任务,每个小任务都用一个线程去执行,最终把各个小的任务的结果汇总起来,这样可以大大提高程序执行的效率。但是也面临一个问题,那就是如何获取各个线程的返回结果呢?这就是本文要探讨的内容了。本文使用的是jdk1.8.0_251。Callable...

2022-02-06 12:16:00 1152

原创 你真的懂 Thread.interrupt 了吗?

目录前言看了下面这几个例子你就全懂了总结前言interrupt 这个单词有打断,中断的意思,可是当调用 Thread.interrupt 就会让一个运行着的线程立刻停止吗?答案是否定的,本篇文章就来看下它到底有什么用吧?看了下面这几个例子你就全懂了public class InterruptTest { public static void main(String[] args) throws InterruptedException { ...

2022-02-05 17:03:13 1025

原创 关于 Java 线程与线程池的那些事

目录线程如何使用?通过 Runnable 来实例化 Thread 实例有什么不同吗?线程池又是什么鬼?ThreadPoolExecutor 的原理剖析ThreadPoolExecutor 工作的流程图​拒绝策略线程如何使用? Java 中常用的实现线程的方式为继承 Thead 或者实现 Runnable 接口,废话不多说,直接上代码public class ThreadRunnableTest { public static v...

2022-02-02 10:28:22 513

原创 Spring MVC 第四篇 - DispatcherServlet 如何管理使用 HandlerMapping?

目录前言DispatcherServlet 如何寻找合适的 HandlerMapping?DispatcherServlet 如何管理 HandlerMapping?总结前言 我们前面文章聊了 RequestMappingHandlerMapping 是如何实例化,如果处理映射关系的,可以当一个请求到达 DispatcherServlet 之后,它是怎么知道要使用哪个 HandlerMapping 的呢?如果用哪个 HandlerMapping 都不知道的话,又怎么执行...

2021-10-17 11:46:21 394

原创 Spring MVC 第三篇 - 关于处理器映射器 RequestMappingHandlerMapping

目录前言RequestMappingHandlerMapping 什么时候被加载进容器? Spring MVC 创建容器和实例化 bean 的流程 ​ 命名空间处理器NamespaceHandlerRequestMappingHandlerMapping 什么时候保存的请求和处理器的映射关系?再谈请求达到服务端时如何找到对应的 HandlerMethod前言 处理器映射器保存了请求和处理器的映射关系,在...

2021-10-16 16:48:20 1021

原创 Spring MVC 第二篇 - 关于后端处理器 HandlerMethod

前言 通过前一篇文章,我们知道了 Spring MVC 执行 Controller 方法的大致流程,其中重要的一步就是找到合适的后端处理器handler),通过 handler 来执行目标方法,而我们常用的 @RequestMapping 标注的方法会对应的handler 类型为 HandlerMethod,本文就来探究 HandlerMethod 到底是什么东西。HandlerMethodpublic class HandlerMethod { /** Logger th...

2021-10-16 09:33:09 3101

原创 Tomcat 什么时候加载 Spring 的容器?

前言 我们前面聊了 Spring MVC 的执行流程,也聊了 Servlet 的执行流程,可是我们在聊 Spring MVC 流程的时候都是假设有些对象是已经存在的,比如 HandlerMapping, HandlerAdapter 等,可是他们什么时候实例化的呢?Tomcat 启动的时候什么时候加载了 Spring 容器并把我们需要的 bean 都一个个给实例化出来了呢?这就是本篇文章的重点。ServletContextListenerpublic interface Serv...

2021-10-14 21:27:18 361

原创 Spring MVC 第一篇 - Controller 的方法是如何被调用的?

目录前言以 Post 请求为例探究执行流程​Spring MVC 的执行流程@RequestMapping 标记的处理器方法的调用流程 ​如何通过HandlerMapping 获取处理器执行链?为什么需要 HandlerAdapter ?适配器调用处理器方法的流程总结回答开头提到的几个问题前言 本文需要一些关于 Servlet 的前置知识,可以先大概看一下这个连接的内容关于 Servlet 你需要知道哪些?看完之后应该知...

2021-10-10 15:02:44 3899 2

原创 关于 Servlet 你需要知道哪些?

目录ServletServletConfigServletContextServletRequestServletResponse总结GenericServletHttpServletHttpServletRequestHttpServletResponse关于请求和响应的乱码问题Servlet Servlet 是 java 编写的服务端程序,用户可以自己写一些逻辑代码,用于处理客户端发送来的请求及返回响应的结果。Java 语...

2021-10-07 14:18:02 403

原创 Spring 事务第四篇 - Spring 事务遇到AOP会怎么样?

前言 前面的文章探索了怎么拦截事务方法,怎么对其进行增强。但是我们讲解 AOP 的时候也聊过,如果想对一个对象进行增强,首先要生成一个代理对象,然后找到增强对象的拦截器链,这样才能逐个执行拦截方法进行增强。此外本文还会解答下上文提到的一个问题,就是当 AOP 和事务同时开启的话会怎么办呢?InfrastructureAdvisorAutoProxyCreator 我们前文也已经分析过,通过@EnableTransactionManagement 会引入该后置处理器,...

2021-09-28 00:35:28 1394 2

原创 Spring AOP-代理对象增强目标方法的流程,通知方法到底什么执行顺序

目录前言流程图 ​以 MethodBeforeAdviceInterceptor 为例探讨递归流程​通知方法执行的顺序是什么呢?总结前言 本文讨论的内容为代理对象如何对切点方法进行增强,即如何协调执行各个通知方法来实现对连接点方法的增强。所以本文的前提是通知方法已经排好序,代理对象已经创建出来了。现在的时间点是业务层调用了切点方法,问题是切点方法和各个通知方法如何增强。此外因为 AOP 场景下 JdkDynamicAopProxy 用...

2021-09-27 00:12:17 759

原创 Spring AOP - 通知方法的执行顺序

前言 我们知道可以通过注解的方式来定义通知方法,如 @Before,@After 等,那么当执行连接点方法的时候这些通知方法的执行的执行顺序是什么呢?本篇文章就是探讨这个问题的,关于 advisor, pointCut,切面等定义以及生成 advisor 的时间点前面文章都已经介绍过,所以本篇只讨论 advisor 数组排序相关的内容。第一次排序,遍历切面方法时排序 我们知道,生成 advisor 实例首先要解析切面类,更准确的说是解析通知方法上的注解,根据不同的注解...

2021-09-26 14:18:06 925

原创 Spring 事务第三篇-Spring 如何拦截事务方法并对其增强?

目录前言不得不提的 @EnableTransactionManagementTransactionManagementConfigurationSelectorAutoProxyRegistrarProxyTransactionManagementConfigurationTransactionAttributeSourceBeanFactoryTransactionAttributeSourceAdvisorTransactionInterc...

2021-09-23 00:04:40 834

原创 Spring 事务第二篇-Spring 事务源码解析之事务管理器

前言 相信看了前面的文章,已经知道怎么怎么使用 java 操作数据库,怎么使用事务来管理多个数据库操作。在会使用之后自然是要继续研究一下,Spring 事务到底是如何实现的呢?不同传播类型的事务是怎么管理的呢?事务怎么管理数据库连接呢?又是怎么提交和回滚的呢?本文主要就是探讨这些问题。事务管理器-PlatformTransactionManager 还记得上篇文章讲解事务使用的时候都是进行了什么配置吗?首先是数据源 DataSource,它用来保存管理数据库连接,其...

2021-09-20 23:59:29 599

原创 Spring 事务第一篇-关于 Spring 事务你需要知道哪些?

前言 通过上一篇文章,我们知道了怎么获取数据库连接,怎么操作数据库。本篇文章的主要内容是事务,首先会讲一些概念性的东西,然后会讲 Spring 怎么使用事务,最后深入源码解析一下事物管理器 DataSourceTransactionManager 的工作原理。什么是事务? 事务就是把一组操作当成一个操作来做,这一组操作要么全部成功,要么全部失败。从表现形式上看就像执行了一个操作一样,这就是事务的作用。事务有哪几类?编程式事务:什么是编程式事务呢?无非就是自己写...

2021-09-17 23:57:15 169

原创 Spring 事务前序 - Java 如何操作数据库

目录前言你一定知道的 JDBC你见过但是可能不了解的 DataSource你一定用过的 JdbcTemplate需要的一些依赖总结前言 接下来的几篇文章是为了讲 Spring 事务,但是在此之前还是要提一下基本的一些操作数据库的方式。因为框架虽然方便了我们的操作,但是其还是依赖底层的一些操作数据库的方式的,无非是对底层一些基本的操作方式进行一些封装,如果对底层的一些知识都了然于胸,那么再往下学的话就会容易很多。因为这篇文章主要是为了给后面讲事务做铺垫的,所以举的...

2021-09-16 09:25:30 568

原创 什么是 DataSource?什么又是 DruidDataSource?

概述 DataSource 翻译过来为数据源,它是 jdk 提供的一个接口,然后只提供了两个 getConnection 方法,分别是无参数和需要传入用户名和密码。所以说它是跟数据库连接有关的东西,可以通过它来获取数据库连接。public interface DataSource extends CommonDataSource, Wrapper { /** * <p>Attempts to establish a connection with the d...

2021-09-15 22:51:10 11699 2

原创 Spring AOP 第三篇-由点到面全面解析Spring AOP

前言 前面两篇关于 SpringAOP 的文章基本把 Spring AOP 的内容都讲的差不多了,包括动态代理,拦截器,切点,切面和通知等。相信读了前面文章的同学也已经知道了怎么解析切面,怎么根据切面去匹配需要增强的被代理对象,也知道了怎么生成动态代理。 我们知道了怎么做,可是还不知道什么时候做,上述的各个节点都是什么时候触发的呢?我们知道bean的生命周期主要包括实例化 bean, 属性注入,初始化方法的调用。对一个对象增强首先要有一个对象,那么增强一定是在这个 be...

2021-09-12 01:02:30 220

原创 Spring AOP 第二篇-Spring 如何解析切面获取切点,通知和生成代理对象

Spring AOP 流程概述在上篇文章中,我们知道了增强被代理对象,需要一些具体增强的拦截器, 我们在使用 Spring AOP 的时候,虽然没有创建一个个拦截器,但是它底层代码会根据配置的注解,解析创建出一个拦截器出来,如标注了 @Before 注解的方法,就会创建出一个类型为 BeforeAdvice 类型的拦截器出来。然后会封装在 advisor 中。最终形成拦截器链,从而对被代理对象增强。有两个时间点可以对要创建的 bean 进行代理生成代理对象,一是在实...

2021-09-08 15:38:57 1766

原创 Spring AOP 第一篇-初识Spring AOP

前言 前一篇文章讲了一些关于动态代理和拦截器链的内容,Spring AOP-动态代理和拦截器。本章的内容延续上一篇文章的样例,可以先看下上篇文章。其实动态代理就是 Spring AOP 的基础,我们通过动态代理可以实现增强被代理对象的功能,但是有一个问题,那就是太麻烦了,Spring AOP 就是解决这一问题的,使得被代理对象的增强变得简单,更有利于开发使用。代码样例引入需要的依赖 <dependency> <group...

2021-09-06 23:08:12 545

原创 Spring-动态代理和拦截器

代理模式 简单来讲,代理模式就是在一个对象的基础上,提供另外一个代理对象,这个代理对象拥有原有对象的引用,拥有原有对象的任何功能,除此之外,还能添加一些功能上去,也就是所说的增强。 举例来说,这其实就像我们生活中的房屋中介,房东相当于原有对象,中介就是代理对象,中介止有房东的出售出租房屋的权利,他还能额外收取你一些中介费,保洁费什么的,这是原有对象房东所不具备的能力。所以说代理对象又可以说是增强的对象。 在代码世界里,代理模式有什么用呢?举例来说,比如现...

2021-08-29 23:27:45 989

原创 Spring populateBean注入属性-@Value @Autowired到底怎么解析的?

一些小的知识点1:beanFactory.getAutowireCandidateResolver() 获取到的对象是什么时候注入的?private AutowireCandidateResolver autowireCandidateResolver = SimpleAutowireCandidateResolver.INSTANCE;可以看到默认是初始化了一个 SimpleAutowireCandidateResolver 的实例,但是它并没有重写getSuggestedValue...

2021-08-23 23:56:34 539

原创 什么是 BeanDefinition? 以及 Spring 怎么创建一个 bean

目录概念代码举例源码剖析模拟构造器反射生成对象实例概念 它是用来描述 Bean 的,里面存放着关于 Bean 的一系列信息,比如 Bean 的作用域,Bean 所对应的 class, 是否懒加载,是否 Primary 等等。有了它 Spring 容器就掌握了实例化 bean 所需要的一些重要信息,才可以对其进行实例化。代码举例 实体类代码public class User { private String name; priv...

2021-08-11 14:32:51 1718 1

原创 Bean工厂后置处理器之 ConfigurationClassPostProcessor- Spring 到底怎么扫描到它所需要管理的bean的?

什么是bean工厂后置处理器? 在 Spring 的启动过程中,在实例化 bean 之前执行,它主要用来扫描出后面需要实例化的一些 bean,并注册成 BeanDefinition。ConfigurationClassPostProcessor 什么实例什么时候被创建出来的呢? spring 项目启动的时候都会声明一个上下文,如 AnnotationConfigApplicationContext,然后给其传入一个配置类,就可以启动 spring 容器。Anno...

2021-08-11 00:18:53 1253 5

原创 @Import 注解使用及原理解析

1:@Import的使用场景:通过 @Import 注解引入普通的 Java 类数组@Import({TestA.class}):这样就会把 TestA 注入进 IOC 容器,生成一个名字为 “com.demo.testA” 的 bean,同时也可以看到可以传入多个类,这样就可以在IOC容器里生成多个 bean。通过 @Import 注解引入实现了 ImportSelector 接口的类 实现了ImportSelector接口,就必须重写 selectImports...

2021-08-10 23:28:19 5882 1

原创 java的二分查找源码分析

前言: 之前用到二分查找的时候,都是自己手写一个,虽然并不难,但是有的时候会忽略边界条件,然后时间久了还会忘记,然后今天发现,Java其实已经实现了数组的二分查找,这里就分析一下它的源码1:该方法在 Arrays.java 这个类里面,调用的话可以直接使用 Arrays.binarySearch(), 它有好多实现,这里就拿Arrays.binarySearch(int[] a, int key) 举例。测试代码如下:public class test { @Tes...

2020-06-06 10:27:05 301 1

原创 KMP 算法 Java 代码讲解及 leetcode 对应题目

什么是 KMP 算法?该算法因为其优秀的简称获得江湖称号 "看毛片算法",简单来说 KMP 算法就是解决字符串匹配的一种算法,它通常用来解决主字符串和模式字符串的匹配问题,如存在字符串 A = "ababcde" 和 字符串 B = "abc",那么可以延伸出如下几个问题:判断字符串 B 是否存在于字符串 A 中 (相当于实现 java 字符串的 contains() 方法) 判断字符串...

2020-02-16 14:45:01 780 2

转载 Nginx是什么?能干嘛?

Nginx的产生 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。然而,这些服务器在设计...

2020-02-05 10:59:20 391

原创 nginx 安装步骤详解

安装 nginx 之前需要先安装好相关依赖 nginx 的一些模块需要引用一些 lib 库,主要包括 g++,gcc,openssl-devel,pcre-devel 和 zlib-devel等,执行如下命令即可安装: yum -y install g++ gcc openssl openssl-devel pcre-devel zlib zlib-devel 下载并解压安装包 /...

2020-02-04 10:59:52 311

空空如也

空空如也

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

TA关注的人

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