自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不忘初心,方能始终。

高山仰止,景行行止,虽不能至,心向往之!

  • 博客(85)
  • 资源 (9)
  • 收藏
  • 关注

原创 Mybatis 源码分析(2)—— 参数处理

Mybatis对参数的处理是值得推敲的,不然在使用的过程中对发生的一系列错误直接懵逼了。以前遇到参数绑定相关的错误我就是直接给加@param注解,也稀里糊涂地解决了,但是后来遇到了一些问题推翻了我的假设:单个参数不需要使用 @param 。由此产生了一个疑问,Mybatis到底是怎么处理参数的?几种常见的情景:单个参数不使用注解,基于${}和#{}的引用,基本类型和自定义对象都可以...

2018-03-06 22:17:08 3532

原创 IDEA 控制台输出日志无法grep

不知从何时开始,我的IDEA控制台无法直接使用Grep插件来过滤输出日志了,这个插件真的挺好用的,不知道是升级后造成的还是我自己设置错误,反正在控制台右键无法打开grep来过滤:在我开发过程中需要这个东西的时候,我试过很多方法都无解,升级插件,群里提问,网上提问,百度谷歌都查不出来,我估计这是个例了,感觉很揪心。后来我顺着插件描述摸到了作者的窝,在这个开源的插件下提了一个issue:Gre...

2019-08-01 14:06:23 1851

原创 linux文件与目录管理

一、目录与路径相对路径与绝对路径绝对路径:路径的写法“一定由根目录 / 写起”,例如: /usr/share/doc 这个目录。相对路径:路径的写法“不是由 / 写起”,例如由 /usr/share/doc 要到 /usr/share/man 下面时,可以写成: “cd …/man”这就是相对路径的写法啦!相对路径意指“相对于目前工作目录的路径!”目录的相关操作. 代...

2019-07-31 20:28:32 370

原创 使用Golang开发一个本地代理

引言最近需要对接一个接口,人家提供了两种调用方式,第一种是基于IE浏览器的Active,第二种是动态链接库dll。我们公司的产品不支持IE,所以只能通过调用dll来完成了。之前我已经用Java实现了这个代理,但是感觉很笨重,依赖于容器还有JVM一大堆,这个代理要安装在客户端电脑上,基于Http协议来调用,然后透传参数调用dll,将返回的结果转换为Json。如今我想用Golang来实现这个功能...

2019-03-24 10:50:35 1545

原创 异步任务 -- FutureTask

任务提交之前在分析线程池的时候,提到过 AbstractExecutorService 的实现:public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskF...

2019-01-24 21:00:18 786

原创 线程池 -- ThreadPoolExecutor

线程池的实现原理1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)。2)如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。3)如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(注意,执行这一步骤需要获取全局锁)。4)如果创建新线程将使当前运行的线程超...

2018-11-25 14:47:14 417

原创 阻塞队列

什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程...

2018-11-03 09:18:01 203

原创 Locksupport 与 Condition

LockSupportLockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假设线程为车辆,那么park方法代表着停车,而unpark...

2018-10-30 20:07:06 3596

原创 队列同步器--AbstractQueuedSynchronizer

队列同步器队列同步器 AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。同步器是实现锁(也可以是任意同步组件)的关键,在锁的实现中聚合同步器,利用同步器实现锁的...

2018-10-22 09:32:31 285

原创 双重检查锁定与延迟初始化

