自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

pfnie的博客

学如逆水行舟,不行则退。以研究源码为乐趣,以写代码为疯狂。

  • 博客(48)
  • 收藏
  • 关注

转载 《深入理解mybatis原理(七)》 MyBatis的架构设计以及实例分析

MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现。一、MyBatis的框架设计       注:上图很大程度上参考了iteye 上的chenjc_it  所写的博文原理分析之二:框架整体设计

2016-05-31 17:29:12 1967 1

转载 《深入理解mybatis原理(六)》 MyBatis缓存机制的设计与实现如何细粒度地控制你的MyBatis二级缓存

前几天网友chanfish 给我抛出了一个问题,笼统地讲就是如何能细粒度地控制MyBatis的二级缓存问题,酝酿了几天,觉得可以写个插件来实现这个这一功能。本文就是从问题入手,一步步分析现存的MyBatis的二级缓存的不足之处,探讨一点可以改进的地方,并且对不足之处开发一个插件进行弥补。本文如下组织结构:一个关于MyBatis的二级缓存的实际问题当前MyBatis二级缓存的工作

2016-05-31 16:15:35 1040

转载 Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?

Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来提高对HashMap、Hashtable哈希表存取对象的使用效率。      关于Object对象的hashCode()返回值,网上对它就是一个简单的描述:“JVM根据某种策略生成的”,那么这种策

2016-05-31 11:24:35 858

转载 《深入理解mybatis原理(五)》 MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。MyBatis将数据缓存设计成两级结构,分为一级缓存、二级缓存:       一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不

2016-05-31 10:43:35 979

转载 《深入理解mybatis原理(四)》 MyBatis的二级缓存的设计原理

目录(?)[+]MyBatis的缓存机制整体设计以及二级缓存的工作模式MyBatis二级缓存的划分使用二级缓存必须要具备的条件一级缓存和二级缓存的使用顺序二级缓存实现的选择MyBatis自身提供的二级缓存的实现写在后面关于涉及到的设计模式       MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。本文将全面分析M

2016-05-29 20:37:13 954

原创 CentOS-6.5-x86 安装 jdk-7u79-linux-i586.rpm

1. 首先把jdk-7u79-linux-i586.rpm通过FTP传送到/root/devtool/java2. rpm -ivh jdk-7u79-linux-i586.rpm安装软件会将JDK自动安装到 /usr/java/目录下。3. 配置通过 vim /etc/profileexport JAVA_HOME=/usr/java/jdk1.6

2016-05-29 16:57:10 2149

原创 网站下载地址

1. JDK7下载2. Jenkins Tutorial3. linux_Eclipse_luna_644. linux_Eclise_luna

2016-05-29 15:47:31 963

转载 《深入理解mybatis原理(三)》 MyBatis的一级缓存实现详解 及使用注意事项

0.写在前面        MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项。

2016-05-26 15:00:26 1389

转载 Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

本文转载自:http://blog.csdn.net/luanlouis/article/details/24589193class文件简介及加载     Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信

2016-05-26 12:54:51 584

转载 《深入理解mybatis原理(二)》 Mybatis关联查询问题

版权声明:本文为博主原创文章,未经博主允许不得转载。目录(?)[+]嵌套语句查询嵌套语句查询的原理N1问题嵌套结果查询mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中。下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的。设计一个简单的博客系

2016-05-25 14:06:40 2673

原创 CentOS-6.5-x86_64 安装 Jenkins

首先我们要找到Jenkins的官方网站http://pkg.jenkins-ci.org/redhat-stable/ ,通过这个网站我们可以知道如何下载并安装Jenkins.1. 安装jenkins,请执行下面的命令。sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/j

2016-05-24 21:34:21 679

转载 《深入理解mybatis原理(一)》 Mybatis初始化机制详解

对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。    1.MyBatis的初始化做了什么    2. MyBatis基于XML配置文件创建Configuration对象的过程    3. 手动加载XML配置文件创建Configuration对象完成初始化,创建并使用SqlSessionFactory对

2016-05-24 17:16:42 5633 1

转载 Java中数组的特性

目录(?)[+]Java中的数组是对象吗Java中数组的类型Java中数组的继承关系Java中数组的另一种继承关系源码数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具有固定的长度,并且在内存中占据连续的空间。在C,C++等语言中,数组的定义简洁清晰,而在Java中确有一些会让人迷惑的特性。本文就尝试分析这些特性。Java中的数组是对象

