自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 重学设计模式(十)—— 策略模式

前言在日常开发中,我们经常需要在相同的上下文环境中针对不同的业务主体采用不同的处理逻辑。举个简单的例子,当我们在电商网站上购物结算时,往往会根据自身会员等级的不同而享受不同的优惠政策,而从系统实现的角度来讲,需要其运行时根据不同需求决定使用某一具体算法策略。策略模式便能较好的解决这个问题,本篇博客就来探讨一下策略模式。策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而...

2018-06-30 15:13:08 354 2

原创 Spring AOP 对象内部方法间的嵌套调用

前两天面试的时候,面试官问了一个问题,大概意思就是一个类有两个成员方法 A 和 B,两者都加了事务处理注解,定义了事务传播级别为 REQUIRE_NEW,问 A 方法内部直接调用 B 方法时能否触发事务处理机制。答案有点复杂,Spring 的事务处理其实是通过AOP实现的,而实现AOP的方法有好几种,对于通过 Jdk 和 cglib 实现的 aop 处理,上述问题的答案为否,对于通过Aspec...

2018-06-17 00:04:56 7680 2

原创 Java 内存可见性

前两天面试的时候被问到 Java 内存可见性相关问题,个人感觉回答的不是很好,因此需要强化学习一下。首先什么是内存可见性呢?可见性 一个线程对共享变量值的修改,能够及时地被其他线程看到谈到内存可见性,必须得先从 Java 的内存模型(JMM)说起,下图表示了 Java 的内存模型, 整体来说,在 JMM 中,所有的变量都存储在主内存中,而每个线程都有自己独立的工作内...

2018-06-13 15:44:28 424

原创 Spring 声明式事务源码分析

Spring 的声明式事务实现方式主要有2种,一种为通过使用Spring的< tx:advice >定义事务通知与AOP相关配置实现,另为一种通过@Transactional实现事务管理实现,个人认为本质上其实都一样,就是用定义的注解或者配置信息将目标对象包装起来,拦截对访问目标对象的请求,实现对目标对象访问的增强处理。Spring 使用 TransactionInterceptor ...

2018-06-06 17:27:45 441

原创 重学多线程(十)—— synchronized 原理与锁升级

前言前几天去面试的时候,面试官问了一些关于 synchronized 关键字原理性的问题,回答得不甚理想。看来,平时对synchronized关键只能做到知其然,却不知其所以然,所以利用业余时间补习一下。synchronized 原理synchronized 关键字编译后会在同步块的前后添加上 montorenter 和 monitorexit 两个字节码指令,这两个字节码指令都需...

2018-06-02 15:48:38 4708

原创 MyBatis 缓存之Redis简单实现

