自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rootlh的博客

普通开发者如果习惯于在架构师封装好的东西之上,只专注于做业务开发,那久而久之,在技术理解和成长上就会变得迟钝甚至麻木。

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

原创 使用Swagger生成开发文档和前端交互

1.Swagger是什么?官方说法:Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。个人觉得,swagger的一个最大的优点是能实时同步api与文档。在项目开发过程中,发生过多次:修改代码但是没有更新文档,前端还

2017-12-20 16:14:12 9364 1

转载 spring boot RESTFul API拦截 以及Filter和interceptor 、Aspect区别

今天学习一下RESTFul api拦截,大概有三种方式一、通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求。在springboot中一般有两种配置方式。这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用哪一个方法处理。(1)第一种直接写类实现这个接口。代码如下这个要使用Component注解,当你你请求服务器的时候他会对每一个请求进行处理。impo

2017-12-17 20:15:26 3029 1

原创 使用@Valid注解规范用户请求的参数

一、业务场景对于一个用户的注册操作(Post请求),往往涉及到账号(username)、密码(password)的Post提交://用户发送POST请求创建新的用户@PostMappingpublic User create(@RequestBody User user){ /** 一些数据持久化操作,如:写入数据库 **/ //打印用户提交的信息 S

2017-12-17 15:44:25 6128

原创 使用Spring的Pageable来实现分页查询

