- 博客(36)
- 收藏
- 关注
原创 spring学习(四) --- getBean分析
spring中有一个接口BeanFactory,定义了容器的主要功能,比如创建bean、获取bean等,是用来管理实例化、定位、配置应用程序中的对象及建立这些对象间的依赖关系的。这节主要看下getBean的方法(其内部逻辑都在doGetBean中)。 获取bean protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object[] args, bo...
2020-05-16 16:50:25 276
原创 spring学习(三) --- 创建bean
上一节简单的介绍了下spring中bean的注册过程,就是解析配置文件,将bean的信息以BeanDefinition形式存放。这一节看一下bean的创建过程。其创建流程如下: 实例化bean 属性赋值 初始化 销毁 创建过程 创建的主要逻辑在createBean()中: protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreati...
2020-05-16 08:16:22 213
原创 spring学习(二)--- bean的注册
spring是通过IOC对bean进行管理的,而bean的初始化主要分为两部分:bean的注册和bean的实例化。bean的注册主要是spring通过读取配置文件获取各个bean的信息,并且对这些信息进行注册。spring中提供了BeanFactory对bean进行获取,但是其只是提供了一个简单的查询,真正的注册和管理是在BeanDefinitionRegistry中进行的,上节介绍的Be...
2020-05-08 10:43:34 772
原创 Spring学习(一)---BeanDefinition
BeanDefinition是一个接口,是配置文件<bean>标签在spring中内部的表现形式,<bean>标签拥有的属性对应beandifinition中的属性,也就是一个<bean>对应一个BeanDefinition实例。 ...
2020-05-03 16:48:19 145
原创 Mybatis学习(九) --- ResultSetHandler
在Statement接口在执行完之后,会将结果集交给ResultSetHandler进行映射处理。ResultSetHandler是一个接口主要有三个方法: //处理结果集,生成对应的对象集合 <E> List<E> handleResultSets(Statement stmt) throws SQLException; <E> Cursor&l...
2020-04-18 16:18:12 358
原创 Mybatis学习(八)--- StatementHandler
StatementHandler是mybatis的核心接口,是Executor接口实现的基础。Executor接口在SqlSession的实现基础,在缓存那一节我们有介绍,所以不在介绍了。 //获取Statement Statement prepare(Connection connection, Integer transactionTimeout) throws SQLEx...
2020-04-18 09:49:31 216
原创 Mybatis学习(七) --- SqlSession
SqlSession对应一次数据库会话,每次访问数据库都需要创建SqlSession,一旦关闭sqlSession就需要在重写创建。在SqlSession中定义了常用的数据库的操作以及事务的操作。sql语句在执行的时候流程如下图: 后续将介绍其他几个类。 DefaultSqlSession 该类实现了SqlSession接口,也是单独使用Mybatis进行开发时最常...
2020-04-12 23:31:48 296
原创 Mybatis学习(六)--- Xml的解析
在实际mybatis的应用中,我们写好mapper接口之后,需要提供对应的xml文件,这次我们主要分析是如何解析xml文件的。 XmlMappedBuilder 解析的主要函数是: //是否加载过该映射文件 public void parse() { if (!configuration.isResourceLoaded(resource)) { //处理map...
2020-04-11 19:55:38 451
原创 Mybatis学习(五) --- 缓存
Mybatis的缓存分为一级缓存和二级缓存 一级缓存:用于缓存用户在一次会话的查询结果,用户在一次会话中只能使用一个sqlSession 二级缓存:全局缓存,mapper级别的缓存,针对一个表的缓存,不同的sqlSession是可以共享的 一级缓存 在应用运行的时候,在一次数据库会话中,执行多次查询条件完全相同的SQL会优先命中一级缓存,避免直接在数据库中查找。其生命周期与s...
2020-04-11 11:00:35 235
原创 Mybatis学习(四) --- binding模块
在使用mybatis的时候需要使用对应的接口,不像需要写具体的实现,就可以实现数据库的操作,Mybatis可以根据接口和对应的方法找到xml文件中sql语句,进行绑定,以及参数的填充。接下来我们看下binding模块的代码。下面是核心组件的关系 MapperProxy:是Mapper接口的代理对象,让我们在使用mybatis的时候不需要实现接口 MapperProxyFactory:M...
2020-04-04 10:58:01 193
原创 Mybatis学习(三)--- ParamNameResolver
是一个工具类,主要用来解析接口方法的参数的,也就是方法参数中参数的位置,名字之间的索引关系,比如我们在写mapper接口对应的sql文件的时候,使用#{0},#{arg0},#{param0},或者参数的真正名字进行参数绑定的。 public ParamNameResolver(Configuration config, Method method) { //获取参数列表中每个参数的...
2020-04-04 10:47:39 732 1
原创 Mybatis学习(二)--- 数据源DataSource
Mybatis提供了两个数据源的实现:PooledDataSource和UnPolledDataSource,然后通过不同的工厂方法创建不同的DataSource. DataSourceFactory工厂 DataSourceFactory是工厂类接口的,UnpooledDataSourceFactory和PooledDataSourceFactory扮演着具体的工厂类的。该接...
2020-03-28 16:59:31 501
原创 Mybatis学习(一)--- 类型转换TypeHandler
Jdbc的类型与java的数据类型并不完全对应,所以在PreparedStatement为sql进行绑定参数的时候,需要从java类型转换为jdbc类型,而从结果集中获取数据的时候,需要将jdbc类型转换为java类型,mybatis使用类处理器解决上述问题。 ...
2020-03-24 22:51:35 428
原创 线程安全和锁优化
之前的java虚拟机(https://blog.csdn.net/weixin_37880711/article/details/104644798)中没有写《深入理解java虚拟机》的最后一章,这次补上。 线程安全 定义:当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,...
2020-03-18 23:57:04 101
原创 redis学习(十一) --- redis的应用及开发中遇到的问题
前面的博客我们学习了redis的基础知识,现在来看下redis在实际的使用以及实际中的一些问题。 分布式锁 分布式锁的概念:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。在分布式的环境下,线程A和线程B不在同一个jvm中,这时线程锁就没有了作用,需要使用分布式锁。使用分布式锁需要注意下面几点: 任意时刻,只能有一个线程拥有锁 不会发生死锁。使用redis实...
2020-03-03 23:34:23 190
原创 redis学习(十)--- 与memcache区别
什么是memcache? memcahce是高性能的分布式内存缓存服务器,也是一个key-valu的内存缓存服务器。但是memcahce是存在内存中的,所以发生断电或者故障会导致数据的丢失。 memcache的内存分配原理 采用slab Allocato的机制进行内存的分配和管理,其基本原理是按照预先规定的大小,将内存分为特定长度的块,以解决内存碎片问题。其中,chunk为分...
2020-02-29 20:41:29 121
原创 redis学习(九)---- 分片
redis集群是redis提供的分布式数据库方案,集群通过分片进行数据共享。 槽指派 一个redis集群由多个节点组成,集群通过分片的方式保存数据的键值对,集群的整个数据库被分为16384个槽(slot),当数据库的所有的槽都有节点在处理的时候,集群处于上线状态,否则,只要有任何一个槽没有得到处理,那么认为集群处于下线状态。比如一个集群中有三个节点A,B,C,通过向节点发送cl...
2020-02-29 13:12:26 97
原创 redis学习(八)--- 哨兵
哨兵是redis高可用性的解决方案,由一个或者多个哨兵实例组成的哨兵系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器处理命令。 哨兵的实现流程 哨兵集群通过配置发现maste,同时会监控master,同时以一定的频率向master发送IN...
2020-02-28 22:43:52 88
原创 redis学习(七) --- 主从同步
在redis主从架构中,Master负责写请求,slave负责处理读请求。但是是如何保持主从一致性的呢?接下来我们了解redis主从同步。 主从同步 主从同步主要分为了两个操作,一个是同步,另一是命令传播 同步:将从数据库的数据库状态更新至主服务器当前所处的数据库状态 命令传播:当主服务器的状态修改,导致主从不一致,让主从服务器的数据库重新回到一致 同步 分为了完整...
2020-02-28 00:05:49 134
原创 redis学习(六)--- 命令执行的过程
一个命令请求从发送到获得回复,客户端与服务端需要执行一系列的操作。比如一条简单的set key value命令,客户端与服务端需要: 客户端向服务端发送命令set key value 服务端接受命令并处理客户端的请求,产生命令回复OK 服务端将命令回复OK发送给客户端 客户端接受命令回复OK 发送命令请求 用户输入命令,客户端会将命令转换成协议格式,然后通过连接到服务器的套接...
2020-02-26 23:59:32 103
原创 redis学习(五) --- 事件
redis服务器是一个事件驱动程序,服务器需要处理两种事件类型: 文件事件:redis服务器通过套接字与客户端连接,而文件事件就是服务器对套接字的抽象,服务端则通过监听和处理事件来完成网络通信 时间事件:在给定的时间执行的事件 文件事件 redis基于rector模式处理网络事件,称为文件事件处理器。 如图中,文件事件处理器的四个部分: 套接字:每当一个套接字准备好...
2020-02-25 00:03:06 110
原创 redis学习(四) --- 持久化
redis为数据的持久化提供了两种方式RDB和AOF。 RDB:保存把某个时间节点时的数据全量快照 AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据 RDB 有两个redis命令可以用于生产RDB文件。 SAVE:会阻塞redis服务器的进程,知道RDB文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何命令请求 BGSAVE:会派...
2020-02-22 16:56:25 78
原创 redis 学习(三) --- 过期策略
在开发中我们经常使用redis作为缓存,就不可避免的需要设置key的存活时间(命令:expire key TTL),redis会在指定的时间之后自动删除过期的键值对。但是redis是如何记录过期时间,以及过期后是怎样删除键值对的呢?我们接下来慢慢了解。 过期时间的存储 在了解过期时间的存储之前,我们先了解一下redis的数据库的结构。redis服务器将所有的数据库保存在redis...
2020-02-20 23:32:53 155
原创 redis学习(二) --- 对象
在前面的笔记中,我们介绍了redis中主要的数据结构:SDS,链表,字典,压缩列表等。但是并没有直接使用这些数据结构来提供键值对,而是通过我们常用的字符串、列表、哈希、集合和有序集合提供服务。 对象类型和编码 每当我们在创建一个新的键值对的时候,我们会创建至少两个对象,一个用于键值对的键,一个用于键值对的值。redis中的对象都有一个redisObject对象。主要包含以下属性:...
2020-02-19 23:20:35 91
原创 redis学习(一) --- 数据结构
redis作为日常开发中常用的组件,在深入了解之前,我们先简单的来了解一下其对象以及对象的底层数据结构。 数据结构 在了解redis常用的对象之前,我们首先了解一下器底层实现的数据结构。 简单动态字符串 在redis数据库中,包含字符串的键值对在底层都是由SDS来实现。 struct sdshdr{ int len;//为SDS所保存的字符串的长度,也就...
2020-02-17 21:18:28 74
原创 设计模式 --- 六大原则
开闭原则 含义:对扩展开闭,对修改关闭。在设计程序的时候,面对需求的改变尽肯能的保持相对的稳定,尽量通过扩展的方式来修改原有代码来实现。可以通过“抽象约束、封装变化”来实现开闭原则,即通过抽象类或者接口定义一个稳定的抽象层,而将相同的可变因素封装在具体的实现类中。当需要发生改变的时候,只需要根据需求重新派生一个实现类进行扩展就好了。 里式替换原则 基本内容:继承必须确保超类所拥有的性质在子类...
2020-02-15 16:04:16 82
原创 设计模式 --- 状态模式
定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,是一种对象行为模式。个人理解是有一个对象,有多种状态,每种状态下行为不一样,而且状态之间是可以切换的。比如在这是我的战争中,一个人如果长期不吃饭,其饥饿状态会有不同显示:饱足、饥饿、非常饥饿以及饿的要死;如果身体不舒适,也会有生病、重病等多种模式,在每种模式下都会影响人物的移动速度以及心情。如果采用一般的设计,需...
2020-02-11 11:41:00 99
原创 设计模式 --- 命令模式
命令模式,解耦了请求者和调用者。请求以命令的形式包裹在对象中,传给调用对象,调用对象负责构造和控制命令的执行。也就是请求者发出一个请求,但是不知道具体的执行者,也不知道具体的执行细节,只需要知道这个请求被执行了;执行者者只需要老老实实的干活就行了,不需要知道上游的具情信息。调用者则在接到请求后,只负责构造命令以及控制命令的执行,这样请求者和执行者就彻底的解耦了,任何一方不用依赖其他方,只需...
2020-02-08 16:48:25 90
原创 设计模式 --- 单例模式
单例模式,就是在程序中只有一个实例。该类自己创建自己的对象,同时确保只有一个对象被创建。 其实现主要是: 将构造方法定义为private,这样确保只有该类可以获得唯一实例 提供一个静态的方法,用于获取实例,为空就创建一个否则返回。 实现方式 懒汉式 public class LazySingle { private static LazySingle lazyS...
2020-02-07 17:15:08 75
原创 设计模式 --- 装饰器模式
装饰器模式能够在不改 变对象自身的基础上,在程序运行期间给对象 动态地添加职责。遵循开闭原则(应该对于扩展是开放的,对修改是关闭的,即实体应当通过扩展实现变化,而不是修改代码实现变化),利用继承和组合的方式解耦对象间的关系。 例子 以常见的案列咖啡为例。在不考虑设计模式的时候,按照传统的思路,我们会写一个父类表示纯咖啡,如果不能满足需要,就在添加一个加牛奶的咖啡的类去继承咖啡父...
2020-02-06 19:35:31 110
原创 Netty笔记 --- EventLoop
服务端启动的时候,创建了两个NioEventLoopGroup,它们实际是两个独立的Reactor线程池。一个用于接收客户端的TCP连接,另一个用于处理I/O相关的读写操作,或者执行系统Task、定时任务Task等。(尽量创建两个NioEventLoopGroup) 用于接收客户端请求的线程池职责 收客户端TCP连接,初始化Channel参数; 将链路状态变更事件通知给ChannelPip...
2020-02-06 16:25:20 108
原创 Netty笔记 --- ChannelHandler
netty开发中我们的大部分代码都写在ChannelHandler这部分中,所以需要学习这个重要的接口。 netty中将I/O事件分为了两类:入站(InBound)和出站(OutBound),其中ChannelInboundHandler用于读入IO事件(入站)的处理,ChannelOutboundHandler用于写入IO事件(出站)的处理。 ChannelHandler...
2020-02-05 17:31:05 191
原创 Netty笔记 --- ByteBuf
在数据传递的时候往往需要使用缓冲区,常用的缓冲区是Java NIO 提供的Buffer,ByteBuf是Java NIO ByteBuffer的替代。 Buffer类详解 缓冲区Buffer就是内存中预留指定大小的空间用于IO数据的临时存储。有了缓冲区后,会减少实际的物理读写次数,而且这块区域一直被重复利用,降低了动态分配和内存回收次数。底层是线性数组,所以容量是固定的,通过mar...
2020-02-05 12:47:12 125
原创 设计模式---模板方法以及责任链模式
最近在开发的时候经常看到项目中大量使用模板设计模式和责任链设计模式,发现之前虽然了解但是使用较少,因此写本文学习一下。 模板方法 所谓的模板方式,其实很简单,比如去银行办理业务都需要经过区号,排队,办理业务,评价等一系列操作,但是每个人办理的业务都不一致,办理业务的流程就是一个模板,可是业务却不一致,这就是模板方法,主要用于将不变的行为抽象到父类中,去除子类的重复代码。以办理业务为例:定义的抽...
2020-01-11 14:01:57 1000
原创 Java反射---type
Tyep是java编程语言中所有类型的公共高级接口,包括原始类型(class),参数化类型(ParameterizedType),数组类型(GenericArrayType),类型变量(TypeVariable)和基本类型(Class)。 Type 描述 原始类型Class 类,枚举,数组,注解等 参数化类型ParameterizedType 常用的泛型Class<...
2020-01-04 16:49:40 231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人