自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第六章、谈谈数据的入栈与出栈

经过上一篇的分析,我已经对ntty的服务端的启动流程以及客户端连接之后的数据发送逻辑有了一定的认识。**以下是channel注册到workerGroup的流程**bossGroup在接收到客户端连接发送数据的请求之后,会将这个channel注册到workerGroup上。workerGroup收到注册请求之后,执行ChannelIntializer的initChannel方法,将我们自己的handler加入到pipeline中handler加入到pipeline的handler联之后,依次执行每

2022-04-13 12:02:15 391

原创 第五章、netty启动、客户端传送数据流程分析

前言本人所有的源码分析都是基于代码一行行的debug追踪、直到自己对于整个流程都有大概的思路之后,才会再一次一步一步的去给代码上打注释。这样不可避免的出现有些理解不到位、理解偏差、大量的代码对于阅读性不太友好、甚至有的会直接看懵比。。 但是对于源码分析这一块,我实在找不到更好的办法去处理,网上也有很多优秀博主,他们的分析比较生动简洁、但是对于源码这一块,我暂时还没发现有比较好的借鉴的例子…一、Netty服务端启动监听public final class EchoServer { sta

2022-04-11 11:11:35 301

原创 第四章、Netty的核心组件

Netty的基本介绍netty官网是这么介绍netty的Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket

2022-03-31 10:08:36 206

原创 第三章、谈谈Reactor模式

什么是Reactor?在Scalable IO in Java一书中,作者总结了三种反应器模式一、基本版本二、多线程版本三、主从Reactor版本

2022-03-15 20:15:11 508

原创 第二章、新一代非阻塞IO--NIO

一、NIO是什么在Netty in Action中有这么一段解释New or non-blocking?The N in NIO is typically thought to mean non-blocking rather than new.NIO has beenaround for so long now that nobody calls it new IO anymore. Most people refer to it as nonblocking IO新的还是非阻塞的?NIO中

2022-03-11 14:17:33 349

原创 第一章、阻塞模式下的BIO

一、BIO是什么bio全名为Bloking IO,也就是阻塞iobio是传统的java io, 包名–java.iobio实现模式:服务端为每一个请求的客户端都去创建一个线程来处理业务逻辑。二、BIO简单架构模式以及优缺点架构模式在客户端去与服务端建立连接之后,服务端会为每一个客户端都创建一个新的线程,去处理业务逻辑在服务器中,我们能创建的线程是有限制的。并且大量的线程用来处理客户端的连接以及其他操作是很耗费服务器的资源的。并且bio是阻塞io,也就是客户端没有发送数据的时候,服务端会一

2022-03-10 14:01:23 540

原创 spring-aop源码解析之事务

一、基于注解方式的事务的使用1、基本的ssm环境搭建参考官方文档或者其他博主,这里就掠过了2、事务依赖、事务管理器依赖的添加事务的使用必须建立在事务管理器上。spring给我们已经配置好了事务管理器,我们只需要将其添加到我们的ioc容器中即可依赖的添加<!--事务相关依赖--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-t

2021-11-05 15:30:52 125

原创 Mybatis(plus)使用过程中的一些小问题

问题1:多表关联的条件查询、分页、排序在使用mybatis-plus自带的分页查询时,我们只能查询出实体类的相关信息。但是如果需要同时查出其他表的信息,那么就得查两次。在没有其他限制条件的情况下,查两次也没有什么问题。但是如果加上排序以及分页,那么两次查询就不能满足需求了。example我们有三张表 A学生表 B学生在课程下的排名 C课程表我们要查符合某些条件的学生的信息以及在某门课程下的排名信息,并且根据排名来排序,最后在加上分页查。这显然是一个比较复杂的查询了。(如何在业务逻辑去处理??

2021-03-18 16:25:23 1171

原创 MyBatis源码解析之SqlSession的构建

创建好了sqlSessionFactory,但是我们最终要使用的是创建好的代理对象。而代理对象的创建需要sqlSession来参与。所以我们还得看看sqlSession是什么东西,他的作用是什么。1、SqlSession的创建这里我还是跟一下源代码吧 这一块代码不是特别多//创建sqlSessionSqlSession sqlSession = factory.openSession();DefaultSqlSessionFactory 66 lineprivate SqlSess

2021-02-03 12:07:07 135

原创 MyBatis源码解析之SqlSessionFactory的构建

mybatis他是一个基于jdbc封装好的一个持久层框架。在使用mybatis的时候,我们需要创建一个sqlSessionFactory与sqlSession,然后使用sqlSession创建出我们的代理对象,由代理对象去执行目标方法,拿到最终的执行结果。因为我们这一块的所有的mapper都是基于接口的,所以mybatis使用jdk的动态代理来创建代理对象。首先看一下官方文档对于这几个名字的解释SqlSessionFactoryBuilder这个类可以被实例化、使用和丢弃,一旦创建了 SqlSes

2021-02-03 10:57:25 333

原创 ThreadLocal源码解析

无论是在面试还是在平时得web开发中,我们经常会遇到线程安全问题。在不同线程去操作共享数据得时候(mysql、redis、jvm内存中的数据),必定会涉及到数据安全问题。mysql有自己的行锁来确保安全性。redis是基于内存的单线程数据库,所以不会存在线程安全问题。在jvm中的数据如何保证线程操作的安全性呢?1、volatile + cas保证线程安全volatile规定的缓存一致性与有序性,在大部分形况下已经可以保证线程安全了。而cas更不必多说,在java并发包下的所有的类的实现都是基于抽象队列

2021-02-01 11:07:00 103

原创 redis队列的使用

一、redisTemplate对于set集合的使用1、需求背景在做运营商对接的时候(买手机号码),我需要去调他们的接口,查询号码、去对客户的身份信息校验、然后去下预约单、号码锁定、正式单...首先,号码锁定需要预约单返回的订单号,正式单需要号码锁定返回的seq与预约单返回的订单号2、解决方案接口的调用顺序 这里,我可以使用一个线程编排去处理这个事情首先,号码查询与客户信息校验可以同步去进行。然后根据上一步的结果,去进行预约单根据预约单结果去号码锁定根据预约单结果与号码..

2021-01-30 11:43:09 717

原创 MyBatis源码解析之环境搭建

企业级web开发中,用的比较多的就属于mybatis了。mybatis是一个与数据库交互的持久层框架。我们就简单分析下mybatis的底层原理。这里环境搭建可以参考mybatis官方文档mybatis官网文档1、创建datasourceprivate static DataSource getDataSource(){ String url = "jdbc:mysql://192.168.175.3:3306/ssm_crud?failOverReadOnly=false&u

2021-01-28 16:18:28 135 2

原创 spring-aop源码解析之代理bean的创建以及使用

从前面的简单的分析之中,我们得知,在ioc创建好我们的切入点的bean之后,使用的并不是创建好的bean,而还会为他创建一个代理bean。这个代理bean中有其关于方法增强的属性。具体的代理bean的属性如下图所示。可以清楚看到创建的代理对象中有相关的增强器。再来看看增强器都有什么属性增强器的类型 以及属于哪个切面类, 增强器在哪个方法上作用都有相关字段记录。所以我来来看看代理对象的创建,以及代理对象的使用。代理对象的创建AbstractAutoProxyCreator 174 li

2021-01-27 15:13:39 1291 3

原创 spring-aop源码解析之bean的创建

前面我们搭建好了一个简单的aop功能,并且成功运行得到了结果。这里我们来分析以下aop模式下的bean的创建以及aop功能的实现1、@EnableAspectJAutoProxy注解的作用如果我们不在配置类上面加这个注解,那么我们标注的@Aspect注解不会起作用,那么ioc也只会将切面相关的类管理起来,但是这些类与其他的类就一模一样了。少了它特有的aop的功能。那么就来看看@EnableAspectJAutoProxy注解到底做了什么事情。//导入了一个自动代理的bean的解析器@Import

2021-01-20 17:48:19 376

原创 spring-aop源码解析之环境搭建

前言在前面讲过了spring的ioc容器的创建以及bean的实例化过程,后面继续介绍了springmvc的执行流程。至此,我们在web开发中最核心的两个模块的大致运行流程我们已经有了一个模糊的印象了但是,web开发中不仅仅只是ioc对于bean的管理以及我们的servlet的使用。在日常开发中,我们也需要做一些简单的日志,或者在crud中需要对数据库的事务进行管理,还有对于一些业务需要进行缓存也可以使用aop去统一处理,权限认证呀(一般是在filter或者interceptor中去做的),数据库

2021-01-20 15:33:40 350 2

原创 ModelAndView的生成与解析

在调用完我们的业务逻辑之后,springmvc会生成一个modelAndView对象,然后将他处理解析成view视图返回给前端。所以我们再来分析一下视图的生成以及解析规则。接着我们上一节在handlerAdapter的初始化时说的调用handlerAdapter的handle方法,看看他到底是怎么生成view的业务处理mv = ha.handle(processedRequest, response, mappedHandler.getHandler());视图生成AbstractHandler

2021-01-04 17:33:31 795

原创 springmvc的handler收集

在上一篇中我们大概分析了springmvc的流程处理,但是我们会发现一个最重要的问题:我们知道的springmvc初始化ioc的时机以及他的运行流程。在流程分析的时候,我们可以看到他是直接从一个urlLookup(Map)中去取handler的。但是对于hander的收集这一块又是什么时候去进行的?他又是什么时候将handler与其对应的uri封装到urlLookup中得?以及MappingHandler是什么时候创建?他里面都封装了哪些handler?1、onRefresh的作用在前面对于ioc容器的

2020-12-27 16:15:34 159

原创 Springmvc的请求处理

在上两篇中,我们简单的介绍了web模式下bean的注入以及ioc容器的创建时间。那么,在容器创建之后,servletContext会持有ioc容器,以便在后面去处理业务逻辑这一篇我们就仔细分析一下springmvc是怎么处理请求,又是如何去使用ioc容器中的bean的我们都知道,springmvc也是基于servlet去处理请求。那么他就应该符合servlet的执行流程与规范在使用servlet的时候,我们需要在web.xml文件中去配置servlet的名字与类路径以及他需要处理的请求。同样,我们也为

2020-12-27 12:25:39 148 2

原创 web环境下的ioc容器的创建(2)

上一篇我们简单说了在初始化DiapatcherServlet的时候,他是如何来创建ioc容器并去加载bean的,但是我们还有aplicationContext.xml文件没有被加载进去。同理,我们的mybatis-config.xml也没有被加载那么这一篇我们来分析下如何才能让我们的applicationContext.xml文件被加载基于监听器的xml文件的加载在servlet中,我们往往会在web.xml文件中来配置一个监听器,在我们web服务启动之后用它去处理一些事情。web.xml中配置监听

2020-12-16 16:09:35 265

原创 web环境下的ioc容器的创建(1)

在前面的spring ioc源码分析中,我们从配置文件以及注解两方面简单分析了beanDefinition的创建以及bean的实例化过程。而目前企业开发中大都是基于web环境的。那么在web环境下,spring的ioc是在什么时候创建的?它又在什么地方起作用了?1、从简单的ssm环境来看web环境下ioc容器的创建流程这里环境搭建过程就省略了 将项目部署在tomcat下,然后启动tomcat首先我们需要只要,springmvc也是基于servlet来进行web开发的。我们在web.xml中...

2020-12-16 15:24:44 240 1

原创 spring源码解析之ioc-finishBeanFactoryInitialization

1、首先简单看一下监听器的注册this.registerListeners();注册监听器protected void registerListeners() { Iterator var1 = this.getApplicationListeners().iterator(); while(var1.hasNext()) { ApplicationListener<?> listener = (ApplicationListen

2020-12-10 16:07:41 143

原创 spring源码解析之ioc-registerBeanPostProcessors

继续往下走//往下看registerBeanPostProcessors(beanFactory);注册beanPostProcessorsprotected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { //继续往下看 PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);

2020-12-08 18:01:31 155

原创 spring源码解析之ioc-invokeBeanFactoryPostProcessors

接下来本应该是postProcessBeanFactory(beanFactory);但是他是留给子类去做处理的,我们这里没用他的具体业务,所以直接略过我们继续往下走invokeBeanFactoryPostProcessors(beanFactory);执行beanFactoryPostProcessorprotected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {

2020-12-08 16:53:00 160 1

原创 spring源码解析之ioc-prepareBeanFactory

上一篇,我们分析了beanDefinition的定义,接着,我们继续跟着源码,来看看spring ioc在启动阶段都做了什么事还是来贴出核心代码public void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { this.prepareRefresh(); ConfigurableL

2020-12-08 16:17:42 124

原创 spring源码解析之ioc-BeanDefinition的加载

BeanDefinition的加载beanDefination的加载主要分为三种1、基于xml配置文件的beanDefinition的加载1、配置文件的读取public static void main(String[] args) { 创建ioc容器 ApplicationContext context = new ClassPathXmlApplicationContext("classpath:app1.xml"); Student student =(St

2020-12-04 17:42:05 188

原创 从ThreadPoolExecutor看线程池

首先复习下创建线程的几种方式1、实现runnable接口 new Thread(() -> log.info("方式一:实现runnable接口")).start(); 2、实现callable接口 FutureTask<String> task = new FutureTask<>(() -> "方式二:实现callable接口"); new Thread(task).start();3、继承Thread类 class MyThread e

2020-11-30 11:52:30 436

原创 从读写锁来看抽象队列同步器(释放写锁)

还是接着上一篇的,在加了写锁之后,就到了释放锁的环节从释放锁进入writeLock.unlock();//释放锁public void unlock() { sync.release(1);}public final boolean release(int arg) { //1、尝试释放锁 返回值代表是否还有写锁 没有返回frue if (tryRelease(arg)) { Node h = head; if (h != null &

2020-11-10 18:54:19 162 1

原创 从读写锁来看抽象队列同步器(加写锁)

fair写锁的加锁源码解析在上两篇中,我们仔细分析了nofair模式下的读锁的加锁与释放,这里再简单看一下fair模式下的写锁的加锁与释放还是从加锁入手ReadWriteLock lock = new ReentrantReadWriteLock(true); Lock writeLock = lock.writeLock(); writeLock.lock();//加锁public void lock() { sync.acquire(1);}public fin

2020-11-10 18:40:06 106

原创 从读写锁来看抽象队列同步器(释放读锁)

接着上一篇的,在加了锁之后,就到了释放锁的环节话不多说,直接上源码从释放锁进入readLock.unlock();public void unlock() { //还是默认的非公平锁的释放 sync.releaseShared(1);}释放锁public final boolean releaseShared(int arg) { //1、尝试释放锁 如果释放之后, 锁的数量为0 则会执行第2步 if (tryReleaseShared(arg)) {

2020-11-10 18:03:29 111

原创 从读写锁来看抽象队列同步器(加读锁)

越来越有意思了读写锁源码分析public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable { //读锁 private final ReentrantReadWriteLock.ReadLock readerLock; //写锁 private final ReentrantReadWriteLock.WriteLock writerLock;

2020-11-06 12:30:59 221

原创 ConcurrentHashMap

这个能看懂的都是大佬了反正我是看懂了一部分,但是对于一些跳出循环呀,跳出if判断的还是一点不懂有完全搞明白的大佬可以指点一波public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable { //最大容量 private static final int MAXIMUM_CAPACITY = 1 <<

2020-11-04 17:46:01 97

原创 HashMap

好戏开演重难点的HashMap源码解读 还有ConcurrentHashmap对比HashMap核心源码解读public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { //默认的初始化容量 1*2*2*2*2=14 static final int DEFAULT_INITIAL_CAPACITY =

2020-11-04 11:18:42 81

原创 ArrayBlockQueue

这个就有点难度了阻塞队列简单分析public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { //存放数据的object类型的数组 final Object[] items; /** items index for next take, poll, peek or remove

2020-11-04 11:17:35 123

原创 LinkedList

先来一个LinkedList压压惊public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0; transient Node<E> first; transient Nod

2020-11-04 11:15:59 86

原创 ArrayList

先来一个ArrayList压压惊public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ //初始容量为10 private static final int DEFAULT_CAPACITY = 10; //用于空实例的共享空数组实例。 pri

2020-11-04 11:13:38 69

原创 经典排序算法

冒泡排序//关键代码 public static void sort(int array[]) { for (int i = 0; i < array.length - 1; i++) { boolean flag = false; for (int j = 0; j < array.length - 1 - i...

2020-03-20 10:01:39 208

原创 Nginx(二)配置详解

一、配置文件nginx.conf启动nginx /usr/sbin/nginx 或者 nginx -c /etc/nginx/nginx.conf重启nginx的小错误/var/run/nginx/nginx.pid” no such file or directory?解决:到/var/run下看没有nginx这个目录,创建/var/run/ngin...

2020-03-18 11:34:42 223

原创 类加载机制

1、类加载时机虚拟机严格规定,在以下四种情况下,必须立即进行对类的初始化。(1)使用new关键字实例化类的对象、读取或设置类的静态字段(final修饰的除外)、调用类的静态方法。(2)对类进行反射调用的时候。(3)虚拟机启动时,先初始化用户指定的要执行的主类。(4)初始化类是,率先初始化此类的父类。除此之外,所有引用类的方式都不会触发类的初始化(被动引用)(1)通过子类...

2020-03-18 10:50:49 179

原创 自动内存管理机制

1、内存区域与内存溢出1.1、内存区域程序计数器:当前线程所执行的字节码的行号指示器。当线程切换后,再次切换回来时,可以根据此计数器得知代码执行的位置,继续往下执行。JAVA虚拟机栈:描述java方法执行的内存模型。存储(局部变量表--存储基本数据类型、操作栈、动态链接、方法出口等信息)。本地方法栈:与虚拟机栈作用类似,不过他是用来服务与本地方法的(native方法)。JAVA...

2020-03-18 10:08:15 174

空空如也

空空如也

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

TA关注的人

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