双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。下面是非线程安全的延迟初始化:public class UnsafeLazyInitialization { private static Instance instance; public static Instan...

2018-07-23 20:43:10 327

原创 单元测试多线程解决之道

遇到问题曾今在开发的过程遇到一个问题,当时有一个服务是群发邮件的,由于一次发送几十个上百个,所以就使用了多线程来操作。在单元测试的时候,我调了这个方法测试下邮件发送,结果总是出现莫名其妙的问题,每次都没有全部发送成功。后来我感觉到启动的子线程都被杀掉了,好像测试方法一走完就over了,试着在测试方法末尾让线程睡眠个几秒,结果就能正常发送邮件。分析解决感觉这个Junit有点猫...

2018-07-15 20:56:47 6590 1

原创 happens-before

happens-before 是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。一、JMM 的设计从JMM设计者的角度,在设计JMM时,需要考虑两个关键因素:程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束...

2018-07-10 09:23:30 1612

原创 volatile 和锁的内存语义

一、volatile 的内存语义1. volatile 的特性volatile变量自身具有以下特性:可见性 :对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写 入。原子性 :对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。2. volatile 写-读建立的happens-befo...

2018-06-30 17:36:54 288

原创 重排序

重排序 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。1. 数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操...

2018-06-30 16:38:53 1277

原创 Java 内存模型基础

并发编程模型的两个关键问题线程之间如何通信通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。线程之间如何同步同步是指程序中用于控制不同线程间...

2018-06-24 11:52:21 177

原创 Linux 的文件权限与目录配置

用户和用户组文件所有者 (owner)用户组概念 (group)其他人概念 (others)Linux文件权限概念1. Linux文件属性要了解Linux文件属性,那么有个重要的命令必须提及–Sls。以root的身份登录Linux之后,执行“ls -al”,看到下面的内容: drwx—— 3 root root 4096 Sep 5 10:37 .gcon...

2018-06-18 19:31:58 851

原创 Mybatis 源码分析(9)—— 事物管理

Mybatis 提供了事物的顶层接口:public interface Transaction { /** * Retrieve inner database connection * @return DataBase connection * @throws SQLException */ Connection getConnection() throw...

2018-05-11 18:08:47 382

原创 Mybatis 源码分析(8)—— 一二级缓存

一级缓存其实关于 Mybatis 的一级缓存是比较抽象的,并没有什么特别的配置,都是在代码中体现出来的。当调用 Configuration 的 newExecutor 方法来创建 executor:public Executor newExecutor(Transaction transaction, ExecutorType executorType, boolean autoC...

2018-05-05 18:22:26 364 1

原创 Mybatis源码分析(7)—— 结果集处理

解析封装ResultMap 是和结果集相关的东西,最初在解析 XML 的时候,于 parseStatementNode 方法中,针对每一个 select 节点进行解析,转换为 MappedStatement(类似 Spring 的 bean 配置和 BeanDefinition 的关系)。在 MapperBuilderAssistant 的 addMappedStatement 方法中,...

2018-04-21 18:01:20 2747

原创 Mybatis源码分析(6)—— 从JDBC看Mybatis的设计

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。六步流程:加载驱动(5.x驱动包不需要这步了)建立连接创建Statement执行SQL语句获取结果集关闭资源这里只取后面几步分析下,基本上都是从Executor开始。De...

2018-04-15 12:07:55 498

原创 Mybatis源码分析(5)—— 插件的原理

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,可以使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)ParameterHandler (getParameterObject, setParam...

2018-04-08 21:00:27 259

原创 Mybatis源码分析(4)—— Mapper的创建和获取

Mybatis我们一般都是和Spring一起使用的,它们是怎么融合到一起的,又各自发挥了什么作用?就拿这个Mapper来说,我们定义了一个接口,声明了一个方法,然后对应的xml写了这个sql语句, 它怎么就执行成功了?这家伙是怎么实现的,带着这个好奇心,我一步步跟踪,慢慢揭开了它的面纱。一、初始化时的埋点MapperFactoryBean的父类SqlSessionDaoSuppor...

2018-04-01 11:22:10 1450

原创 Mybatis源码分析(3)—— 从Mybatis的视角去看Bean的初始化流程

不涉及Spring完整的启动流程,仅仅从Mybatis的视角去分析几个关键的方法,找到Mybatis是如何通过这几个扩展点植入进去的,反过来看Spring是如何设计,埋下这些伏笔,实现其可扩展性。springContext-mybatis.xml的配置:<!-- simplest possible SqlSessionFactory configuration -->&l...

2018-03-08 21:41:34 828

原创 Mybatis源码分析(1)—— Mapper文件解析

感觉CSDN对markdown的支持不够友好,总是伴随各种问题,很恼火!xxMapper.xml的解析主要由XMLMapperBuilder类完成,parse方法来完成解析: public void parse() { if (!configuration.isResourceLoaded(resource)) { configurationElement(par...

2018-03-01 21:41:42 635

原创 Shiro的鉴权方式

一、 怎么用Shiro 支持三种方式的授权编程式:通过写 if/else 授权代码块完成:Subject subject = SecurityUtils.getSubject(); if(subject.hasRole(“admin”)) { //有权限} else { //无权限}注解式:通过在执行的 Java 方法上放置相应的注解完成:@Require...

2018-02-25 09:38:41 9871 1

原创 Shiro切入Spring的方式

在springMVC中要使用shiro,一般都遵循下面的配置:applicationContext-shiro.xml<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="...

2018-02-08 09:44:07 458

原创 Shiro的认证原理(Subject#login的背后故事)

登录操作一般都是我们触发的:Subject subject = SecurityUtils.getSubject();AuthenticationToken authenticationToken = new ...subject.login(authenticationToken);Subject的登录将委托给SecurityManager,SecurityManager的log

2018-02-07 20:22:10 22241 7

原创 Shiro源码分析之Subject和SecurityManager

Subject毫无疑问,Subject是Shiro最重要的一个概念。“Subject”只是一个安全术语,意味着应用程序用户的特定于安全性的“视图”。Shiro Subject实例代表单个应用程序用户的安全状态和相关操作。创建初次创建是在AbstractShiroFilter#doFilterInternal方法中: final Subject subject = cre

2018-01-30 18:13:52 3212

原创 Shiro过滤器的维护与匹配执行

servlet的初始化会触发核心过滤器的创建:public Object getObject() throws Exception { if (instance == null) { instance = createInstance(); } return instance;}在createInstance方法中会调用 FilterC

2018-01-17 20:28:32 751

原创 DelegatingFilterProxy干了什么?

org.springframework.web.filter.DelegatingFilterProxy一般情况,创建一个Filter是交给自己来实现的。基于servlet规范,在web.xml中配置,自定义filter实现Filter接口:public interface Filter { void init(FilterConfig var1) throws Servle

2018-01-07 11:18:42 3734

原创 ShiroFilterFactoryBean分析

创建核心Filter同其他框架一样,都有个切入点,这个核心Filter就是拦截所有请求的。通过web.xml中配置的Filer进入,执行init方法获取这个instance,调用下面的createInstance方法创建核心Filter:protected AbstractShiroFilter createInstance() throws Exception { log.debug("Cr

2018-01-01 21:09:39 5144

原创 Junit3.8源码--核心类

以textui来分析:Test顶层接口。TestSuite和TestCase均实现此接口,在具体执行的时候面向此接口编程,弱化类型,实现各自的执行流程。

2017-12-17 22:31:24 547

原创 方法调用

方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。换句话说,调用目标在程序代码写好、编译器进行编译时就必须确定下来。这类方法的调用称为解析(Resolution)。

2017-10-22 23:03:18 755

原创 Class文件格式

了解class文件的格式有助于我们理解Java虚拟机的工作方式,不管基于何种平台,最终生成的都是符合规范的class文件,虚拟机按照规范来理解并解析此文件。

2017-08-27 23:12:20 793

原创 Java虚拟机结构

运行时数据区PC寄存器每一条Java虚拟机线程都有自己的pc寄存器。在任意时刻,一条Java虚拟机线程只会执行一个方法的代码,这个正在被线程执行的方法称为该线程的当前方法。如果这个方法不是native的,那pc寄存器就保存Java虚拟机正在执行的字节码指令的地址,如果该方法是native的,那pc寄存器的值是undefined。

2017-08-20 23:13:43 302

原创 线程安全与锁优化

线程安全的实现方法非阻塞同步互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,因此这种同步也成为阻塞同步。随着硬件指令集的发展,我们有了另外一个选择:基于冲突检测的乐观并发策略

2017-07-16 22:50:20 253

原创 Synchronized 关键字

Java中的每一个对象都可以作为锁,具体表现为以下3种形式:对于普通同步方法,锁是当前实例对象对于静态同步方法,锁是当前类的Class对象对于同步代码块,锁是Synchronized括号里配置的对象synchronized作用于四种类型: 1. 实例方法 2. 静态方法 3. 实例方法中的同步块 4. 静态方法中的同步块同步方法实例同步方法publi...

2017-07-09 23:35:10 741

原创 SpringMVC中为什么要配置Listener和Servlet

一直以来,我们使用SpringMVC的时候习惯性都配置一个ContextLoaderListener,虽然曾经有过疑问,配置的这个监听器和Servlet究竟做了什么,但也没深究。要说任何Web框架都离不开Servlet,它是一个容器,也是一种规范,你要和Web搞上关系,无非就是那么几种,监听器、过滤器和Servlet,最终都是为了切进ServletContext。SpringMVC是基于S

2017-07-01 23:34:29 8134 1

原创 取消与关闭

任务取消中断线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程,告诉它在合适的或者可能的情况下停止当前工作,并转而执行其他的工作。

2017-06-25 21:13:29 462

原创 同步工具类

同步工具类可以是任何一个对象,只要它根据其自身的状态来协调线程的控制流。阻塞队列保存对象的容器, 还能协调生产者和消费者等线程之间的控制流 take和put等方法将阻塞,直到队列达到期望的状态(队列即非空,也非满)。

2017-06-24 22:37:39 328

微信公众平台应用开发

资深微信公众平台应用开发工程师撰写,采用JAVA语言,根据微信最新5.1版全面解读公众平台开放API的各项功能和用法,系统讲解微信公众平台应用开发的流程、方法和技巧。 深入讲解微信公众平台应用开发的高级技术,以及与其他技术的结合使用;包含大量小案例和3个有代表性的综合案例,实践性极强

2015-09-17

SpringMVC文档

这是一个非常经典的文档,适用于初学者和想深入研究的开发人员,涵盖了基于注解的用法。

2015-07-12

redis-server on windows

提供各个版本的windows系统的服务器端程序,官方直接支持Linux,但是这里也有windows版本的存在。

2014-12-01

springMVC+mybatis的示例项目

这是一个非常实用的demo,对于初学者建议下载后先跑起来,然后熟悉整个架构,再辅助查询细节和知识点,然后自己模仿写一个小项目,获益匪浅!

2014-09-21

springMVC+Mybatis

springMVC+mybatis也是个不错的选择,经常使用S2SH的人可以试试这个轻量级的组合。

2014-09-21

springMVC所需的jar

这些jar是自己做项目时网上慢慢搜集来的,花了不少时间吧,总算找全了。

2014-09-21

hibernate-Annotation.jar

支持hibernate3.x的Annotation注解,4.x版本均已集成此jar,无需下载。

2014-09-14

使用jQuery框架实现ajax需要的包

在学会了纯js版的Ajax写法后,不妨试试jQuery这个框架,集成了对Ajax的应用,十分方便和强大。

2014-08-03

空空如也

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

TA关注的人

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