自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 可能是最卷的Spring源码系列(十九):springboot

2022-01-24 09:30:00 210

原创 可能是最卷的Spring源码系列(十八):springmvc

本文基于全注解的方式进行配置springmvc,所以源码分析的是注解方式的,但xml方式的实现也是类似的,只要搞懂其中一种方式,另一种方式就不在话下了。先简单回忆一下xml使用springmvc的步骤:1、web.xml配置上DispatcherServlet,并且指定rootContext、mvcContext的配置文件路径2、编写rootContext、mvcContext的配置文件同样,注解的方式也是这几个步骤1、创建一个WebConfiguration继承AbstractAnnotatio

2022-01-21 09:30:00 350

原创 可能是最卷的Spring源码系列(十七):spring-mybatis

本文会讲到mybatis的使用和核心原理分析、spring-mybatis的整合原理,目的是真正搞明白mybatis是如何使用spring的扩展点的Mybatis部分mybatis的简单使用我们通常都是在spring环境下使用mybatis,那么mybatis在非spring的环境下mybatis是如何使用呢?下面将会采用注解的方式来使用mybatis DataSource dataSource = BlogDataSourceFactory.getBlogDataSource(); Tran

2022-01-19 09:00:00 450

原创 可能是最卷的Spring源码系列(十六):异步

本文将会从java实现异步的方式出发,到spring对异步的支持,再到spring中异步的实现,希望通过本文章能把异步的基本部分讲透彻。异步提到异步,肯定要提到同步的概念,那么我们就对比着来理解这两个概念。其实我们写的大部分程序都是同步执行的。对于同步,最简单的理解方式就是当一行代码执行完后才能执行下面的一行代码。同理,异步就是两行代码可以同时执行,我们知道cpu是可以同时执行多个任务的,不管是通过多核还是多线程都可以实现,操作系统层面给我们提供了进程和线程相关的系统调用,使得我们可以把两个任务交给cp

2022-01-18 09:30:00 186

原创 可能是最卷的Spring源码系列(十五):事务

2022-01-17 09:30:00 274

原创 可能是最卷的Spring源码系列(十四):AOP

从本篇开始,spring的主要流程已经分析完毕了,接下来会对spring中几个重要的实现进行分析,虽然重要,但是即使跳过也不会影响你对spring源码的理解,所以如果你对前面的内容还不熟悉,请先完成前面的学习再来学习接下来的内容。aop的使用如果想要以注解的方式配置aop,需要进行如下配置1、首先在配置类上加上@EnableAspectJAutoProxy注解2、配置切面和通知,该类除了加@Component注解外,还要加@Aspect注解@Aspect@Componentpublic cla

2022-01-14 09:30:00 157

原创 可能是最卷的Spring源码系列(十三):beanFactory.preInstantiateSingletons() 方法解析

preInstantiateSingletons方法也是spring中最重要的方法之一,bean的实例化、aop、生命周期的执行等重要的步骤都是在这里面执行。有了上篇循环依赖的基础,我们一定能把这个方法分析透彻。finishBeanFactoryInitializationprotected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // Initialize convers

2022-01-10 21:32:05 862

原创 可能是最卷的Spring源码系列(十二):循环依赖

看过太多关于讲循环依赖的文章,感觉大部分都只讲到了循环依赖是怎么实现的,暂时还没有看到有文章能真正讲明白为什么要使用三级缓存,所以这篇本来计划在后面写的文章就率先被安排了。缓存级别的定义在分析spring注解之前我们先要达成一个共识,就是对三个级别缓存的定义,所以本篇文章中对三个级别的缓存有如下定义:// 一级缓存 单例池private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>

2021-12-24 09:30:00 373

原创 可能是最卷的Spring源码系列(十一):spring中的事件

