自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 自己手写一个AOP动态代理框架(2)

之前实现的自己手写一个AOP动态代理框架(1)只能根据控制器,业务层,DAO层等等注解的形式来进行切面,这里仿Spring,支持AspectJ的表达式进行定位类方法资源,然后进行代理。集成AspectJ的语法树,即复用AspecJ的对资源的定位功能。也就是说可以使用 execution(* com.fuyouj.service..*.*(..))这样的表达式。AspectJ简介提供了完整的AOP实现。定义了切面语法和切面语法的解析。Spring支持方法级别的织入(满足80%的需求了),Aspe.

2020-06-02 17:22:13 544

原创 万字长文!自己手写一个AOP动态代理框架(1)

前面提到过动态代理的有两种简单的实现方式,就是JDK动态代理和CGLIB。不懂先看前文:SpringAOP的实现之代理模式自己写嘛当然是乞丐版了,为了实现简单 但是又具有一定的通用性(拒绝对被代理类有实现接口的强硬要求)。所以采用CGLIB的方式实现AOP。工程目录结构。首先要实现注解一样的 AOP,要定义与AOP相关的注解。定义2个AOP相关的注解标签。//作用在类上@Target(ElementType.TYPE)//运行时有效@Retention(RetentionPolicy.R

2020-06-02 01:04:23 941 2

原创 自己总结的计算机网络常见面试题

自己的笔记,自己才看的懂,很多图片我都没有说明,见谅TCP/IP参考模型说说TCP的三次握手IP协议是无连接协议,他不会占用两个正在通信计算机的通信线路,这样IP就降低了对网络线路的需求,每条线可以同时满足不同计算机之间的通信需要。通过IP消息会被分割成较小的比较独立的包,并通过因特网在计算机之前传送,IP负责将每个包路由至他的目的地。IP协议没有做任何事情来确认数据包是否按顺序发送,...

2020-03-12 17:23:24 3491 1

原创 康拓展开在全排列中的应用

康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。可用于快速解决一些全排列问题。康拓展开第k个排列给出一个数n,返回第k个排列。假设n=3,k=3.那么第三个排列就是213不难发现,当n=1的时候,有一个排列。11当n=2的时候,有两个排列。12和21。21当n=3的时候,根据上图可知有6种排列。321可得:1…n有n!种排列。相同的,当n=5的时候,求52413是第几个排列。首先看首位.

2020-09-05 21:54:41 298

原创 SpringIoC容器的源码解析

源码也看了好几遍了,但是就是记不住,所以又来缕缕。IOC现在是一个框架都具备了,虽然在自己也实现了一个简单的 框架,也具备IOC的功能,但是还是太简单了。下面来看看Spring的IOC到到底是个什么情况。初始化容器一般用两种方式,从xml文件读取,从配置类解析。分别对应于以下代码。 ApplicationContext applicationContext = new FileSystemXmlApplicationContext(xmlPath);//Entrance.class 你的配置.

2020-06-13 16:18:04 222

原创 在线留痕阅卷系统功能说明及其演示

引言追求速度浏览者可以直接跳到项目图文展示下本在线阅卷系统主要服务于高校,支持试卷导入到系统,动态分配任务给多个教师,同时在阅卷工作完成后从班级,知识点,试卷高分低分区分度,评判试卷难度,得分率,及格率,分数标准差等多角度多维度统计学生成绩展示考试成果。在支持成绩统计分析和成绩到处这方面极大的减轻了考试阅卷后试题改卷携带试卷的负担,减少了阅卷工作完成后,统计成绩分析成绩的工作量。在传统的考试情况中,每个老师的阅卷工作上报成绩流程及其繁琐麻烦,老师往往需要与学生试卷卷不离身导致便携性很差,即使在改完试

2020-06-08 13:03:52 6030 13

原创 SpringAOP的实现之代理模式

