- 博客(29)
- 资源 (1)
- 问答 (2)
- 收藏
- 关注

原创 ArrayList的动态扩容机制
先来看一道笔试题: 下面的ArrayList会扩容几次? ArrayList<String> arrayList = new ArrayList<String>(20); 我们先看一下源码的动态扩容机制是如何实现的。下面以jdk1.7为例: private void grow(int minCapacity) { // overflow-cons...
2018-08-11 18:51:43
773
2
原创 Mybatis源码解读(一)解析mybatis配置文件
总览 上图为mybatis配置文件与实体类的对应关系,先有个总体印象 配置文件解析入口 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 进入build方法,看一下
2021-08-18 15:47:56
200
1
原创 SpringAop源码阅读(一)代理类的创建过程
添加支持自动代理的核心处理类 通过@Import导入AspectJAutoProxyRegistrar @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default false;
2021-07-28 09:21:48
155
原创 Spring源码阅读(十)循环依赖的处理
循环依赖的处理流程 A和B产生循环依赖,处理过程如下: 源码解读 代码段一 bean被实例化后,添加到三级缓存中,移除二级缓存。 // Class: DefaultSingletonBeanRegistry protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(singletonFactory, "Singleton factory m
2021-07-23 16:42:14
218
原创 Spring源码阅读(八)标注Autowired的构造器是如何实例化的
挑选候选构造器 // Class: AutowiredAnnotationBeanPostProcessor public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName) throws BeansException { if (!this.lookupMethodsChecked.contains(beanName)) { Refle
2021-07-21 18:04:39
337
原创 Spring源码阅读(七)通过FactoryMethod创建对象
直接上源码 public BeanWrapper instantiateUsingFactoryMethod( final String beanName, final RootBeanDefinition mbd, final Object[] explicitArgs) { BeanWrapperImpl bw = new BeanWrapperImpl(); this.beanFactory.initBeanWrapper(bw); Object factoryBea
2021-07-18 01:03:20
316
原创 Spring源码阅读(六)FactoryBean的处理
直接上源码 // Class: DefaultListableBeanFactory public void preInstantiateSingletons() throws BeansException { if (this.logger.isDebugEnabled()) { this.logger.debug("Pre-instantiating singletons in " + this); } // Iterate over a copy to allow fo
2021-07-16 18:02:39
198
原创 Spring源码阅读(五)registerBeanPostProcessors
直接上源码 public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { // 根据类型获取bean中所有的BeanPostProcessor String[] postProcessorNames = beanFactory.getBeanNamesForTyp
2021-07-12 17:20:59
105
原创 Spring源码阅读(四)invokeBeanFactoryPostProcessors
直接上源码 public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // 1. 先执行所有的BeanDefinitionRegistryPostProcessors. // 保存执行过的bean S
2021-07-09 10:12:28
111
原创 Spring源码阅读(三)prepareBeanFactory
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 设置类加载器 beanFactory.setBeanClassLoader(getClassLoader()); // 设置EL表达式解析器 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.ge
2021-07-07 11:25:11
95
原创 Spring源码阅读(二)obtainFreshBeanFactory
主流程 // Class: AbstractApplicationContext protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug("Bean f
2021-07-06 17:16:19
97
原创 Spring源码阅读(一)Spring配置文件中的beanName是由哪个属性决定的
Spring配置文件中的beanName是由id,还是name确定的,当只有一个class属性时,beanName又是什么呢? 首先阅读BeanDefinitionParserDelegate中的parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean)方法 public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Null
2021-06-29 17:53:22
183
原创 从编程世界中学习英语系列(二)
报错语句 Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘age’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by select列表中的第三列不存在于group by字句中,并且包含非聚
2021-03-25 15:13:22
323
原创 从编程世界中学习英语系列(一)为什么学习英语
程序员为什么学习英语 你的代码肯定是要用英文写的。目前主流的程序语言都是外国人发明的,绕不过去。 在你学习一些新技术的时候,最好的入门文章就是官网。你如果去看中文的文章,会 发现很多文档都是从官网翻译过来的,暂且不说翻译的精准与否。这些文章在CV过程 中,难免会出现错误。 阅读一些经典的技术书籍时,经常会发现很多书经过翻译都变得晦涩难懂。由于翻译者 的水平有限,甚至有些人可能不是从事的这个职业。无法从程序员的角度来翻译书籍。 怎样学习英语 从平时编程过程中遇到的报错提示中去积累单词和语法。
2021-03-25 11:41:15
285
2
原创 函数
函数的定义 //第一种方式(常规) function fun(name,age) {} //第二种方式(函数表达式) let fun2 = function (name,age) {} //第三种方式(构造函数) let fun3 = new Function('name','age', 'console.log(title)')//1 //第四种方式(箭头函数) let fun4 = (name,age)=>{} 函数的参数 //函数定义时可以给形参指定默认值 function fun(name,
2021-02-23 17:26:11
127
原创 变量的定义
var与let 因为javascript为弱类型语言,所以声明变量时不需要指定变量类型,使用var或let即可。 var允许变量的重复声明,let不允许,会报错,推荐使用let。 var v = 1; var v = 2; console.log(v);//2(最后一个声明的变量会覆盖前一个) let l = 1; let l = 2;//Identifier 'a' has already been declared var定义的变量会被绑定到window对象上,let则不会 var v
2021-02-23 13:28:21
433
1
原创 linux三剑客之sed
1.替换功能 语法:s/regexp/replacement/flags 1.1.常用选项 -i:将改变写入原始文件 -e:同时执行多个替换 1.2.flags g:替换所有匹配的内容,不仅是第一个 p: 打印被替换的行,通常与-n选项配合使用 w:将结果写入到新文件中 2.其他功能 2.1.打印内容 2.2.删除内容 ...
2020-10-21 22:30:54
160
原创 linux三剑客之grep
Matching Control -i :Ignore case 忽略大小写 -w:whole words 按照整个单词匹配 -v:Invert the sense of matching, to select non-matching lines 匹配不包含指定关键字的行 Output Line Prefix Control -n:line number 在行前显示行号 Context Line Control -A NUM:Print NUM lines of trailing context a
2020-10-18 17:08:52
246
原创 线程的生命周期
1.线程状态介绍 NEW Thread state for a thread which has not yet started. 新建:已经创建线程,但还没有启动 RUNNABLE A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor. 可运行:包
2020-10-14 10:00:33
105
原创 vim中的内容修改
普通删除 普通模式 x:删除光标下的字符 dd:删除光标所在的行 D:删除从光标所在处到行尾的字符 d{motion}:删除指定内容:如daw 虚拟模式 {Visual}d:删除选中区域的内容 命令模式 :[range]d:删除指定范围的内容,例如:2d(删除第二行的内容),2,5(删除第2行到第5行的内容) 删除并插入 普通模式 R:进入替换模式 c{motion}:删除指定文本并进入插入模式,例如caw cc:删除当前行并进入插入模式 C:删除从光标所在处到行尾的字符并进入插入模式 s:删除光标下的字符
2020-08-26 17:00:16
1495
原创 vim中的插入操作
插入模式 普通模式 i:在光标前插入 I:在光标所在行的第一个非空字符前插入 a:在光标后插入 A:在光标所在行的行尾插入 o:在光标所在行的下一行插入 O:在光标所在行的上一行插入 替换模式 普通模式 R:进入替换模式 未完待续。。。 ...
2020-08-03 19:53:41
3610
原创 vim移动技巧
左右移动 l:向右移动一个字符 h:向左移动一个字符 0:移动到光标所在行的第一个字符 ^:移动到光标所在行的第一个非空字符 $:移动到行尾 f{char}:向右移动到指定字符 F{char}:向左移动到指定字符 t{char}:向右移动到指定字符的前一个字符 T{char}:向左移动到指定字符的前一个字符 ;:重复f,F,t,T操作 ,:在相反方向重复f,F,t,T操作 上下移动 k:在行之间向上移动 j:在行之间向下移动 gk:在显示行向上移动 gj:在显示行之间向上移动 G: 移动到最后一行 gg:移
2020-08-03 19:06:05
890
原创 使用docker搭建zookeeper集群
在docker诞生之前,想要做集群测试,最后的方式就是安装虚拟机。但自从有了docker之后大大简化了集群搭建的步骤,便于学习。 下面介绍使用docker搭建zookeeper集群 1. 安装docker和docker-compose 2. 拉取docker镜像 docker pull zookeeper:3.4.14 这里我们使用zookeeper的3.4.14版本,高版本的zookeeper会出现一些莫名其妙的错误。 3. 编写docker-compose.yml文件 version: '2' se
2020-07-13 21:45:35
1334
1
原创 彻底搞懂装饰器模式
什么是装饰器模式(What) 动态的给一个对象添加一些额外的职责 为什么使用装饰器模式(Why) 继承方案会导致继承结构复杂,不易维护等问题,因此使用组合代替继承,给原始类添加增强功能 怎样使用装饰器模式(How) 装饰器类需要和原始类继承相同的抽象类或者实现相同的接口 下面以JDK中的IO举例: //抽象类输入流 public abstract class InputStream { public abstract int read() throws IOException; public
2020-07-07 15:38:33
285
原创 彻底搞懂单例模式
单例模式什么是单例模式(What)为什么要使用单例模式(Why)单例模式的实现方式(How) 什么是单例模式(What) 在进程中,一个类只允许创建一个对象 为什么要使用单例模式(Why) 解决资源冲突 数据只需要存在一份 单例模式的实现方式(How) 1.饿汉式 public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public s
2020-06-28 17:17:43
150
原创 Integer的valueOf方法源码阅读
在网上看到这样一道题: System.out.println(Integer.valueOf(127)==Integer.valueOf(127)); System.out.println(Integer.valueOf(128)==Integer.valueOf(128)); 输出结果为ture和false。为了弄明白为什么会这样,我们看一下源码是怎么实现的。 private stat...
2018-08-09 12:43:00
689
原创 使用数据泵的方式导入导出数据库
在导入导出之前需要先做一些准备工作. 1.创建表空间: <span style="color:#ff0000">CREATE TABLESPACE ORCL datafile 'E:\app\zxp\oradata\orcl\ORCL.dbf' size 20000M autoextend on next 100m maxsize unlimited;</span> ...
2017-11-07 09:38:27
5674
原创 sql脚本优化
在数据库升级过程中,比如要给某个表添加字段我们都是直接 alter table tablename add colname type 这样的写法非常不具有重用性。 为什么这么说呢?因为一旦这里添加的列名存在的条件下,我们执行这条sql肯定会报错。 今天看见一个前辈写的sql脚本让我恍然大悟。 他是这么写的: declare num integer; begin s
2017-07-13 17:50:55
535
eclipse启动tomcat报错
2018-02-12
数据库中表和表之间的关联关系
2016-10-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人