自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

荒野孤鹰

广阔天地大有作为

  • 博客(334)
  • 资源 (1)
  • 收藏
  • 关注

原创 Jetty源码阅读---Jetty的类加载器WebAppClassLoader

前面介绍了java中类加载的一般模型:双亲委派模型,这个模型适用于大多数类加载的场景,但对于web容器却是不适用的;这是因为servlet规范对web容器的类加载做了一些规定,简单的来说有以下几条: 1.WEB-INF/classes和WEB-INF/lib路径下的类会优先于父容器中的类加载,比如WEB-INF/classes下有个ABC类,CLASSPATH下也有个ABC类,jetty会

2018-02-04 15:49:01 2349 1

原创 Jvm类加载机制详解---类加载器及双亲委托模型

前面介绍了类加载的几个过程,实际中这些过程大部分都是由虚拟机本身去执行的,我们没有办法去改变或影响这些过程的执行。但是虚拟机团队将类加载阶段第一步中的”通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码模块被称为”类加载器”。1.类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起

2018-01-31 13:07:27 2478

原创 Jvm类加载机制详解--类加载的几个阶段

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机类加载机制。在Java语言中,类的加载、连接和初始化过程都是在程序运行期间完成的,这是java作为动态语言的基础。另外值得注意的是上面提到的Class文件,并不一定值得是磁盘上的.class文件,而只需要是任何符合字节码规范的一串二进制字节流就可以了。下面来了

2018-01-28 22:24:54 5783 3

原创 spring整合mybatis

现在很多项目都是基于Spring框架进行开发的,这种情况下如果仍然按照上面的方式来配置使用mybatis则会有很多的不方便。好在针对Spring框架mybatis也提供了配置方案,主要是通过一系列的mybatis-spring-xxx.jar来实现组合的,下面就来介绍如何在Spring项目中配置使用mybatis框架。 spring-mybatis的整合配置方式有很多种,可以通过XML和注解进行配

2017-12-30 20:55:21 363

原创 Java 动态代理原理及其在mybatis中的应用

代理是一种基本的设计模式,代理模式的主要作用是为其他对象(被代理的对象,下面称为原对象)提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理对象既可以将客户端的请求完全转发给原对象,也可以提供一些额外或不同的操作。这篇文章从静态代理模式说起,然后到Java的动态代理最后分析一个动态代理在mybatis应用的

2017-12-30 12:26:45 1568 2

原创 Java Class类及反射机制

首先要分清楚Class类和关键词class的不同,虽然Class类名称上和class很相似,但两者其实没有什么关联。Class类也是一个Java类,它也可以实例化得到对象,与普通类不一样的是Class类中存储的是其它类的类型信息。而这些类型信息正是Java反射机制所需要的,Java的反射机制是由Class类和java.lang.reflect包下的Method、Field、Constructor等类

2017-12-30 09:47:00 4151 1

原创 Jetty源码分析之NIO实现的Connector:SelectChannelConnector

Connector在Jetty中是负责接收客户端请求,然后为每个请求分配一个对请求进行处理的线程,并且负责将处理完得到的响应发送给客户端。总共有两种类型的Connector,基于Socket的阻塞Connector,代表类是SocketConnector;另外就是基于非阻塞NIO的SelectChannelConnector,当然其实在Jetty中还有基于NIO的阻塞Connector。但现在使用最

2017-12-25 23:58:03 1417

原创 Jetty源码分析之线程池:QueuedThreadPool

前面分析Jetty整体架构的时候介绍过Jetty的三大组件:Acceptor、Handler和ThreadPool;前两者工作的时候都是需要线程的,而所需的线程正是从ThreadPool中获取的。这篇文件就是来分析ThreadPool的一个具体实现:QueuedThreadPool。下面是它的类图:继承了父类AbstractLifeCycle之后,QueuedThreadPool就可以当成一个Lif

2017-12-24 22:10:42 5991 3

原创 Jetty源码分析之WebAppContext

WebAppContext即Web Application ContextHandler,表示一个Web应用的上下文,是上篇文章介绍的ContextHandler的一个子类,也是实际中应用的ContextHandler。先来看下类图: 可以看到在ContextHandler和WebAppContext中间还有一个ServletContxtHandler,下面就先从这个类开始分析。1.Servlet

2017-12-24 13:26:27 3146

原创 Jetty源码分析之ContextHandler

ContextHandler是ScopedHandler的直接子类,继承关系比较简单就不贴类图了。 ContextHandler从名字的直观含义上来看是上下文Handler,在servlet规范中每个web应用都有一个上下文(context)的含义,其实就是对应到这里的ContextHandler了。当web容器收到用户请求之后,会根据请求里面的url先判断属于请求时发给哪个web应用的,但并不会