要想了解Spring的AOP的实现,首先必须要了解代理模式。如果只是简单代理一个对象,那么我们自己就可以很好的实现。声明一个抽象主题,支付接口:public interface ToCPayment { void pay();}被代理的实现类public class ToCPaymentImpl implements ToCPayment { @Override public void pay() { System.out.println("以用.

2020-05-31 21:01:39 482

原创 Spring的AOP开发简单示例

SpringAOP支持方法级别的增强。大致有@Before:方法执行前执行@After:方法执行后还没有返回时执行@Around:环绕通知,在Before之前,在After之前。@AfterReturning:方法返回结果之后执行@AfterThrowing:返回异常时执行@ @DeclareParents:给类增加接口假设 增强service包下的所有方法 :目录结构 :切面类:package com.fuyouj.aspect;import org.aspectj.lang.

2020-05-30 23:51:02 423

原创 Spring如何解决循环依赖的?

假设有两个实例A,B循环依赖。且作用域都是单例,因为Spring只支持单例的循环依赖。假设扫描到了A,调用getBean方法,由于是单例,调用getSingleton方法,发现三个缓中都没有A,进入CreateBeanInstance的流程。此时创建的是能够创建A的工厂放进了三级缓存里面,然后执行populateBean的流程,也就是填充A的属性。填充A的属性遇到了B,调用getBean()一样的流程,到了填充B属性的时候,发现依赖A,调用getBean(A),此时三级缓存的第三级别缓存具有A 的工.

2020-05-30 18:22:46 382

原创 Spring源码之Spring是怎么创建Bean的?

在首次启动容器的时候,必然会进入CreateBean,所以这里直接采用DeBUG的方式追踪源码。启动Spring容器之前在方法上打上断点。调试出来自己认识的Beanstep into创建Bean的主要做以下几件事情。Bean类型的解析处理方法的覆盖Bean实例化之前的后置处理doCreateBean到下一步获取这个Bean的BeanDefiniton实例获取这个BeanDefinition对用的Bean的class对象 ,验证需要重写的方法。// Prepare me.

2020-05-30 17:04:40 319

原创 Spring源码中getBean实例的详细流程

本文主要研究getBean的流程。1.首先尝试框架会从容器的缓存里获取单例Bean实例,这个单例Bean有可能是一个普通Bean,也有可能是一个FactoryBean,然后调用他的getObject方法返回。2.如果这里1获取不到,不管是单例还是原型模式,都要框架另外创建实例了。然后进行循环依赖的判断逻辑,正是因为循环依赖,才会用到三级缓存,3.如果该容器中没有该Bean的BeanDefiniton实例,则递归去父容器去查找。4.如果该容器中有该Bean的BeanDefiniton实例,则获取B.

2020-05-30 15:56:10 528

原创 Spring源码-Aware及其子接口

前面说过容器对Bean本身的逻辑基本是无侵入的,因此Bean一般不需要了解容器的状态和直接使用容器,但是再某些时候需要在Bean中需要获取到容器的实例来对其操作,这时候就需要再Bean中设定对容器的感知了。这便是Aware接口的作用。可以看到该接口没有任何方法,只能当作标签来使用。所以真正发挥作用的使实现了该接口的子接口。ApplicationContextAware只有一个方法名字,顾名思义就知道支持实现该接口的Bean可以将容器实例作为参数传递进来。其他的Aware子接口与此类似。.

2020-05-26 15:57:36 205

原创 Spring源码之PostProcessor接口

Spring框架提供了各种PostProcessor的接口,作为容器或者Bean的后置处理器,其实这些PostProcessor本省也是需要注册到容器总的bean,里面定义的方法会在特定的时期呗容器所调用。通过这种机制框架自身或者开发者再不改变容器或者Bean核心逻辑的的情况下对进行扩展或者定义。 比如包装Bean,影响他的行为,修改他的内容。PostProcessor的种类1.BeanDefinitionRegistryPostProcessor即BeanDefinitionRegistry的.

2020-05-25 19:05:55 218

原创 Spring源码(4)-Spring中的Resource,ResourceLoader,容器的关系

之前提到Spring会将配置问价或者配置类读取到内存转换成一个个的Resource实例。然后将Resource解析一个个的BeanDefinitioon.Resource接口public interface Resource extends InputStreamSource Resource继承于InputStreamSource接口 ,InputStreamSource接口仅仅定义了一个方法,获取输入流。Resource定义了对资源的基本操作。判断资源是否存在,是否可读,是否打开 ==。.

2020-05-23 17:00:01 196

原创 Spring源码(3)-Spring中的ApplicationContext

前面提到的BeanFactory接口和起相关的 二级三级实现,只是简单容器,我们平时 用到的最多的还是ApplicationContext接口的实现类.BeanFactory面向Spring自身,而后者是面向Spring的使用者。ApplicationContextApplicationContext继承的几口有很多,因此功能也就更多。public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory,

2020-05-23 16:08:12 332

原创 Spring源码(2)-Spring中的容器BeanFactory

Spring规定所有的IOC容器都必须实现BeanFactory接口,BeanFactory是一个顶级的容器接口。BeanFactoryBeanFactory里有一个特殊的属性,String FACTORY_BEAN_PREFIX = "&";这个用来获取FactoryBean本身的实例。注意FactoryBean和BeanFactory是完全不一样的两个东西 。BeanFactory是容器的顶级 接口,定义了Bean工厂的一些操作方法。比如根据名字获取实例,根据类型获取实例==。

2020-05-23 12:13:02 315

原创 Spring源码(1)-Spring中的Bean和BeanDefinition

用过Spring的一定知道,Spring提供了IOC的功能,也就是反转控制,将对象之间的关系 转而使用配置来管理,从而提供了依赖注入的功能。 Spring通过将对象包装在Bean中,来达到管理对象和进行其他额外操作的目的。什么是Bean?1.Bean的本质还是Java对象,只有这个对象的生命周期由容器来管理。2.我们不需要为了创建一个Spring中的Bean而再原来的对象上做任何 额外的操作,因此说 Spring框架是低侵入或者是无侵入的框架。3.既然没有改变原来的代码,我们平常是使用配置文件.

2020-05-22 23:58:03 802

原创 小总结:ArrayList 和LinkedList的面试题

ArrayList 无参数构造器构造,现在 add 一个值进去,此时数组的大小是多少,下一次扩容前最大可用大小是多少?此处数组的大小是 1,下一次扩容前最大可用大小是 10,因为 ArrayList 第一次扩容时,是有默认值的,默认值是 10,在第一次 add 一个值进去时,数组的可用大小被扩容到 10 了。如果我连续往 Arraylist 里面新增值,增加到第 11 个的时候,数组的大小是多...

2020-03-30 20:48:37 1041 2

原创 深入Java集合LinkedList

现在由大恶人付有杰来从增删改查几个角度轻度解析LinkedList的源码1.整体架构LinkedList 底层数据结构是一个双向链表(),整体结构如下图所示:链表中的每个节点都可以向前或者向后追溯,我们有几个概念如下:链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置,next 属性,代表后一个节点的位置;first 是双向链表的头节点,它的前一个节...

2020-03-30 20:33:46 310

原创 深入Java集合ArrayList的源码解析

现在由大恶人付有杰来从增删改查几个角度轻度解析ArrayList的源码首先ArrayList的底层数据结构非常简单,就是一个数组。从源码第115行我们可以得出信息,他的默认数组长度是10。/** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10;那么...

2020-03-30 19:30:57 403 1

原创 复习之路之JAVA多线程基础面试题

我自己总结的,我觉得很全了,本篇章针对多线程基础,不包括JUC有几种实现线程的方法?从不同的角度看有不同的答案,通常来说,可以分为两类,继承和实现的两种方式。准确的讲,实现线程只有一种方式,那就是构造Thread类,但是在Thread类里面,他的run方法有两种情况。第一种,实现一个runnable接口,重写他的run方法,然后再把这个实例传给Thread类,再让Thread类执行这个...

2020-03-18 11:39:20 1181

原创 复习之路之JAVA基础知识概括

摘抄自公开的笔记,一部分做自我补充。1. 面向对象和面向过程的区别面向过程 : 面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性...

2020-03-17 17:11:20 236

原创 MySQL笔记(10)MySQL优化器选错索引

不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引:CREATE TABLE `t` (`id` int(11) NOT NULL,`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,PRIMARY KEY (`...

2020-03-14 22:37:22 315

原创 MySQL笔记(9)普通索引和唯一索引

文章来源:极客时间MySQL实战45讲 评论区更精彩,有能力去支持哈假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所以,你一定会考虑在 i...

2020-03-14 10:55:38 537 2

原创 MySQL笔记(8)多事务的隔离性

在事务隔离:为什么你改了我还看不见?和你讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,这个事务看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。但是,怎么减少行锁对性能的影响?,和你分享行锁的时候又提到,一个事务如果要更新一行,而...

2020-03-14 10:26:18 340

原创 MySQL笔记(4)深入浅出索引(上)

一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本 500页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。索引的常见模型索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里我先给你介绍三种常...

2020-03-14 09:33:33 390

原创 MySQL笔记(7)怎么减少行锁对性能的影响?

顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。当然,数据库中还有一些没那么一目了然的概念和设计,这些概念如果理解和使用不当,容易导致程序出现非预期行为,比如两阶段锁。从两阶段锁说起你举个例子。在下面的操作序列中,事务 B 的 update 语句执行时会是什么现象呢?假设字段 id ...

2020-03-14 09:32:07 391

原创 MySQL笔记(6)全局锁和表锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL)。当...

2020-03-14 09:07:41 309

转载 MySQL笔记(5)深入浅出索引(下)

在下面这个表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?mysql> create table T (ID int primary key,k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '',index k(k))...

2020-03-13 23:26:10 307

原创 MySQL笔记(3)事务隔离:为什么你改了我还看不见?

我将会以 InnoDB 为例,剖析 MySQL 在事务支持方面的特定实现,并基于原理给出相应的实践建议,希望这些案例能加深你对 MySQL 事务原理的理解。隔离性与隔离级别提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。当数据库上有多个...

2020-03-13 21:48:21 1489

转载 MySQL笔记(1)一条SQL查询语句是如何执行的?

因为自我感觉基础不太好,所以暂时回头进攻基础知识。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个 ID 字段,在执行下面这个查询语句时:select * from T where ID = 10;我们看到的只是输入一条...

2020-03-13 20:27:24 468

原创 MySQL笔记(2)日志系统:一条SQL更新语句是如何执行的?

rt

2020-03-13 20:26:03 280 1

原创 JavaIO之NIO,BIO的复制文件的简单比较(3)

本文展示BIO,NIO复制文件的不同写法,和一丢丢的效率对比。在演示NIO之前 ,先简单说一下 NIO在BIO中,根据方向的不同,分为输入流,输出流,而在NIO中,就没有这个概念了,NIO中,提出了Channel的概念,一个通道是可以读也可以写的。channel通过和Buffer的交互,可以往buffer写数据也可以读数据,这是怎么实现的呢?首先,Buffer是一个数组,有三个重要的指针...

2020-03-09 22:12:55 371

原创 javaBIO之实现一个聊天室(2)

上篇简单实现了回音壁,但是这也太不够意思了,如果可以多人发言那就稍微有点意思了。这里先来说说java BIO 编程模型。BIO也就是我们经常说的java IO,在这种传统的模式下,如果要实现服务端服务,1.首先他要等待客户端连接吧?执行serverSocket.accept();会一直阻塞在这句话这里,直到有客户端连接才会做其他的事情。2.那么如何做到服务多个客户端呢?我们采用新开一个...

2020-03-09 21:43:06 259

原创 javaBIO之实现最简单的回音壁(1)

闲来无事做,不如写博客。今晚准备抽点时间,写一点java网络编程的BIO,NIO,AIO。本文从最简单的回音壁开始,我们也是要讲究循序渐进的哈~回音壁就是客户端向服务端发送一个消息,服务端原样的回复回来。在java中实现客户端和服务端通信,有很多的类。这里先演示最简单的。具体思路很简单实现也非常简单,就是服务端监听888端口,客户连接指定的IP地址,服务端读取客户端的消息,然后再写回去...

2020-03-09 20:33:17 391

原创 你知道死锁,但是你知道活锁吗?

说来也是有趣,我完全是被代码带笑了。什么是活锁?线程没有阻塞,始终在运行,但是程序始终得不到进展,因为线程始终做重复的同样的事情。假设有这样一堆恩爱夫妻,贫困年代,大家条件不好,有了吃的互相谦让,过于谦让,一张纸谦让,就会导致活锁。就是线程一直在运行,事情却没有任何进展。和死锁相比,活锁更害人,因为活锁一直在消耗CPU资源,而死锁会阻塞。定义一个 勺子类:static class Sp...

2020-02-15 22:01:57 219

原创 从Happens-before 原则说volatile和synchronized

什么是Happens-before ?1.)Happens-before 规则是用来解决可见性问题的:在时间上,动作A发生在动作B之前,B保证能看见A,这就是Happens-before 原则。2.)如果一个操作Happens-before 第二个操作,那么我们就说第一个操作对于第二个操作是可见的。什么不是Happens-before ?两个线程没有相互配合的机制,所以代码X和Y的执行结果...

2020-02-15 14:14:14 234

原创 一段代码演示代码重排序带来的影响

假设在类中,定义这样的4个变量。 private static int x = 0, y = 0; private static int a = 0, b = 0;两行代码分别由两个线程进行如下的操作。线程1: a = 1; x = b;线程2: b = 1; y = a;在一般的情况下,由于两个线程的快慢顺序前后顺序,均可能出现如下情况。发生碰撞:a=...

2020-02-15 10:34:00 215

原创 JAVA中N种单例模式简单概括(防反射,克隆,序列化,实例化,多线程安全)

里面包括了老生常谈的饿汉式,懒汉式以及枚举类 静态代码块 序列化场景下,多线程场景下的问题。话不多说,直接开干。**饿汉式:**就是立即加载的意思,立即加载在中文中有着急,急迫的意思。所以就叫饿汉式吧。1.饿汉式的最简洁版本package 单例模式的几种写法.饿汉式;/** * @Author:FuYouJie * @Date Create in 2020/1/23 13:32...

2020-01-23 16:46:57 602 2

原创 多线程之notify唤醒的随机性

在看多线程核心技术这本书的时候,里面提到了一句,notify()方法可以随机唤醒等待队列中等待统一资源的“一个一个线程”。突然很疑惑什么是统一共享资源,是不是随机。于是改动书上的代码实验一下,看一年运行结果。原来代码如下 package 线程间通信.wait_notify_size5;import java.util.ArrayList;import java.util.List;/...

2019-11-12 00:05:19 613

空空如也

空空如也

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

TA关注的人

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