自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Java知识体系

Java知识体系: 1、JDK 第一级别:精读源码 该级别包含的包如下: java.io java.lang java.util 第二级别:深刻理解 该级别包含的包如下: java.lang.reflect java.net javax.net.* java.nio.* java.util.concurrent.* 第三级别:会用即可 该级别包含的包如下: java...

2018-03-02 21:52:34 496

原创 【Redis学习】Redis分布式锁实现秒杀业务(乐观锁、悲观锁)

1、业务场景所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源,这里的资源在大部分秒杀场景里是商品;将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确。2、一些可能的实现刚才提到过,实现秒杀的关键点是控制线程对资源的争抢,根据基本的线程知识,可以不加思索的想到下面的一些方法: 1)、秒杀在技术层面的抽象应该就

2020-05-13 16:50:37 5891

原创 Java注解

java注解是Java提供的一种原程序中的元素关联任何信息和任何元数据的途径和方法。Java中常见的注解1、jdk自带注解Java SE5内置了三种标准注解:@Override:表示当前的方法定义将要覆盖超类中的方法;@Deprecated:表示该方法已经过时了。当方法或类上有该注解时,说明该方法或类都已经过期不能再用,但不影响以前的项目使用,提醒你使用心得替代方法或类。如果程序员不小心...

2019-06-05 20:30:48 523

原创 SpringMVC配置类WebMvcConfigurerAdapter学习总结

WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用javabean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置。因此,在springboot提倡的基于注解的配置 && 采用约定大于配置的风格下,当需要进行自定义配置的时候,便可以继承WebMvcConfigurerAdapter这个抽象类,通过javabean来实现需要...

2019-06-05 18:54:02 584

原创 Springboot对web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况。Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。默认情况下,Spring Boot为两种情况提供了不同的响应方式1、当浏览器发送请求头是Accept: text/html;Spring Boot默认会响应一个html文档内容,称作...

2019-06-05 18:40:18 215

原创 使用fastjson提供的接口实现自定义的编解码器