spring实现了时间订阅发布的功能,所以使用spring时就不再需要自己实现或者使用jdk自带的观察者模式,使用spring自带的订阅发布功能即可。本文会从源码的角度来分析spring中事件的实现观察者模式public class Client { public static void main(String[] args) { // 被观察者(发布者) ISubject<String> observable = new ConcreteSubje

2021-12-23 10:00:00 420

原创 可能是最卷的Spring源码系列(十):spring中的国际化

最近的几篇文档都在解析refresh()方法,按照代码的实现逻辑,接下来该分析的是initMessageSource()方法,但是这个方法的实现非常简单,无非是往spring容器里面注册了相关的主键,具体的实现都在组件里面,但是我们现在只分析spring的主流程,为了保证文章的连贯性,这里我们只分析initMessageSource方法的作用,和spring中国际化的使用,关于组件的具体实现,我们放在主流程分析完后再进行分析。initMessageSourceprotected void initMes

2021-12-22 21:05:34 656

原创 可能是最卷的Spring源码系列(九):registerBeanPostProcessors方法解析

截止到目前,我们已经完成了refresh()方法中的invokeBeanFactoryPostProcessors方法的解析,我个人认为invokeBeanFactoryPostProcessors方法是spring中最复杂的方法之一,所以如果你还对invokeBeanFactoryPostProcessors不太熟悉,请先阅读该系列的前面的几篇文章。今天要解析的registerBeanPostProcessors比起前面的内容要简单的多,所以对于这个方法我们只做简单分析。首先,我用一句话概括这个方法的作用

2021-12-21 22:13:28 280

原创 可能是最卷的Spring源码系列(八):ConfigurationClassPostProcessor

本文分析最重要的一个PostProcessor,如果还不了解PostProcessor,请先阅读上篇文章,ConfigurationClassPostProcessor完成了对配置类的解析,我们知道配置类通常通过构造方法或者register方法注册到容器中,那么是不是通过这两种方法注入的类都是配置类呢?所以分析之前我们提出两个问题:1、spring会把什么样的类判断为配置类?2、ConfigurationClassPostProcessor关键步骤有哪些?分析的过程我们就围绕这两个问题Config

2021-12-19 00:04:34 423

原创 可能是最卷的Spring源码系列(七):BeanFactoryPostProcessors源码分析

BeanFactoryPostProcessors调用时机前面的文章讲到通过BeanFactoryPostProcessors来扩展spring的方法,那么BeanFactoryPostProcessors究竟是什么时候执行到的呢?本文会通过分析容器的初始化流程来讲到BeanFactoryPostProcessors的调用的时机AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Consu

2021-11-20 18:32:35 443

原创 可能是最卷的Spring源码系列(六):spring扩展点

为什么要扩展spring?我们在使用spring时,通常是单个注入bean,包括使用@bean注解、xml中的bean标签,以及包扫描都是在单个注入,把包扫描也归结为单个注入是因为我们也要在包中创建一个一个的类才能进行注入。当我们想要批量操作bean时,如在mybatis在我们想要批量把dao接口更换为代理类,这样使用单个注入的方式就不合适了,就需要批量对bean进行操作,就要使用spring的扩展点。什么是spring的扩展点?spring容器在启动和初始化过程中会默认执行一些流程,说的直白一些就

2021-11-20 17:21:19 242

原创 jvm系列一:类加载机制

类的加载类的加载就是把class文件加载到虚拟机中,结果就是以一种虚拟机认识的形式存在,JAVA虚拟机是用C++进行编码的,所以类加载到虚拟机中会被解析为C++中的结构体。C++源码之后附上。类的存在形式其实类加载到虚拟机中会以不同的形式存在,这里主要是普通的类与数组存在区别。普通的类加载到虚拟机中会生成一个instanceKlass对象,数组会生成ArrayKlass对象类的加载过程加载加载就是完成从class文件到转换为instanceKlass实例的过程,生成的instanceKlass

2021-09-11 01:01:39 113

原创 可能是最卷的Spring源码系列(五):asm扫描

Spring中的扫描对Spring进行配置有三种方式,XML、java config、注解,今天我们只关注基于注解的配置方式。基于注解的扫描就是在xml或者java config类中,指定需要扫描的包名,spring会把包中的所有的类扫描出来,然后根据扫描规则来确定都有哪些类要注册到spring容器当中。不管是基于xml配置还是基于java config配置,最终都会使用Scanner对象进行扫描,同样我们在调用AnnotationConfigApplicationContext.scan()方法时也会

2021-08-06 23:12:40 1251

原创 可能是最卷的Spring源码系列(四):BeanDifinition

学习spring源码,BeanDifinition是一个重要的基础。spring把(几乎)所有的要管理的对象都定义为Bean,在对Bean初始化之前,会把对spring配置转换为BeanDifinition对象,把所有的BeanDifinition放入到一个Map中,key为Bean的名字,value为BeanDifinition对象1、Bean先看一下Spring官网中对Bean的描述Bean是通过我们提供给spring的配置文件来创建的,这些文件包括xml文件,注解,java config配置这

2021-07-27 23:46:31 298

原创 可能是最卷的Spring源码系列(三):AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner源码分析

上篇文章已经简单介绍了AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner的功能,这篇文章将详细的分析这两个对象在分析这两个类之前再贴一下AnnotationConfigApplicationContext的继承关系可以看到AnnotationConfigApplicationContext有实现一个AnnotationConfigRegistry接口,这个接口里面有两个方法,先说结论register是有AnnotatedBeanD

2021-07-25 00:12:27 456

原创 可能是最卷的Spring源码系列(二):ApplicationContext的初始化

本系列对spring源码的分析都基于AnnotationConfigApplicationContext,其它类型的ApplicationContext暂时不会涉及AnnotationConfigApplicationContext的继承关系

2021-07-22 23:18:54 326

原创 可能是最卷的Spring源码系列(一):Spring源码环境搭建(idea)

本文是spring源码系列第一篇,计划通过10篇左右文章分析spring主要流程工欲善其事,必先利其器。同样,学习Spring源码,就必须先把Spring的源码环境搭建起来0 下载spring的源码github中搜索spring-framework项目,直接git clone或者下载压缩包1 编译源码根据spring项目的md中编译指南https://github.com/spring-projects/spring-framework/wiki/Build-from-Source1.1 执行

2021-07-22 22:01:59 573

原创 对mysq索引的浅显理解

索引为了加快查询速度我们在创建表的时候通常会添加索引,了解索引的结构,以及索引是怎么加快查询速度的,对我们准确使用索引以及面试都是有很大的帮助的。我们知道mysql的两个存储主流引擎innodb、myisam都是使用b+数存储索引的,那么我们不禁会有下面的疑问?为什么不使用hash表?我们知道数和hash都能提高查询的速度,为什么innodb、myisam选择了hash表,从hash表本身来说,hash表需要由一个优秀的hash算法才能使数据均匀的分布到hash表中,然而在实际的操作中,这种情况是很难

2021-04-27 23:23:57 122

原创 HTTPS是怎么保证安全传输的?

安全传输要解决什么问题?1.窃听问题A与B传输明文过程中,能被中间人获取到传输的内容2.篡改风险A与B传输明文过程中,中间人修改了内容再传输给B3.冒充风险A与B传输明文过程中,中间人拦截内容,修改后传给B,B传输给A内容时,修改后再传给A,此时,中间人已经冒充为B,A以为在与B通信,其实是在与中间人通信如何解决上述问题?要解决明文传输的问题,要先了解两种加密方式1.对称加密双方商量好一个密钥,传输的之前对内容进行加密,收到内容后先解密后再使用2.非对称加密非对称加密即加解密双方使用

2021-04-02 12:30:14 227 1

原创 Callable接口的理解

Callable接口的定义@FunctionalInterfacepublic interface Callable<V> { V call() throws Exception;}可以看出Callable就是一个拥有call方法的接口,可以把线程中需要执行过程定义到call方法中,跟Runnable接口一样,最终的执行还是需要用到Thread的start方法。Callable接口执行的方式1、包装成FutureTaskclass MyCallable implement

2021-03-26 10:21:45 520

原创 java模拟登陆、httpclient的使用、任务管理系统自动录入

代码地址HttpClient的使用对HttpClient进行包装package com.wanghao.task;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList

2020-05-27 15:44:45 192

原创 SpringBoot常用注解

注解@ConfigurationProperties、@Value@PropertySource&@ImportResource&@Bean@ConfigurationProperties、@Value/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相...

2020-04-06 11:52:58 116

空空如也

空空如也

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

TA关注的人

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