2017-12-24 11:37:15 1503

原创 mysql索引优化技巧

前面一篇文章学习了索引的基本知识以及B-TREE索引的适用范围,这一篇文章主要是讨论一些如何高效设计、使用索引的技巧,有些是通用的,有些是针对特定场景的。1.独立的列如果在查询条件中列不是独立的,及时在这个列上建立了索引,mysql也无法使用索引进行优化。所谓”独立的列”,指的是索引列不是表达式的一部分,也不能是函数的参数。比如下面这条查询sql,就无法使用actor_id列上的索引 select

2017-12-23 11:58:32 608

原创 mybatis原理解析---SqlSession运行过程(下)

继续sqlSession运行过程分析,上一篇文章讲到通过sqlSession中executor对象的query方法执行的查询,在分析这个方法的源码之前,先分析下SqlSession执行sql中用到的比较重要的几个对象。SqlSession中是通过Executor 、StatementHandler、ParameterHandler、ResultHandler来完成数据库操作和结果返回的。先稍微来了解

2017-12-23 10:34:18 1709

原创 Jetty源码分析之ScopedHandler及Handler链

ScopedHandler在Jetty的Handler体系中属于比较重要的一个成员,像ContextHandler、SessionHandler、ServletHandler、WebappContext等重要组件都直接或间接的继承了ScopedHandler,所以在学习其它更具体handler之前,先来分析下它的源码。先来看下ScopedHandler的类图: 从类图中可以看到继承的层次比较深,所

2017-12-21 11:22:51 1113

原创 Jetty源码分析之AbstractHandler

jetty可以说是一个基于Handler设计的Web服务器,其通过组合各种Handler实现对请求的处理。所以源码阅读部分先从Handler部分开始,而AbstractHandler是大部分Handler都继承了的父类,因此先了解它的源码。下面先来看下AbstractHandler的类图,了解下它的继承关系。 从类图上就可以看到AbstractHandler实现了LifeCycle和Handler

2017-12-19 22:44:50 2513

原创 mybatis原理解析---SqlSession运行过程(上)

sqlSession代表与数据库的一次会话,在这次会话中可以多次执行查询等sql操作。从前面可以看到SqlSession对象是从SqlSessionFactory对象中获得的。sqlSession本身就定义了一系列的update select delete insert等方法,在旧版本的mybatis中是直接调用这些方法的,但是在mybatis3中先通过getMapper()获取到mapper对象(

2017-12-19 21:41:32 1487

原创 Jetty服务器启动过程分析

先大致看一下外部启动一个Jetty服务器的过程,然后再展开分析 1.java start.jar进行启动,解析命令行参数并读取start.ini中配置的所有参数。 2.解析start.config确定jetty模块的类路径并确定首先执行的MainClass。 3.可以选择是否另起一个进程来,如果不另起进程,则通过反射方式来调用MainClass,start.ini中配置的JVM参数不会生效。

2017-12-18 22:03:49 3067

原创 Jetty架构分析

最新的jetty版本是jetty 9,但下面这个jetty源码阅读系列都是基于jetty8进行的,所以可能有些地方和最新的源码对不上。 jetty服务器由一个或多个connector核心组件以及一系列handler组件和一个线程池组成。结构图如下: 三个组件的职责:connector负责接收客户端连接请求,而handler组件则负责处理请求并给予响应,前两个组件需要的线程资源都直接从线程池Thr

2017-12-17 23:29:36 861

原创 mybatis原理解析---配置文件读取及SqlSessionFactory构建

mybatis的运行分为两个部分,第一个部分是读取配置文件并缓存到Configuration对象,用以创建SqlSessionFactory对象。第二部分是sqlSession运行过程。这篇文章主要讨论如何解析配置文件得到Configuration对象,以及Configuration对象中一些重要属性的含义。1.配置文件解析先来看读取配置文件得到Configuration对象的过程。mybatis的

2017-12-16 15:47:48 3742

原创 mysql索引详解

索引(在mysql中也叫键(key))是数据库用来快速找到记录的一种数据结构。索引对于良好的性能非常关键,特别是当表中数据量越来越大的时候,索引对性能的影响就越来越明显了。在数据量较少并且负载较低的时候,不良的索引对性能的影响还不明显,但当数据量逐渐增大,则性能下降会越明显。 可以类比一本书的目录来理解mysql索引工作的原理,当我们想在一本书上找到某个主题内容时会先在书的”索引”(目录)上找到指

2017-12-15 23:27:06 362

原创 数据库的数据类型优化

mysql支持非常多的数据类型,在设计表的时候需要精心的为每个列选择合适的数据类型以提高数据库的性能,这篇文章回顾了数据库中常用的几种数据类型,并总结了一些数据类型优化的技巧。 1.选择优化的数据类型 mysql支持非常多的数据类型,选择正确的数据类型对优化性能非常重要,下面几个原则适用于所有的数据类型。 1) 更小的类型通常更好 一般情况下应该使用能够正确存储数据的最小数据类型。小的数