FastJson中文 API在项目开发中经常会遇到一些业务需要对某些数据进行特殊的定制化处理,fastjson为我们提供了接口可以用于实现自定义的编解码器来完成我们的业务要求。ObjectSerializer和ObjectDeserializer分别是fastjson的编码器和解码器接口。ObjectDeserializer接口源码:/** * <p>Interface re...

2019-05-29 19:25:08 1463

原创 使用HttpMessageConverter实现HTTP的序列化和反序列化

对象的序列化/反序列化大家应该都比较熟悉:序列化就是将object转化为可以传输的二进制,反序列化就是将二进制转化为程序内部的对象。序列化/反序列化主要体现在程序I/O这个过程中,包括网络I/O和磁盘I/O。那么什么是http序列化和反序列化呢?在使用springmvc/SpringBoot时,我们经常会这样写:@RequestMapping("/test")@ResponseBodypu...

2019-05-29 19:14:41 1045

原创 自定义Redis序列化工具

为什么用户需要自己创建一个redis配置类?SpringBoot提供了对Redis的自动配置功能,在RedisAutoConfiguration类中默认为我们配置了客户端连接(Lettuce和Jedis),以及数据操作模板(StringRedisTemplate和RedisTemplate),下列代码有一个@ConditionalOnMissingBean和@Bean的注解,@Condition...

2019-05-28 13:53:01 1180

原创 在springboot中使用springsecurity实现安全控制

我们在编写web应用时经常要对一些页面做安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制方法的多种多样,可以通过AOP、拦截器实现,也可以通过框架实现(如:Apache shiro、spring security)。本文主要学习一下在springboot中使用springsecurity实现安全控制。定义控制层controller:@Controllerpubli...

2019-05-21 20:16:03 1167

原创 如何在项目启动时就执行某些操作

参考资料:如何在项目启动时就执行某些操作在实际的项目开发中经常会遇到一些需要在项目启动的时候进行初始化操作的需求,比如初始化线程池,配置某些对象的序列化和反序列化方式,加载黑名单白名单,加载权限应用,加载组织架构到缓存等等。这篇文章就来总结一下如何在项目初始化时进行一些资源操作。方法一:@PostConstruct方法//将黑名单从数据库中查询出来,并放到缓存中@Service("phon...

2019-05-21 19:49:17 318

原创 自定义类型处理器的应用

问题描述:一个JSON字符串在转对象的时候报JSON解析异常的错误,我仔细看了一下错误堆栈,是枚举导致的数组越界问题。[ { "fee":0, "amount":15, "orderNo":"9136104331757999", "storeId":0, "bankCode":"", "b...

2019-05-20 19:34:42 322

原创 由防重复点击引发的幂等性问题思考

HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品使用约支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多...

2019-05-20 19:16:12 1050

原创 MyBatis自定义类型处理器 TypeHandler

在项目开发中经常会遇到一个问题:当我们在javabean中自定义了枚举类型或者其它某个类型,但是在数据库中存储时往往需要转换成数据库对应的类型,并且在从数据库中取出来时也需要将数据库类型转换为javabean中的对应类型。比如:javabean中字段类型为Date,数据库中存储的是varchar类型;javabean中字段类型是Enum,数据库中存储的是String或者Integer。因为有大...

2019-05-20 18:52:38 10205

转载 jdk1.8新特性(五)——Stream

转载自:https://mp.weixin.qq.com/s/adKZrOe6nFEmuADHijsAtA在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增、删、改、查、聚合、统计、过滤等操作。相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便捷。不过,这一问题在Java 8中得到了改善,Java 8 API添加了一个新的抽象称为流...

2019-03-14 19:29:48 343

原创 基于SLF4J MDC机制实现日志的链路追踪

request 的inputStream和response 的outputStream默认情况下是只能读一次, 不可重复读;这就导致要获取请求体或者响应体信息时必须要声明包裹类wrapper; spring为此提供了两个对应的包裹类ContentCachingRequestWrapper和ContentCachingResponseWrapper使得这两个流信息可重复读;可以利用这两个类结合sp...

2019-03-12 12:08:16 1176

原创 jdk1.8新特性(四)——Optional

在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行一些防御式的检查,所以在代码中常常可见if(obj != null) 这样的判断。JDK1.8为我们提供了一个Optional类,Optional类能让我们省掉繁琐的非空的判断。Optional中的方法汇总使用示例:package com.example.jdknewuse;...

2019-02-21 20:20:03 766

原创 Jdk1.8新特性(三)——方法引用::

Lambda表达式可以用来创建匿名方法,有时候使用lambda表达式仅仅是调用一个已存在的方法:Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));在java8中,可以直接通过方法引用的来简写lambda表达式中已经存在的方法:Arrays.sort(stringsArray,String::compareTo...

2019-02-21 19:51:27 1109

原创 Jdk1.8新特性(二)——lambda表达式(参数列表)->{}和函数式接口@FunctionalInterface

Jdk1.8新增lambda表达式是为了简化代码,主要用于简化匿名实现类,为其提供一种更加简洁的写法。Lambda表达式在swift语言中被称为代码块,lambda表达式可以认为是一种特殊的接口,是匿名实现类的简写,该接口必须只有一个抽象方法。作用:1)简化匿名实现类的书写,实现接口抽象方法;2)作为函数中的参数来传递;语法结构:(参数类型 参数名1,参数类型 参数名2,……参数类型 参...

2019-02-21 19:38:08 411

原创 Jdk1.8新特性(一) 接口的default方法

Jdk1.8之前的接口中通常只声明方法的签名,方法的具体实现在子类中进行。Jdk1.8打破了这样的用法:接口中可以实现具体的方法体,只需要加上关键字static或者default修饰即可。1)使用static来修饰的称之为静态方法,静态方法通过接口名来调用;2)使用default来修饰的称之为默认方法,默认方法通过对象实例来调用;静态方法和默认方法都有自己的方法体,用于提供一套默认的实现,这...

2019-02-21 19:24:13 959

原创 insert返回主键 — mybatis selectKey

日常项目开发中,经常会用到一个场景:在表中新增一条数据,需要得到该条数据的主键ID。如何不额外写一条查询语句来得到新增数据的主键ID呢?mybatis的selectKey实现了这个功能。mybatis的selectKey在不同数据库中的用法有点区别:oracle中的用法 <insert id="insertUser" parameterClass="XXX.user"> ...

2019-02-13 00:29:12 581

原创 当我谈跑步时我谈些什么——村上春树

1、痛楚难以避免,而磨难可以选择。2、心灵所受的伤,便是人为了某种自立性不得不支付给世界的代价。3、无论做什么事,一旦去做,我非得全力以赴不可,否则不得安心。4、“我们还安心,可以从头再来。”我对妻子说。她答道:“好。”5、年轻的时候姑且不论,人生中总有一个先后顺序,也就是如何安排时间和能量。到一定的年龄之前,如果不在心中制定好这样的规划,人生就会失去焦点,变的张弛失当。6、学校就是这样...

2019-02-12 22:42:08 430

原创 读段永平的博客有感

1、知道错的绝不做2、发现错的立即改,不管多大的代价都是最小的代价 。3、做对的事并把事情做对4、如何克服“因怕把事情做错而不敢做对的事情的恐惧?对对的事情有truly believe。5、做对的事情+把事情做对=复利ps:复利其实就是利滚利,即把上一期的本金和利息作 为下一期的本金来计算利息。6、得到你想要的,珍惜你已经得到的。(巴菲特:get what you want,want ...

2019-02-12 22:33:27 268

原创 Left join后用and和where的区别

Left join左连接,得到的是左表的所有数据拼接右表符合on条件的数据。on后用and连接,都作为on条件。on后用where连接,where作为筛选条件,则是匹配两个条件相同的结果集。on后用where连接,where作为筛选条件,则是匹配两个条件相同的结果集。如下图一,on后的and使用错误导致两个筛选条件没有生效。图二为正确查询:...

2018-12-18 22:03:06 1826

原创 消息推送的实现方式

最近再做一个在线签约系统,其中有一个需求是实现“消息推送”,接下来这段时间好好研究一下相关的技术实现。目前已知的实现消息推送以及消息队列有以下几种方式:1、基于 AJAX 的长轮询(long-polling)方式2、websocket3、RabbitMQ...

2018-10-18 22:44:07 961

原创 【SpringBoot】SpingBoot整合AOP

说起spring,我们知道其最核心的两个功能就是AOP(面向切面)和IOC(控制反转),这边文章来总结一下SpringBoot如何整合使用AOP。一、示例应用场景:对所有的web请求做切面来记录日志。1、pom中引入SpringBoot的web模块和使用AOP相关的依赖: 其中: cglib包是用来动态代理用的,基于类的代理; aspectjrt和aspectjweave...

2018-09-07 00:47:33 85991 23

原创 【SpringBoot】在SpringBoot中使用Ehcache

SpringBoot提供了对缓存的支持,通过在启动类中添加@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者: * Generic * JCache (JSR-107) * EhCache 2.x * Hazelcast * Infinispan * Redis * Guava ...

2018-09-04 23:14:53 3695

原创 【zTree】基于zTree动态生成树节点的一些应用

最近项目中需要用到zTree动态构建树节点,实现树节点的增删改查,以及点击树节点展示树节点对应的页面。趁着这个机会把zTree的用法大概看了一遍,代码示例见我的Github:基于zTree动态生成树节点的一些应用实现效果如下: 主界面: 树节点的搜索(根据节点名称模糊匹配子节点): ...

2018-08-30 00:55:25 862

原创 【java reflection】反射工具类总结

这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的。在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能的公共实现类,方便大家使用。在写实现类的过程中需要通过反射去调用实体类的一些方法,于是就回顾了反射的一些内容,顺便总结了一个反射的工具类。package com.example.util;/*...

2018-08-28 23:30:06 740

原创 【SpringBoot】在普通类中获取spring容器中的bean

这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的。在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能的公共实现类,方便大家使用。在写实现类的过程中学习了在普通类中获取spring容器中的bean的方法。如果我们需要在一个类中使用spring提供的bean对象,那么我们需要把这个bean注入到sp...

2018-08-28 23:23:45 8062 1

原创 【JDK源码】java.util.concurrent.atomic包常用类详解

  java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借...

2018-03-13 22:01:58 2752

原创 【存储过程】Merge Into语句实现Insert/Update在Oracle中的应用

  最近接到一个新的接口需求,开发一个保存数据的接口,需要完成如下功能:有一个表T,有两个字段a(主键),b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录。   在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下: if exists(select...

2018-03-12 19:06:12 1331

原创 【JDK源码】java.io包常用类详解

  看完java.io的JDK源码,在网上发现一篇关于java.io中的类使用的文章总结的很全面,看完之后在原文的基础上加了一些自己的总结如下构成了本篇文章。原文地址 一、Java Io流 1. Java Io流的概念   java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连...

2018-03-10 19:55:59 7518 4

转载 【抓包工具】Fiddler(详细介绍)

一、Fiddler与其他抓包工具的区别  1、Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大。模拟http请求的功能也不够,且firebug常常是需要“无刷新修改”,如果刷新了页面,所有的修改都不会保存;  2、Wireshark是通用的抓包工具,能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容,但如果是TCP...

2018-03-08 21:57:49 449

原创 【JDK源码】java.lang包常用类详解

  接下来的几天开始JDK源码的学习和总结,之前看《java编程思想》的时候看到java的基础知识有很多,其中支撑着这些基础的基础中的基础当属JDK。JDK的基础代码里面又分了很多基础的模块,今天从最基础的java.lang包开始学习。本次JDK源码学习系列以JDK1.7为准。   观察JDK的源码,可以看到,java.lang包下面最为基础和常用的几个部...

2018-03-08 00:49:10 2711

转载 【抓包工具】Wireshark(详细介绍与TCP三次握手数据分析)

  wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封包,可以截取各种网络封包,显示网络封包的详细信息,包括http,TCP,UDP,等网络协议包。注:wireshark只能查看封包,而不能修改封包的内容,或者发送封包。一、开始界面   开始界面,如图所示: 点击Caputre->Interfaces...

2018-03-05 22:56:31 363

转载 【抓包工具】HttpWatch(功能详细介绍)

  HttpWatch是功能强大的网页数据分析工具,集成在IE工具栏,主要功能有网页摘要、cookies管理、缓存管理、消息头发送/接收,字符查询、POST数据、目录管理功能和报告输出。HttpWatch是一款能够收集并显示深层信息的软件,它不用代理服务器或一些复杂的网络监控工具,能够在显示网页的同时显示网页请求和回应的日志信息,甚至可以显示浏览器缓存和IE之间的交换信息,集成...

2018-03-05 21:55:44 4851

原创 【REST && SOAP】REST和SOAP Web Service的区别比较

  今天遇到一个webservice协议的接口需求,在使用soupUI测试接口连通性的时候,发现使用soupUI新建一个SOAP项目的时候,WSDL链接总是报错打不开(厂家提供的接口规范上写的是SOAP协议),但是使用浏览器访问,可以看到WSDL文件,这就说明WSDL地址没有问题。后来我换了一种方式,新建了一个REST项目,链接正常打开。之前也遇到过类似的问题,也学习了一些...

2018-03-05 19:25:44 572

原创 【Findbugs】Findbugs使用指南

一、简介 Findbugs是一个静态分析工具,它检查类或者jar文件,将字节码与一组缺陷模式进行对比以发现可能的问题。利用这个工具可以在不实际运行程序的情况下对软件进行分析。可以帮助改进代码质量。Findbugs提供了方便操作的可视化界面,同时也可以作为eclipse的一个插件来使用,而我们是用的最多的还是作为eclipse插件来使用。二、使用方法 1、Findbugs的常用操作: ...

2018-03-03 16:00:12 13986

原创 java代码质量检查工具

Java代码质量检查工具及使用案例 在现在的软件开发中,由于软件的复杂度越来越高,业务也覆盖很广,各个业务模块业务错综复杂。这样就需要我们需要团队开发,在我们团队中开发人员的经验、代码风格样式都不一致,以及缺乏统一的标准,从而导致我们的整个项目的的代码难以阅读,不便于后期维护。这几天在研究代码质量管理,根据在网上搜集的资料及跟前辈学的一点经验整理一下,有需要的同学们可以查看,也便于以后自己回顾。...

2018-03-03 15:31:45 2073

原创 您的支持是作者写作最大的动力!

您的支持是作者写作最大的动力! 如果您喜欢这个博客,读后觉得收获很大…如果在你开发或学习过程中本博客帮助到了你…你可以对本博客小额赞助一下,让我有动力继续写出更高质量的文章。点击上面小额赞助即可呦! 赞助方式一:支付宝二维码付款! 您可以选择手机支付宝扫一扫 赞助方式二:微信二维码付款! 您可以选择手机微信扫一扫 ...

2018-03-02 21:16:24 256

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