自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 SpringMVC中HTTP消息转换器

SpringMVC中HTTP消息转换器HttpMessageConverter,用于处理@RequestBody注解的传入参数转换和@ResponseBody标注的方法的返回对象转换。最常见的是JSON的转换处理,例如JSON字符串作为入参转为Controller中可直接处理的Java对象和控制器返回JSON格式字符串。HttpMessageConverter是泛型接口,声明如下: ...

2019-11-01 17:27:04 51

原创 MapStruct属性复制框架学习笔记

Java中DO,VO,DTO结构一样,但在意义上或者说功能上不一样,DO定义实体,VO定义视图层数据返回,DTO用于查询实体参数,通常进行转化可以自写setter/getter方法或者使用BeanUtils的属性复制方法(运行期利用反射),具体原理可以查看源码或者百度。MapStruct是同学推荐的一个开源工具,是在编译期生成对应的实体类来完成属性复制,使用方便,这里做个简单的笔记...

2019-08-17 13:27:24 387

原创 log4j2在SpringMVC中的使用

在看开源druid数据库连接池时,了解到druid不依赖log组件但会根据当前环境选择一种合适的log实现,默认顺序为log4j->log4j2->slf4j->common-log->jdkLogging,druid介绍了log4j2在springboot中的使用,发现确实很方便,在springmvc中简化了监听器的配置,接入也很方便,步骤如下: 1、...

2019-03-05 16:44:05 728

转载 InnoDB,5项最佳实践

一、关于count(*)知识点:MyISAM会直接存储总行数,InnoDB则不会,需要按行扫描。 潜台词是,对于select count(*) from t; 如果数据量大,MyISAM会瞬间返回,而InnoDB则会一行行扫描。 实践:数据量大的表,InnoDB不要轻易select count(*),性能消耗极大。常见坑:只有查询全表的总行数,MyISAM才会直接返回结果,当加了w...

2018-10-09 17:12:37 64

原创 SpringBoot整合Swagger问题整理

1、swagger版本与springboot版本本项目使用的是Swagger版本是2.7.0,该版本对应的spring版本是4.3.10,所使用的SpringBoot版本在1.5.6.RELEASE版本左右都是可以的。一般版本差距太大才会导致冲突。2、按步骤导入jar包,添加配置类后,启动时未报错,但访问http://localhost:8080/swagger-ui.html时页面显示空...

2018-09-11 17:45:56 2062

原创 分布式缓存(一)——认识缓存

    1、缓存:是存储在计算机上的一个原始数据复制集,以便于访问。缓存在不同的场景有着不同的意义,采用的技术手段也不一样。不涉及操作系统和硬件的缓存,根据在软件系统中所处位置的不同,缓存可分为:客户端缓存服务端缓存网络中的缓存    根据规模和部署方式缓存也可分为:单体缓存缓存集群分布式缓存    2、为什么使用缓存?    最主要的因素是用户体验。用户体验是主观的且注重实际应用,被使用者的状态...

2018-06-05 20:43:23 890