2017-12-12 23:40:26 608

原创 mybatis 动态sql

很多时候需要根据传入的条件去进行sql的拼接,mybatis提供了几个基本的元素,通过这几个标签在xml文件中就可以实现SQL的动态拼接。 最常使用的几个元素定义如下: 语句 作用 备注 if 判断语句 单条件分支判断 choose(when otherwise) 相当于Java中的case switch 多条件分支判断 trim(where set) 辅

2017-12-11 22:15:50 1309

原创 mybatis中的缓存

缓存的优点在于能够加快查询的速度,在数据库查询的情景之下,在需要多次执行同一sql(sql语句相同,参数相同)的情况下,如果能将查询的结果缓存下来就不需要每次都到数据库上去真正执行查询语句,显然能加快查询速度。mybatis提供了缓存机制,分为系统缓存和开发人员自定义的缓存。 1.系统缓存 mybatis提供缓存支持,但是默认情况下只开启一级缓存,所谓的一级缓存是针对单个sqlSession(

2017-12-07 22:49:45 469

原创 mysql的架构、并发和事务简介

mysql的架构很灵活,通过配置可以适应于不同的使用场景,但同时也会带来选择上的困惑,所以需要了解mysql的设计思想,以便做出合理的选择。 mysql最重要 与众不同的设计是它的存储引擎架构,这种架构设计将查询处理(query Processing)及其它系统任务(Server Task)和其它 数据存储/提取相分离,这种存储与处理相分离的设计使得在使用时可以根据性能,特性,以及其它需求来选择

2017-12-04 23:07:03 323

原创 mybatis映射器文件配置

所谓的映射器可以理解为前面配置的mapper.xml文件,在这个文件中我们通过namespace将配置和指定的Dao层接口关联起来,准确的来说是为每个Dao层接口中的方法配置具体的sql语句;另外mapper文件中还可以为查询语句灵活的配置返回结果对象(javaBean),根据需要构建动态sql等功能。在映射器中可以定义的元素有select insert delete update等代表具体sql操

2017-12-03 23:45:56 628

原创 jetty的安装和启动

Jetty是当下非常流行的一款轻量级Java Web服务器和Servlet容器实现,它由Eclipse基金会托管,完全免费而且开放源代码,因此所有人均可以从其官网下载最新源代码进行研究。由于其轻量、灵活的特性,Jetty被广泛用于一系列知名产品,例如ActiveMQ、Maven、Spark、Google App Engine、Eclipse、Hadoop等等。下面就来研究如何安装和启动jetty。

2017-11-30 22:11:33 32012

原创 Servlet中的ServletContext和ServletConfig详解

ServletContext和ServletConfig是Servlet中比较重要的两个概念,在Java Web开发的很多时候都会碰到这两个对象,下面就详细的介绍下他们。 1.ServletContext ServletContext,即Servlet上下文是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Webapp时,会为它创建一个ServletConte

2017-11-27 23:21:50 1084

原创 Databus简介

1.背景 在互联网架构中,数据系统通常分为真实数据(source-of-truth)系统,作为基础数据库,存储用户产生的写操作;以及衍生数据库或索引,提供读取和其他复杂查询操作。后者常常衍生自主数据存储,会对其中的数据做转换,有时还要包括复杂的业务逻辑处理。缓存中的数据也来自主数据存储,当主数据存储发生变化,缓存中的数据就需要刷新,或是转为无效。这样架构自然而然的一个问题就是如何保障基础数

2017-11-27 15:21:38 17140

原创 Cookie和Session详解

http是一个无状态的协议,对于客户端的每次请求服务端在发送完响应后一般会把连接给断开,下次发送请求又会建立一个新的连接,这样就产生了服务端无法判断客户端身份的问题,Cookie和Session就是解决服务端和客户端交互问题的两种方式。 1.Cookie 1).概念 服务端在客户端存放的文件,里面记录了一些客户端相关的信息以便于下次请求的时候再带回服务器去。为什么需要cookie?因为http

2017-11-24 23:46:55 528

原创 mybatis TypeHandler详解