2016-05-24 13:19:06 424

转载 深入分析Java的序列化与反序列化

序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题:怎么实现Java的序列化为什么实现了java.io.Serializable接口才能被序列化transient的作用是什么怎么自定义序列化策略自定义的序列化策略是如何被调用的ArrayList对序列化的实现有什么

2016-05-23 17:14:41 384

转载 认识JAVA数组

噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表明现象,只有亲自试过了,才知道它的深浅!!!!!一、什么是数组     数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的!      但是这只是数组的最表面的东西!深一点?就是这样:数组

2016-05-23 16:26:50 385

转载 hashCode

在前面三篇博文中LZ讲解了(HashMap、HashSet、HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分,所以下面LZ揭开hashCode的“神秘”面纱。hashCode的作用要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用。在讲解数组时(java提高篇(十八)——数

2016-05-23 14:24:36 409

转载 Iterator

迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next(); //do something

2016-05-23 13:44:11 427

原创 CentOS-6.5-x86_64 设置静态IP地址

DEVICE=eth0HWADDR=00:0C:29:E7:95:46TYPE=EthernetUUID=24f5ea3f-cf95-44af-b619-d7e6101fa015ONBOOT=yesNM_CONTROLLED=yesBOOTPROT=staticBROADCAST=192.168.1.255IPADDR=192.168.1.25N

2016-05-22 14:04:33 1929

原创 CentOS-6.5-x86_64 安装 apache-tomcat-7.0.68.tar.gz

1. 首先我们需要从官网下载安装的包,地址是:http://tomcat.apache.org/download-70.cgi2. 通过FTP服务器上传到linux上,例如:/root/devtool/tomcat3. tar -zxvf apache-tomcat-7.0.68.tar.gz 解压, 默认是解压到当前文件夹。4.移动tomcat文件到我们的目标文件夹下

2016-05-22 09:36:22 3041

原创 CentOS-6.5-x86_64 安装 jdk-7u79-linux-x64.gz

1. 首选我们需要从官网下载jdk的jar包。如果你没有,请从这里下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html,我下载的版本是jdk-7u79-linux-x64.gz。2. 下载完成之后,通过FTP服务器上传到linux中,例如我上传的路径是/root/devtoo

2016-05-22 09:11:52 5954

转载 保持compareTo和equals同步

在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法。我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道equals也可以判断两个对象是否相等,那么他们两者之间是否存在关联关系呢?public class Student implements Comparable{ private Str

2016-05-20 16:46:01 457

转载 SpringMVC源码剖析(五) - 消息转换器HttpMessageConverter

概述在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新引入的HttpMessageConverter即消息转换器机制。Http请求的抽象还是回到请求-响应,也就是解析请求体,然后返回响应报文这个最基本的Http请求过程中来。我们知道,在se

2016-05-20 13:44:17 414

转载 请为集合指定初始容量

集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海、扩容是需要消耗大量的人力物力财力的。同样的道理,Collection的初始容量也显得异常重要。所以:对于已知的情景,请为集合指定初始容量。public static void

2016-05-20 11:44:43 396

转载 SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现

SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段。在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过service()方法,委派到doGet()或者doPost()这些方法,完成Http请求的处理。在初始化流程中,SpringMVC巧妙的运用依赖注入读取参数,并最终建立一个与容器上下文相关联的Spr

2016-05-20 11:35:40 603

转载 asList的缺陷

在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷:一、避免使用基本数据类型数组转换为列表使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷。先看如下程序:public static void main(String[] args) { int[] ints = {1,2,3,4,5};

2016-05-19 18:04:49 384

转载 SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

在我们第一次学Servlet编程,学java web的时候,还没有那么多框架。我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转到我们定义好的jsp页面。Servlet类编写完之后在web.xml里注册这个Servlet类。除此之外,没有其他了。我们启动web服务器,在浏览器中输入地址,就可以看到浏览器上输出我们写好的

2016-05-19 17:15:48 454

原创 SpringMVC源码剖析(二)- DispatcherServlet的前世今生

上一篇文章《SpringMVC源码剖析(一)- 从抽象和接口说起》中,我介绍了一次典型的SpringMVC请求处理过程中,相继粉墨登场的各种核心类和接口。我刻意忽略了源码中的处理细节,只列出最简单的类甚至是接口类,目的就是让大家先从最高层次的抽象意义上来审视SpringMVC这个框架;我也刻意将SpringMVC和Struts2做对比,目的是让大家看到,SpringMVC究竟吸取了Sturts2设

2016-05-19 16:34:53 505

转载 subList的缺陷

我们经常使用subString方法来对String对象进行分割处理,同时我们也可以使用subList、subMap、subSet来对List、Map、Set进行分割处理,但是这个分割存在某些瑕疵。一、subList返回仅仅只是一个视图首先我们先看如下实例:public static void main(String[] args) { List list1 = ne

2016-05-19 14:58:40 445

原创 SpringMVC源码剖析(一)- 从抽象和接口说起

SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的开发者们就算没使用过SpringMVC,也应该对其略有耳闻。我试图通过对SpringMVC的设计思想和源码实现的剖析,从抽象意义上的设计层面和实现意义上的代码层面两个方面,逐一揭开SpringMVC神秘的面纱,本文的代码,都是基于Spring的 3.1.3RELEASE版本。任何一个框架,都有自己

2016-05-19 13:13:44 740

原创 RedHat-如何在linux系统中设置静态ip地址及设置主机名

1. 在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth02. 开始编辑,填写ip地址、子网掩码、网关、DNS等。其中“红框内的信息”是必须得有的。编辑完后,保存退出。3. 重启网络服务。service network restart4. 验证ip地址。ifconfig5. 修改主机名。vi /etc

2016-05-18 21:15:45 4962

转载 Java CopyOnWriteArrayList工作原理及实现(一)

并发优化的ArrayList。用CopyOnWrite策略,在修改时先复制一个快照来修改,改完再让内部指针指向新数组。因为对快照的修改对读操作来说不可见,所以只有写锁没有读锁,加上复制的昂贵成本,典型的适合读多写少的场景。如果更新频率较高,或数组较大时,还是Collections.synchronizedList(list),对所有操作用同一把锁来保证线程安全更好。增加了addIf

2016-05-18 15:22:00 442

转载 fail-fast机制

在JDK的Collection中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于

2016-05-17 18:01:56 307

转载 Java EnumMap工作原理及实现(二)

1.概述A specialized Map implementation for use with enum type keys. All of the keys in an enum map must come from a single enum type that is specified, explicitly or implicitly, when the map is cr

2016-05-17 13:24:50 432

转载 Java EnumMap工作原理及实现(一)

目录(?)[+]EnumMap定义EnumMap使用EnumMap用途总结EnumMap定义package java.util;import java.util.Map.Entry;import sun.misc.SharedSecrets;public class EnumMap, V> extends AbstractMap implements

2016-05-17 13:14:53 2054

转载 Java TreeMap工作原理及实现(二)

1. 概述A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which con

2016-05-16 16:14:29 551

转载 Java TreeMap工作原理及实现(一)

目录(?)[+]TreeMap定义TreeMap特点HashMap与TreeMap的区别TreeMap定义package java.util;public class TreeMap extends AbstractMap implements NavigableMap, Cloneable, java.io.Serializable{}pub

2016-05-16 13:16:00 2154

转载 Comparable与Comparator浅析

今天博主在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理。那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口?  Comparable和Comparator接口都是用来比

2016-05-13 14:32:03 318

转载 Java LinkedList工作原理及实现(二)

源代码解读public class LinkedListE> extends AbstractSequentialListE> implements ListE>, DequeE>, Cloneable, java.io.Serializable功能和特点继承了一个抽象类AbstractSequentialList,这个类就是用调用ListIterator实现了元素

2016-05-12 17:59:31 398

转载 Java LinkedList工作原理及实现(一)

目录1. 概述2. set和get函数参考资料1. 概述以双向链表实现。链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两

2016-05-12 14:03:34 388

转载 Java LinkedHashMap工作原理及实现(二)

使用场景如果需要使用的Map中的key无序,选择HashMap;如果要求key有序,则选择TreeMap。但是选择TreeMap就会有性能问题,因为TreeMap的get操作的时间复杂度是O(log(n))的,相比于HashMap的O(1)还是差不少的,LinkedHashMap的出现就是为了平衡这些因素,使得能够以O(1)时间复杂度增加查找元素,又能够保证key的有序性此外,Li

2016-05-11 17:20:28 619

空空如也

空空如也

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

TA关注的人

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