原创 二进制字节数组与十六进制字符串间的转换

       在加密算法中,经常会遇到将加密后得到的二进制字节数组转16进制字符串后返回;在解密算法中,则需要将字符串转二进制然后解密;下面将列举常用的几种转换方法,在文末会给出几种常用加解密算法示例。        1、二进制数组转十六进制 /** * 将二进制转成16进制,加密时用(方式之一) * * @param bytes 加密得到的二进制字节数组 ...

2018-05-24 22:08:31 4600

原创 DispatcherServlet理解

    DispatcherServlet是前端控制器设计模式的实现,主要用来拦截请求并进行职责的分派,从前端请求发起到返回执行了一系列的调度处理,主要处理过程如下:    (1)捕获请求,通过web.xml中配置url-pattern拦截指定请求    (2)通过HandlerMapping获取适当的Handler即Controller执行并返回    (3)若配置有拦截器,则会在handler...

2018-05-22 20:02:53 265

原创 Spring事务配置——图解说明

Spring事务配置可以总结为下图:图片地址:https://www.processon.com/view/5af992d6e4b05352c2baf19a

2018-05-14 22:10:50 459 1

原创 java并发编程读书摘要

一、基础概念了解    1、上下文切换:CPU通过时间片来循环执行任务,时间片用完会切换到下一个线程,但是会保存当前状态,任务从保存到再加载的过程就是一次上下文切换。    2、减少上下文切换的方式:      无锁并发编程:避免竞争锁造成的上下文切换      CAS算法:Compare and Swap,核心方法compareAndSetInt      使用最少线程:避免创建不必要的线程  ...

2018-04-28 15:31:32 92

原创 线程池监控——自定义线程池

    如果在系统中大量使用线程池,则有必要对线程池进行监控,方便在出现问题时,可以根据线程池的使用状态快速定位问题。可以根据线程池提供的参数进行监控,常用属性如下:    taskCount:线程池需要执行的任务数量    completedTaskCount:已完成的任务数量    largestPoolSize:线程池曾经创建过的最大线程数量,可以推测出是否达到corePoolSize和Ma...

2018-04-27 18:50:10 1159

原创 实战java高并发程序设计读书概要整理

一、要了解的基本概念    1、同步和异步:形容一次方法调用,同步要等待返回继续执行;异步调用不需等待返回就可以继续执行    2、并行和并发:多个任务一起执行,并行是同时执行;并发是交替执行也可能是串行执行    3、临界区:用来表示一种公共资源或共享数据,每次只能一个线程访问    4、阻塞和非阻塞:形容多线程之间的相互影响,阻塞是因为某个线程抢占了资源而导致其他线程被挂起,非阻塞则表示线程之...

2018-04-19 14:54:46 133

原创 无锁算法-CAS

    要实现无锁(lock-free)的非阻塞算法有多种实现方法,其中CAS(Compare and Swap)是一种有名的无锁算法。        CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,是用乐观锁技术实现的一种无锁(lock-free)算法。当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的...

2018-04-19 14:43:33 876

原创 List排除、去重与equals和hashCode方法重写

目前,对于List集合去子集和去重经测试对应两种不同的实现,去子集是直接采用集合类提供的RemoveAll()方法;去重是采用HashSet作为中介处理。首先看一下两种方式的实现:1、RemoveAll(Collection c)使用list.removeAll(list1);通过查看该方法源码可以知道,会先遍历list1然后判断list中是否包含该对象,继续查看contains方法,会发

2018-01-08 16:30:03 2340

原创 《Learning Redis》学习笔记二:服务器功能

Redis除了提供key-value存储还提供了以结构化方式存储数据的语义,能够以同样的语义在程序中例如map/list等中存储信息。以下主要探讨redis的提供的一些功能,这些功能使得redis相对于数据存储更像是框架构建:1、Real time message(实时消息)Redis虽然不存储信息,但是支持消息的实时发送和接收,多个消息是以消息队列按顺序发送的。redis提供了publi

2017-12-15 15:45:33 172

原创 《Learning Redis》学习笔记一:基础介绍

Redis是面向key-value存储速度最快的NoSql数据库之一,既可基于内存也可持久化。作为key-value数据存储,在一些非功能性需求中主要有以下特点:1、数据集插入快,无异常2、随机读:所有keys放内存因此读取速度非常快,Redis使用虚拟内存将keys存内存,将最小最近使用的values放磁盘来避免内存消耗3、容错性和负载均衡:采用主从拓扑结构,master-slave

2017-12-15 11:56:24 238

原创 SpringBoot+MockMvc测试Controller笔记整理

基础框架:Springboot(版本信息:1.5.6.RELEASE)环境信息:JDK1.8测试jar包:spring-boot-starter-test之前在其它项目见过使用Mock进行单元测试,SpringMvc环境下可以直接模拟请求进来Controller的测试,相比常用的Sping Junit和Spring TestNG等也有一定的可借鉴之处,本篇结合相关资料进行Mock测

2017-11-15 15:42:18 5386 3

原创 SSM框架整合Junit测试

基础框架为spring+springMVC+mybaties,spring版本4+,junit版本4+,接下来介绍junit接入步骤:1、核心jar包引入:实际操作过程中出现很多类找不到异常报错,是因为有依赖的jar包未引入或是版本太低 junit junit 4.12

2017-09-06 15:24:05 6118 2

原创 SSM框架引入logback日志框架

1、本章主要结合实例描述如何在SpringMVC框架中引入logback日志框架,关于常见的几种日志框架的介绍和性能对比大家可以自行去了解。2、整合logback:2.1、jar包引入,logback-ext-spring为spring支持jar ch.qos.logback logback-classic 1.1

2017-09-01 17:31:32 5779

转载 Oracle索引总结(转载)

原文地址:Oracle索引总结oracle索引总结简介1.说明  1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。  2)索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫

2017-08-24 16:32:31 176

原创 maven-mybaties-generator学习笔记整理

MGB可以反向生成对应数据表的实体bean、mapper接口类以及对应的sqlmap.xml,关于该插件的详细介绍可以参考官方介绍。接下来整理一下使用maven管理的SSM框架中如何使用mybaties-generator插件:1、pom中引入插件 org.mybatis.generator mybatis-gene

2017-08-24 14:55:52 174

转载 Spring事务管理(详解+实例)

原文转载自:Spring事务管理(详解+实例)原文参考的文章:Spring事务机制详解Spring事务配置的五种方式Spring中的事务管理实例详解1 初步理解在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。 事务有四个特性:ACID原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务

2017-08-16 15:31:09 162

原创 Failed to replace env in config: ${APPDATA}

安装node.js之后,执行npm命令时报错Failed to replace env in config: ${APPDATA} 的一种解决办法,有其它解决方式也可推荐

2017-08-10 15:50:40 1973

转载 Spring事务管理——使用XML配置声明式事务

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka一、事务介绍事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用。事务的四个关键属性(ACID)① 原子性(atomi

2017-08-02 10:23:46 778

原创 proxy-target-class之坑

SSM框架配置实物时,会开始事务注解,如下所示:        proxy-target-class属性值默认是false,该属性值决定是基于接口类还是基于实现类的代理被创建。如果proxy-target-class 属性值被设置为true,那么基于实现类的代理将起作用(这时需要cglib库)。如果proxy-target-class属值被设置为false或者这个属性被省略,那

2017-08-01 18:53:48 803

原创 读写分离——读写锁ReadWriteLock

读写锁顾名思义分离读操作和写操作,可以有效的减少锁竞争以提高系统的性能。读写锁提升性能的地方主要在读读操作(读操作不会改变数据的一致性和完整性),而读写、写写、写读操作之间则会互斥造成阻塞。因此,读写锁应用场景适用于读操作次数大于写操作次数,读操作次数远大于写操作次数时,系统性能提升最明显。ReadWriteLock接口定义了获取读锁和写锁两个方法,接下来对比串行的重入锁,来测试读写锁性能:

2017-07-12 10:09:18 919

原创 重入锁与同步关键字sychronized

重入锁采用ReentrantLock 实现,和同步关键字sychronized都可以用来在多线程环境下保护临界区资源,确保安全性。重入锁相比sychronized有着显示的操作过程,需要手动控制何时加锁和解锁(如不解锁则会造成死锁),之所以称为重入锁,是因为锁是可以反复进入的,即同一个线程可以连续多次获得锁而不会造成死锁,相应的解锁也需要多次,否则会造成其它线程因为获取不到锁而无法访问临界区资源。

2017-07-05 16:15:49 688

转载 最全面的Spring学习笔记(转)

Spring致力于提供一种方法管理你的业务对象。在大量Java EE的应用中,随处可见Spring。今天我将简单的介绍一下Spring这个框架。本文适合读者:想学Spring的Java开发者刚用Spring不久的人Why为什么要使用Spring?Spring主要两个有功能为我们的业务对象管理提供了非常便捷的方法:DI(Dependency

2017-06-30 14:10:36 244

转载 分布式系统可用性与一致性

可用性(Availability)和一致性(Consistency)是分布式系统的基本问题,先有著名的CAP理论定义过分布式环境下二者不可兼得的关系,又有神秘的Paxos协议号称是史上最简单的分布式系统一致性算法并获得图灵奖,再有开源产品ZooKeeper实现的ZAB协议号称超越Paxos,它们之间究竟有什么联系?分布式系统的挑战         一致性可理解为所有节点都能访问到最

2017-06-23 09:55:27 5551

转载 系统吞吐量(TPS)、用户并发量、性能测试概念和公式

文章出处:http://www.ha97.com/5095.htmlPS:下面是性能测试的主要概念和计算公式,记录下:一.系统吞度量要素:一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联单个request对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低系统吞吐量几个重要参数:QPS(TPS)、并发数、响

2017-06-21 16:04:11 600

原创 MyBatis别名和settings设置

别名(typeAliases)是一个指代的名称,在类的限定名过长时可以指定别名来简化使用,MyBatis里分为系统定义别名和自定义别名两种,系统定义别名是不需要我们再去指定的,通过TypeAliasRegistry类注册。MyBatis中别名不区分大小写,一个typeAliases的实例是在解析配置文件时生成的,然后长期保存在Configuration对象中。接下来配置别名:1、在MyBa

2017-06-21 14:25:16 3818

原创 线程池创建

一、简单来说使用线程池有三个好处:1、降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2、提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行。3、提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。二、线程池的实现原理当一个新任务提交到线程池时,简单来说线程池的处理流程如下:...

2017-06-20 13:57:13 10864

原创 CountDownLatch demo

CountDownLatch 同步辅助计时类,主要包含:一个带计时参数的构造函数:CountDownLatch(int count);计数减1方法:void countDown();阻塞当前线程直到所有线程完成即计数器值为0:await() 或 await(long timeout, TimeUnit unit) 使用带参方法时,当计数器值为0或者耗时完时结束示例:5个员工完成工作

2017-06-15 16:55:08 260

原创 SpringBoot junit单元测试

SpringBoot + MyBatis + SpringJunit4 进行单元测试

2017-06-13 16:21:30 4505

原创 Java反射机制与动态代理

反射机制:动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制。在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。动态代理:为其它对象提供一种代理以控制对这个对象的访问,即访问者——代理对象——真实对象如下示例是通过反射技术创建Hel

2017-06-12 14:23:35 176

原创 IntelliJ IDEA实用插件

IntelliJ IDEA 提供了强大的插件库,下面结合实际项目所用插件推荐几个比较有用的插件,插件的安装和查看已安装的插件在这里就不再概述了,一般安装成功之后重启即失效。如有其它比较好用的插件,欢迎推荐补充。1、FindBugs-IDEA:代码分析工具,可发现代码中潜在BUG和不规范之处,有利于提高代码质量。右键即可选择要扫描的范围,可在FindBugs-IDEA控制台查看扫描结果并根据co...

2017-06-09 15:11:23 5616

原创 GIT学习笔记--提交代码到远程仓库

GIT是目前较为流程的免费开源版本控制工具,提供了强大的项目代码管理控制,本篇结合个人初学体验,作为GIT的入门学习总结

2017-06-08 10:18:32 8795

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