1.TypeHandler概念 TypeHandler,类型转换器,在mybatis中用于实现java类型和JDBC类型的相互转换. mybatis使用prepareStatement来进行参数设置的时候,需要通过typeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过 调用PrepareStatement不同的set方法实现的;在获取结果返回之后,也需要将

2017-11-22 22:51:42 4850 6

原创 Listener、Filter以及Servlet中的url-pattern

1.Listener 1) 概念以及分类 Listener,监听器,可以实现对ServeltContext生命周期中初始化和销毁的监听,也可以实现对ServletContextAttribute、ServletRequestAttribute等属性变更事件的监听。Listener是基于观察者模式实现的,目前Servlet中定义了6种两类Listener,EvenListenter类型的Servl

2017-11-21 23:22:57 443

原创 mybatis主配置文件解析

所谓mybatis主配置文件就是上一篇文章中提到的mybatis-config.xml,SqlSessionFactoryBuilder 通过解析这个配置文件得到代表数据库的SqlSessionFactory对象,所以说这个文件是mybatis配置的入口。下面来仔细解析下这个配置文件。首先给出所有可以配置的属性,然后再重点研究下几个重要属性。mybatis配置文件是有固定结构的,每个标签出现顺序是固

2017-11-20 12:59:15 938

原创 实现并配置一个简单的Servlet

Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求。尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求。 Servlet必须部署在Java servlet容器才能使用。既然Servlet是一个Java类,那么我们就可以自己去实现它。下面展示了如何实现一个简单的Servlet类,并对其进行配置的过程。 1.继承Http

2017-11-15 22:57:35 2105 1

原创 Web服务器、Servlet容器和Servlet

1.什么是Web服务器 想要知道什么是Servlet容器,我们首先要知道什么是Web服务器。 Web服务器使用HTTP协议来传输数据。 最简单的一种情况是,用户在浏览器(客户端,client)中输入一个URL(如,www.programcreek.com/static.html),然后就能获取网页进行阅览。因此,服务器完成的工作就是发送网页至客户端。传输过程遵循HT

2017-11-14 22:30:35 4154 3

原创 mybatis基础入门

一.mybatis简介 Java 提供了JDBC来操作数据库,但是JDBC本身访问数据库的操作比较复杂,具体来说1.对于每次的sql查询都需要重复编写样板代码 2.查询过程中需要手动处理各种异常 3.查询结束后需要手动关闭各种资源(ResultSet、Statement、Connection)。这种情况下就出现了对JDBC进行封装的ORM框架来简化访问数据库的操作。所谓的ORM指的是对

2017-11-14 12:21:32 324

原创 jdbc访问数据库详解

一.jdbc简介 jdbc,java database Connectivity即java数据库连接,是一组定义了如何连接和操作数据库的java api。下面结合一个简单示例说明下具体步骤:public class Main { private static Logger LOG = LoggerFactory.getLogger(Main.class); public sta

2017-11-07 22:41:40 873

原创 Java NIO 详解---NIO中的异步网络IO

前面的例子都是关于如何通过NIO操作文件读写的,我们知道BIO中的Socket、ServerSocket提供了网络通信的能力,在NIO中也有对应的模块提供了这种能力,并且具有更加强大的功能—通过异步非阻塞的数据读写实现一个线程监听多个连接的能力。 1)异步IO 所谓的异步IO是一种没有阻塞读写数据的方法。通常情况下,代码在调用read()方法时程序会阻塞直到又可以读取的数据;同样

2017-10-29 22:45:10 1800

原创 Java NIO 详解---Buffer与Channel

一.NIO 和BIO的比较 NIO是jdk1.4开始提供的一种新的IO方式。原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器

2017-10-29 01:14:22 2129

原创 JAVA BIO 回顾

一.NIO 和基础IO的比较 NIO是jdk1.4开始提供的一种新的IO方式。原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤

2017-10-28 22:09:48 265

转载 类找不到总结java.lang.ClassNotFoundException

(1)org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class ‘com.microsoft.sqlserver.jdbc.SQLServerDriver’ 答:sqljdbc.jar (2)java.lang.ClassNotFoundException: org.springfra

2016-08-18 18:43:43 4647

原创 Thinking in Java --日志初步学习

1.log4j简介 Log4j由三个重要的组件构成:日志信息的级别(Loggers),日志信息的输出目的地(Appenders),日志信息的输出格式(Layouts)。日志信息的级别指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显 示内容。 1) Loggers Loggers组件可分为五个级别,分别为

2016-08-16 20:00:00 545

深入浅出MyBatis

深入浅出mybatis这本书详细的描述了如何使用mybatis作为数据层半持久化框架

2018-06-07

空空如也

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

TA关注的人

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