1.导入包:import org.springframework.data.domain.Pageable;2.测试类:@Test public void whenQuerySeccess() throws Exception{ mockMvc.perform( get("/user") //分页

2017-12-16 22:39:24 40166 5

原创 使用MockMvc进行Spring的单元测试

一、以往controller层的单元测试(只能使用浏览器测试)弊端:1.对于所有请求,无论是否成功,都返回200的状态码。2.无法测试post、put、delete请求,只能测试get请求。二、使用MockMvc进行单元测试好处: 1.对于不同请求类型返回不同状态码 2.可以测试Restful的各种请求(get、post、put、delete等)用法:1.引入依赖<!-- spring

2017-12-16 22:35:34 1473

原创 SpringMVC开发技巧--使用@JsonView注解

一、我们常常遇到这样的业务场景:当我们使用SpringMVC做controller进行查询信息,以Json的数据格式返回前端时,Json数据中常常涉及到一些用户名密码的查询,但出于安全性的考虑,我们可能不需要将用户对象User的所有信息(例如:密码)返回给前端。当我们使用@RestController注解时,返回的User对象则被自动转成了对应的Json数组传输给前端,我们无法将其密码等不必要的Js

2017-12-16 22:21:19 2351 2

原创 Restful API规范

1. 普通的HTTP请求可能使用json来表示请求是否成功(永远返回200状态码) {    STATUS:1 /* 1:请求成功 2:请求失败 */}2. Restful API使用HTTP的状态码来表示请求是否成功

2017-12-14 23:16:05 187

转载 SQL注入

0X01 什么是SQL•结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。0X02 MYSQL简介•MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样

2017-11-11 12:39:34 302

原创 Java IO----磁盘IO工作机制

Java虚拟机中,读取/写入文件的IO操作需要调用系统接口。读:read()写:write()一、标准访问文件方式应用程序调用系统接口read,操作系统系统检查内核高速缓存是否有需要数据,有缓存则直接读取,没有则从磁盘读取。读取操作同上。二、直接IO方式不需要做高速缓存,直接

2017-11-10 09:23:14 1984 2

转载 理解Python中的装饰器

文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码:@makebold@makeitalicdef say(): return "Hello"打印出如下的输出:Hello你会怎么做?最后给出的答案是:def makebold(fn): def wrapped():

2017-11-02 20:23:01 196

转载 Spring5源码解析-Spring中的Context loader

原文:https://zhuanlan.zhihu.com/p/29375083Spring5源码解析-Spring中的Context loader我们已经知道,应用程序上下文是Spring管理的bean所在的容器。但是我们依然要问一个问题:这个上下文是如何创建的?那么在这篇文章中我们来探讨这个问题。在第一部分中,会说下在Spring的应用程序上下文中所谓的

2017-10-07 19:03:08 804

原创 MySQL优化实例(详细)

一、打开MySQL,输入show status命令查看数据库状态 主要查看当前连接数、当前运行的线程数、总共进行的查询数。二、使用数据统计工具awk(Linux系统)1awk '{printf("%s\n",$0)}' a.txt   //按行打印文件a.txt2    正则表达式+处理方式+文件名3    4mysqladmin -ur

2017-10-06 21:55:26 1542

转载 RESTful API设计规范

原文:https://muyinchen.github.io/2016/12/13/%E8%B7%9F%E7%9D%80%20Github%20%E5%AD%A6%E4%B9%A0%20Restful%20HTTP%20API%20%E8%AE%BE%E8%AE%A1/如何更好的设计RESTful API当您的数据模型已开始稳定,您可以为您的网络应用程序创建公共API。

2017-10-04 14:57:50 1305 1

原创 JDBC数据库连接池实现原理(手动实现)

一、普通的数据库连接    如下图所示,个用户获取数据库数据都要单独建立一个jdbc连接,当用户获取数据完成后再将连接释放,可见对cpu的资源消耗很大。 二、建立数据库连接池    数据库连接池创建后,每次获取数据库数据不需要另外建立连接,而是从连接池里拿出连接进行数据交互 三、手动实现连接池核心:使用线程安全

2017-10-02 11:56:07 6162 1

原创 MySQL主从复制

1.从linux到linux的主从复制:http://369369.blog.51cto.com/319630/790921/2.从windows(主)到linux(从)的主从复制:mysql主从配置,是在如下环境测试的:  主数据库所在的操作系统:win10  主数据库的版本:5.0  主数据库的ip地址:192.168.1.111

2017-10-01 12:40:38 193

原创 常见IO模型

一、常见IO模型:(1)同步阻塞IO:服务端阻塞等待客户端发送请求(2)同步非阻塞IO:服务端采用轮询的方式处理客户端请求(3)多路复用IO:Reator设计模式(Java中的selector和epoll)(4)异步IO:Proactor设计模式二、同步和异步的区别(用户线程和CPU交互方式):(1)同步(调用者主动等待调用结果):用户发起IO请求后要等待或轮询CP

2017-09-30 19:26:43 684

转载 【转载】为什么说Java匿名内部类是残缺的闭包

前言我们先来看一道很简单的小题:public class AnonymousDemo1{ public static void main(String args[]) { new AnonymousDemo1().play(); } private void play() { Dog dog = new D

2017-09-25 14:06:40 221

原创 JDK7与JDK8中HashMap的区别

关于JDK7中的HashMap源码分析可移步:http://blog.csdn.net/qq_17305249/article/details/76877193        总的来说,JDK7中的hashMap底层采用了数组+链表的数据结构实现数据存储,随着存储数据量的增大,Hash碰撞会越来越频繁。也就意味着链表会越来越长,查找效率不断降低。        JDK8的出现解决了

2017-09-22 23:03:50 2991

原创 Java线程池ThreadPoolExecutor的execute()原理

从线程提交任务的submit方法说起        众所周知,Java的线程池底层是使用工作队列+阻塞队列来实现的。当工作队列(workQueue)任务数大于线程池的最大线程数时,任务阻塞,被放入一个阻塞队列(blockingQueue)中。        那么,在任务提交到线程开始工作这段时间里发生了什么呢?        下面是submit方法的源码,对Runn

2017-09-22 22:46:10 1018

原创 Java线程池及其底层源码实现分析

相关类:ExecutorsExecutorServiceCallableThreadPoolFuture接口:ExecutorExecutor接口的使用:1public class TestExecutor implements Executor{2    @Override3    public void

2017-09-05 19:53:20 2059

原创 运用ForkJoin多线程框架实现归并排序

一、普通归并排序1public class MergeSort {23    /**4     * 原地归并排序(每次只将数组分为大和小两部分,并不是完全排序完成。需要递归)5     *6     * @param arr7     * @param lo8     * @param mid9     * @param hi10     */11    public void m

2017-09-05 16:51:03 2297 1

原创 JVM调优总结(含tomcat调优配置)

JVM参数    -     标准参数(所有jvm都支持)    -X  非标准参数(不同jvm不同)-    XX 不稳定参数(下一版本可能取消)JVM中的垃圾收集器    Serial Collector单线程串行执行GC(效率高,但吞吐量小)    Parallel Collector多线程并行GC(默认,效率高,吞吐量

2017-09-04 23:00:13 594

原创 关于JVM对象分配的小实验

首先来看看JVM虚拟机对于对象的空间分配有哪几种方式:栈上分配(JVM默认开启栈上优化)线程私有、小对象(方法结束栈清空不需要垃圾收集)无逃逸(方法结束,对象消失。如果仍然有其它对象持有它的引用,说明逃逸了(作用域逃出了方法))1-XX:+UseTLAB2-XX:+DoEscapeAnalysis   //使用逃逸分析---可以在栈上分配对象(不使用

2017-09-04 20:42:38 358

原创 Java常用并发容器(concurrent包)

各种并发容器:Map    HashTable    HashMap ( Collections.synchronizedMap(Map map) )    ConcurrentHashMap    ConcurrentSkipListMapList    CopyOnWriteList    性能比较:需求:

2017-09-03 00:11:22 315

原创 (新思路)生产者消费者模型2(BlockingQueue的无锁解决方法)

通过阻塞队列来模拟生产者消费者模型,和synchronized(wait和notifyAll)、lock(condition)方法相比,效率更高,因为不需要人为加锁。LinkedBlockingQueue的实现方式(无界队列,可以装到内存满为止)1public class testLinkedBlockingQueue{2    //初始化阻塞队列容器(放产品)

2017-09-02 23:53:50 712

原创 买票系统模拟Java高并发(ConcurrentQueue的解决方案)

需求:对于买票系统,容器中放入1000张票,开启10个线程抢票。(1)很容易想到用加锁的办法解决线程并发问题下面使用synchronized关键字解决1public class SellTicket{2    static ListString> tickets = new LinkedListString>();//1.初始化票容器3    4

2017-09-02 22:14:51 4892

原创 (新思路)生产者消费者模型(condition的解决方法)

需求:一个固定容量的同步容器,拥有put和get方法,还有getCount方法能够支持两个生产者和10个消费者线程的阻塞调用使用wait和notify/notifyAll实现方法一:wait和notify的方法思考:1.第8行和第21行为什么用while不用if?    生产者1和生产者2判断满了---》wait---》消费者消费

2017-09-01 23:33:57 325

转载 Fork and Join(Java并发编程的思路)

原文地址   作者:Julien Ponge 译者:iDestiny资源下载:Java SE 7Sample Code(Zip)如今,多核处理器在服务器,台式机及笔记本电脑上已经很普遍了,同时也被应用在更小的设备上,比如智能手机和平板电脑。这就开启了并发编程新的潜力,因为多个线程可以在多个内核上并发执行。在应用中要实现最大性能的一个重要技术手段是将密集的任务分隔成多

2017-09-01 00:12:59 369

转载 【转载】MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析

我们以往使用ibatis或者mybatis 都是以这种方式调用XML当中定义的CRUD标签来执行SQL 比如这样 [xml] view plain copyxml version="1.0" encoding="UTF-8" ?>    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    

2017-08-30 10:06:58 334

原创 Jvm内部锁机制总结

一、线程安全和对象头Mark每个对象都有一个对象头标记Mark(32位)Mark描述对象hash、锁信息、垃圾回收标记、年龄二、锁的分类偏向锁:(只在单线程有效)--------- 偏心锁,锁会偏向让当前已经持有锁的线程持有--------- Mark中:标记为偏向,写入线程ID--------- 只要没有竞争,获得偏向锁的线程将

2017-08-28 11:09:33 1244

原创 Java NIO通信的实现

非阻塞网络IO通信:当客户端的通道(都注册在Selector中)准备就绪后,Selector才向服务端发送请求。服务端才分配线程执行请求(没准备好前服务端不会先分配线程阻塞等待客户端)。阻塞式和非阻塞式IO区别:        传统的 IO 流都是阻塞式的。当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此

2017-08-27 14:43:53 494

原创 Java NIO中的通道Channel

一、通道的概念:独立的处理器(专门用于IO操作) 1 * 一、用于源节点和目标节点的连接,负责缓冲区中数据的传输,不负责存储,需配合缓冲区进行操作。2 * 3 * 二、通道类:4 * java.nio.channel包下5 * FileChannel(文件IO)6 * SocketChannel(TCP的IO套接字)7 * ServerSocketChann

2017-08-27 14:42:29 202

原创 Java NIO中的缓冲区

1*数据类型(除boolean)2* ByteBuffer3* CharBuffer4* ShortBuffer5* IntBuffer6* LongBuffer7* FloatBuffer8* DoubleBuffer9*10* 二、存数据put取数据get11*12* 三、4个核心属性:13* capacity容量(缓冲区最大容量)、14* limit界限(缓冲区可以操作数据的大小)、15*

2017-08-27 14:41:04 413

原创 什么是NIO

None-Blocking IO---非阻塞IO,主要用于套接字等网络编程 JDK1.4功能特性:面向缓冲区基于通道更加高效的读写用于高并发读写 NIO传输数据(双向传输、面向缓冲区)通道:负责传输缓冲区:负责存储

2017-08-27 14:37:35 251

原创 Servlet总结

一、导入tomcat的servlet的jar包服务器不是运行在IDE中,而是运行在tomcat中,tomcat运行时,调用java的方法,实现响应客户端请求的功能。路径:webapp/项目名/WEB-INF/web.xml文件配置servlet的地址映射webapp/项目名/WEB-INF/lib 放项目的jar包webapp/项目名/WEB-INF/c

2017-08-27 09:38:55 184

原创 SQL范式优化和反范式优化

1、范式优化    主要满足第三范式(数据冗余、插入异常、删除异常、传递依赖)    什么是第三范式?数据表中不存在字段的传递依赖,也就不会产生数据冗余、插入异常、删除异常。    优化:拆分表(1拆3),一张具有传递依赖的表(商品,商品分类,分类描述),拆分成 商品表(主表),商品分类+分类描述表(依赖关系表),商品+商品分类表(关联关系表)。

2017-08-21 09:19:00 1119

原创 SQL优化、索引优化

一、发现哪些SQL语句有性能问题开启MySQL慢查询日志对SQL语句进行监控1   show variables like 'slow_query_log'; -- 查看是否开启慢查询日志2    set global slow_query_log = on; -- 开启慢查询日志3    set global log_queries_not_using_indexes

2017-08-21 09:16:14 298

原创 Java中的工厂模式

工厂模式的思想:工厂类自主生产产品,而不用其它类去new一个产品简单工厂:需求:构造一个交通工具工厂,可以自定义汽车、飞机及其交通工具跑起来的方式run方法思路:    抽象工厂类(父)-----具体工厂类(子)-----》生产具体产品总工厂抽象类:TransportToolFactory.java1public

2017-08-19 15:31:57 1002

原创 二叉树

为什么使用树:    数组增删数据太慢    链表查找数据太慢    树结合了数组和链表的优点根结点:    树最上面的节点为根结点。到其它任何节点只能有一条路径。父结点:    结点的上面一个结点。子结点:    结点的下面一个结点。二叉树每个节点最多只能有两个子结点(左结点,右结点)。叶子结点:    没有子结点的结点。

2017-08-16 21:37:09 201

原创 快速排序

递归思想:1.将数组划分成两个子数组2.两个子数组递归调用快排函数继续向下划分两个子数组。。。。划分子数组的原则:选取一个基准值A(一般选数组的第一个或最后一个元素),比A小的放左边,比A大的放右边。1//1.划分数组方

2017-08-16 21:36:02 122

log4j-1.2.17

log4j源码包!!需要请自取!!Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器。

2017-09-13

空空如也

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

TA关注的人

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