前言MyBatis 提供的缓存机制都是基于Cache 接口而实现,因此我们也可以通过实现该接口创建自定义的缓存实现。Redis 的缓存实现简单来说,在MyBatis开启二级缓存的前提下,通过使用自定义的缓存实现类,使用Redis完成对缓存信息的查询和更新。看一下具体实现,public class RedisCache implements Cache { private s...

2018-05-27 13:07:27 3480 3

原创 MyBatis 分页插件

前言日常开发中,我们经常会碰上需要列表查询的场景,如果查询结果列表过长,则需要对其进行分页。MyBatis 其实自带分页功能,通过一个RowBounds的类实现,但是存在一个非常严重的问题,那就是它会一条SQL中查询所有的结果出来,然后根据从第几条到第几天取出数据返回。如果这条SQL返回很多数据,系统很可能内存溢出。分页插件是 MyBatis 中最为经典和常用的插件,本文就来介绍一种分页插...

2018-05-23 23:36:53 486

原创 Java中的转义符及在正则表达式中应用

前言日常开发中经常遇到需要对字符进行转义的场景,比如 Windows 系统和 Linux 系统中对于文件路径符的不同表示。通常,笔者为了赶进度基本靠试而没有真正理解,现在有时间了便好好整理一番。Java中的转义符Java中的字符串通常有三种表示方法:直接单字符,例如“A”;由转义字符表示的特殊字符,例如“\t”; Unicode字符,例如“\u0008”;其中转义字符表...

2018-05-20 12:28:06 1383 1

原创 重学多线程(九)—— 再谈锁机制

前言《重学多线程(三)—— 锁》一文比较详细地介绍了 Java 中的所机制,博主最近在工作中使用锁时,经常思考几个问题——公平锁和非公平锁如何具体实现、ReentrantLock 默认情况下是否公平、共享锁和排它锁具体如何实现,现在正好有时间重新梳理一下这块内容。锁的基础知识我们日常开发过程中提到的锁,一般指的是实现了 java.util.concurrent.locks 包中 Loc...

2018-05-15 01:09:47 266

原创 重学设计模式(九)—— 访问者模式

访问者模式(Visitor Pattern)属于对象行为型模式的一种,表示一个作用于其对象结构中的各元素的操作,它可以在不改变各元素类的前提下定义作用于这些元素的新操作。可以这么说,访问者模式算是 GOF 23 中设计模式中最复杂的一个,在实际开发中,使用不是非常广泛。访问者模式的类图如下,我们先来通过一个具体的例子了解一下访问者模式,首先定义两个接口,一个表示被访问对象的内部...

2018-05-13 14:00:24 178

原创 Java 反射机制

前言java语言的反射机制是指能够动态获取信息以及动态调用对象的方法的功能。一个类中包含成员变量、方法、构造方法、包等等信息,反射机制将class文件读入内存,并为之创建一个Class对象。一句话,反射是框架设计的灵魂。反射的使用获取Class信息//第一种获取Class对象方式Designer designer = new Designer("A001","...

2018-05-09 23:25:45 146

原创 RxJava 响应式编程初探

前言最近在学习Spring Cloud Hystrix框架,发现里面的代码写法跟传统的编程思路很不一样,充满了回调和Lamda风格,于是去深入了解了一下,这便是本文的主题 RxJava 响应式编程。RxJava我们一般写的程序,以流程为核心的,每一行代码实际上都是机器实际上要执行的指令,称之为命令式程序。而RxJava这样的编程风格,称为函数响应式编程。函数响应式编程是以数据流为核...

2018-05-06 17:58:09 522

原创 MySQL锁机制

前言由于一直从事开发工作的原因,在个人的知识结构中,数据库算是一个很大的短板,对于数据库的认识完全停留在“会用”这个层次,对于数据库底层的一些机制大多“知其然,却不知其所以然”,最近正好有时间,把这块知识补一下。锁在日常的开发过程中,为了控制线程的并发肯定会用到锁机制。对于数据库而言,锁机制就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。当然M...

2018-05-04 01:20:43 203

原创 Spring Cloud 源码分析(三)—— 服务容错

前言在微服务架构中,我们通常把一个系统分拆成若干服务单元,各单元之间通过远程调用的方式实现相互依赖,但是如果因为网络原因或是服务自身出现问题使得调用方对外服务出现延迟,如果在高并发的情况下可能会因为任务积压导致服务崩溃。Spring Cloud Hystrix 实现了断路器、线程隔离等一系列服务保护功能,具备服务降级、服务熔断、线程和信号隔离、请求缓存等强大功能。工作流程当我们使用...

2018-04-28 01:33:11 606

原创 Netty框架学习之路(七)—— 零拷贝

前言今天参加了一个面试,面试官问了关于对Netty中零拷贝的理解,答得不是很完美,因此回来后仔细研究了一下。零拷贝 Zero-Copy首先,零拷贝不是Netty特有的机制,传统意义上的零拷贝指的是在操作数据时,不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域,因为少了一次内存的拷贝,因此 CPU 的效率就得到的提升。这是一种在 OS 层面上的 Zero-copy,目的是避...

2018-04-26 01:12:16 1571 1

原创 重学多线程(八)—— ThreadLocal

ThreadLocal介绍在日常开发中,一个线程在其声明周期内,可能穿过多个层级,多个方法,如果有个对象需要在此线程周期内多次调用,且是跨层级的(线程内共享),通常的做法是通过参数进行传递,那有没有更好的方法呢?显然是有的,那就是ThreadLocal。ThreadLocal将变量绑定在线程上,在一个线程周期内,无论“你身处何地”,只需通过其提供的get方法就可轻松获取到对象,极大地提高了...

2018-04-23 23:26:21 186

原创 重学多线程(七)—— 并发框架类

前言java.concurrent包提供了几个非常实用的并发工具类,这些工具类提供了一种非常有效的并发流程控制手段。CountDownLatchCountDownLatch 允许一个或多个线程等待其他线程完成操作。CountDownLatch的具体实现如下:public class CountDownLatch { private static final class S...

2018-04-22 02:08:06 199

原创 重学设计模式(八)—— 模板方法模式

模板方法定义了一个算法的步骤,并允许子类为一个或者多个步骤提供实现。说起模板方法模式,笔者就想起刚开始编写数据库操作代码的场景,在无框架支持的前提下,每次跟数据库的交互都要加载驱动、创建连接、准备语句、执行语句、结果处理、关闭连接、异常处理等步骤。但是仔细观察,很多操作其实都是一样的,因此在Spring中,引入了JDBCTemplate概念,为数据库操作指定了模板、不同厂商的数据库只要...

2018-04-18 01:45:53 156

原创 MyBatis的运行原理

平时在日常开发的时候,我们通常定义一个Mapper接口实现数据库操作,而不是一个包含逻辑的实现类。一般而言,一个接口是没有办法执行的,那MyBatis是怎么做到的呢?答案就是动态代理,关于动态代理的内容,博主在之前的博文中已经详细介绍过了,此处不再赘述。本文主要探析一下MyBatis在执行数据库操作时的运行原理。假如我们有如下的Mapper接口,主要实现对一个用户信息的增删查改操作,...

2018-04-14 16:46:04 180

原创 MyBatis的缓存机制

前言MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐患。一级缓存默认情况下,MyBatis只开启一级缓存。一级缓存只是相对于同一个SqlSession而言的,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性...

2018-04-14 02:03:44 867

原创 Spring Cloud 源码分析(二)—— 负载均衡策略

前言Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具。通过 Spring Cloud 封装,我们可以将面向服务的REST目标请求自动转换成客户端负载均衡的服务调用。IRule 是Ribbon 中负载均衡器服务选择策略要实现的接口,我们可以看一下它的类图: 上图涵盖了 Ribbon 所有的负载均衡策略,我们看一下IRule的源码:publ...

2018-04-11 00:43:52 1550

原创 Spring Cloud 源码分析(一)—— 服务治理

前言Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,主要负责实现微服务架构中的服务治理功能,包括服务注册和服务发现。本文从源码的角度,分析Eureka的服务治理机制。Eureka服务治理机制在Eureka服务治理架构中有三种角色,分别是:服务注册中心 Eureka提供的服务端,提供服务的注册和发现功能服务提供者 提供...

2018-04-10 01:16:17 5212

原创 Netty框架学习之路(六)—— 引导

前言之前的博文介绍了Channel、EventLoop及由其衍生出来的相关概念。但这些都是静态的概念,为了能使Netty程序运行起来,必须要有一个全局的组件将上述内容串联起来,这便就是本文所讲内容——引导。引导类引导类的层次结构如下: 主要包括一个抽象父类(AbstractBootstrap)和两个具体的子类(Bootstrap、ServerBootstrap)。从类名可以看...

2018-04-02 01:31:45 564

原创 Netty框架学习之路(五)—— EventLoop及事件循环机制

在前面的博文中,我们大致分析了解了Channel及其相关概念。在Netty的线程模型中,每个channel都有唯一的一个eventLoop与之相绑定,那么在这篇博文中我们来看一下EvenLoop及其相关概念。在传统的Java NIO编程中,我们经常使用到如下代码: public static void main(String[] args) { try { ...

2018-03-30 00:22:48 8031 2

原创 重学设计模式(七)—— 责任链模式

笔者最近在研究SpringMVC的请求处理过程,发现请求拦截器的处理过程就是责任链模式的很好体现,一环扣一环,异常就退出,无需后继处理。 责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动...

2018-03-27 00:48:22 205

原创 SpringMVC请求处理过程浅析

上图完整描绘了SpringMVC的请求处理过程,可以看到,此过程都是以DispatcherServlet为中轴线进行的,而具体的处理逻辑在DispatcherServlet的doDispatch方法中,protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exce...

2018-03-27 00:12:20 294

原创 重学设计模式(六)—— 观察者模式

前言生活中我们经常使用手机订阅功能,用来订阅一些我们感兴趣的东西,比如体育赛况、股票行情等等。每当这些订阅的事务有重大变化发生时,我们都能收到相关通知信息,当然我们也能对失去兴趣的事情取消订阅,这样我们便不会收到相关推送了。这就是Observer观察者模式的一种典型应用场景。Observer观察者模式在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自...

2018-03-25 16:44:10 180

原创 重学设计模式(五)—— 装饰器、适配器、门面和代理

Decorator装饰器模式装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。java IO 流是装饰模式一个典型的应用场景。举个生活中的例子,饮品店的饮料价格由原料(咖啡、茶……)价格和配料(糖、奶泡……)价格组成,我们是计算价格的呢?如果为每一种组合创建一个类,显然不现实。但是如果我们把每一种饮品...

2018-03-25 14:43:15 713

原创 SpringMVC启动过程浅析

ContextLoaderListener初始化ContextLoaderListener的作用就是启动web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener接口,当web容器启动时,会触发ServletContextListener的contextInitialized方法。public interface Se...

2018-03-25 01:47:32 2141

原创 Netty框架学习之路(四)—— Channel及相关概念

在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它负责同对端进行网络通信、注册和数据操作等功能。本文我们来详细地分析 Netty 中的 Channel以及跟Channel相关的其他概念,包括ChannelPipeline、ChannelHandlerContext、ChannelHandler等。Channel的抽象类AbstractChannel有一如下...

2018-03-22 23:43:05 30312

原创 重学设计模式(四)—— 原型模式

前言Prototype原型模式是一种创建型设计模式,它允许一个对象再创建另外一个可定制的对象。 Java Object中已经提供了一个Clone( )方法,但是要实现原型模式,必须实现Cloneable接口,使用Cloneable接口都不用导入包。克隆一个对象有两种方式:浅克隆:copy该对象,然后保留该对象原有的引用。也就是说不克隆该对象的属性。深克隆:copy该对象,并且...

2018-03-17 21:17:09 132

原创 Netty框架学习之路(三)—— 初识Netty线程模型

前言笔者认为单独讨论Netty的线程模型太抽象,如果能在现实生活中找到一样事物作为类比,那肯定能帮助我们提升对Netty的认识。笔者曾经利用大学毕业和入职报到的空窗期去餐厅打工体验生活,感想此处不表。餐厅里面有一个司空见惯的现象,一般服务员的数量都会少于餐桌的数量,也就是说,在用餐高峰时期,一个服务员在同一时刻可能会招待不止一桌的客人,这是怎么做到的呢?Netty线程模型首先,...

2018-03-14 23:23:38 1010 1

原创 重学设计模式(三)—— 构造器模式

在实际开发过程中,我们一般通过构造方法将参数传入一般的实体类,而且实体类的构造方法可能不止一个,当参数个数过多时,伴随而来的是构造方法数量的上升,过多的构造方法参数往往给用户带来一种不明就里的感觉。构造器模式的出现很好的解决了多参数初始化的问题。假设我们需要编写一个Student类,此类含有四个属性,代码如下:public class Student { private Strin...

2018-03-14 00:20:43 175

原创 Netty框架学习之路(二)—— 一个简单的Netty程序

前言上一篇博文中主要介绍了三种IO模式,Netty是一个高性能、异步事件驱动的Java NIO框架,本文以一个简单的Netty程序带领大家先来领略一下Netty的风采,程序的功能主要是获取当前的服务器时间。客户端TimeClient.javapublic class TimeClient { public void connect(int port, String...

2018-03-13 23:39:46 1050 2

原创 重学设计模式(二)—— 单例模式

单例模式,顾名思义,就是确保一个类只有一个实例,并提供一个全局访问点。public class BasicSingleton { private static BasicSingleton instance; private BasicSingleton(){} public static BasicSingleton getInstance(){ ...

2018-03-09 01:05:37 175

原创 重学设计模式(一)—— 简单工厂、工厂方法、抽象工厂

前言谈起模式一词,很多情况下笔者都认为是一个偏向贬义的词汇,代表着冥顽不灵,一成不变。细数这些年开发过程中走过的弯路后,笔者觉得设计模式真是个好东西。时代发展如此之快,我们不可能设计出一个完美的系统,但是我们可以参考一些过去的经验,少走弯路,在系统的健壮性、可扩展性上多做思考,这绝对有益于我们的系统。为此,笔者抽时间重新学习了一下设计模式,此系列文章算是学习心得吧。简单工厂简单工厂模式...

2018-03-08 23:44:51 198

原创 如何编写一份优雅的Spring配置文件

前言众所周知,Spring最大的特点就是控制反转,而实现控制反转就是通过那一系列的配置文件。平时笔者在开发过程中也写过不少XML配置文件,但大部分都是基于现有的配置文件稍作修改,很多标签内容只能做到“知其然却不知其所以然”,而有很多标签根本不知其然,所以便抽时间认真学习一下相关内容,希望能够编写一份优雅的Spring配置文件。声明随便打开一份Spring工程的配置文件,第一行基本上...

2018-03-07 23:42:35 5689 1

原创 Netty框架学习之路(一)—— Java网络IO模型

前言《Unix网络编程:卷1》中介绍了5中IO模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则。这5中I/O模型分别是:阻塞式IO非阻塞式IOI/O复用信号驱动式IO异步IO 按POSIX标准来分,IO分为同步和异步,上面的前4钟都属于同步IO。在Unix系统中,操作系统的IO操作是一个系统调用recvfrom(),即一个系统调用recvfrom包...

2018-03-03 23:27:55 2548 2

原创 Java内部类学习

前言由于Java语言不支持多继承,而在实际开发中可能会面临多重继承的场景的,内部类便可派上用场了。内部类java内部类分为: 成员内部类、静态内部类、方法内部类、匿名内部类 。成员内部类顾名思义,成员内部类作为类的成员,存在于某个类的内部。成员内部类可以调用外部类的所有成员,但只有在创建了外部类的对象后,才能调用外部的成员。public class OutClass...

2018-02-27 22:55:46 157

原创 重学多线程(六)—— 原子操作类

前言对于i++这种线程不安全的操作,我们一般使用synchronized关键字来解决此类问题,JDK1.5开始提供了Atomic包,这个包中的原子操作类提供了一种快速高效同时又线程安全的更新变量的方式。基本类型在JDK1.6中,Atomic包里一共有12个类,具体如下图所示: 这些原子操作类按照类型可以分为:原子更新基本类型原子更新数组原子更新引用原子更新字段...

2018-02-22 16:38:19 198

空空如也

空空如也

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

TA关注的人

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