java
lynnlovemin
李熠,中国石油规划总院高级开发工程师,对Java编码规范和编码技巧有着独特的见解,热衷微服务架构,曾作为中小型企业CTO,带领过超过30人的技术团队。
现专注于网络安全尤其是web渗透方向的研究,长期活跃于各大SRC平台,为其提供漏洞报告。
著有《Spring Cloud实战演练》一书
展开
-
Solr4.4.0部署到tomcat上
主要步骤如下:1、下载solr-4.4.0.tgz2、解压缩solr-4.4.0.tgz,命令tar -xzvf solr-4.4.0.tgz3、压缩后进入到solr-4.4.0目录,将 example/ webapps目录下的solr.war复制到tomcat的webapps目录中,4、启动tomcat服务器,这时候会报错,不用管它,war会自动解压缩5、在tomcat的原创 2013-09-27 17:22:04 · 5227 阅读 · 3 评论 -
POI实现一个通用的Excel读取模板
POI是Apache基金会的提供的java实现的一套用于读取Excel、Word、PPT等文档的库,在实际项目中可能 很多地方都会用到Excel的读取,比如Excel的导入,我们不可能每个地方都单独实现一套Excel的读取方法,这时候就需要封装一个通用的类,只要有读取Excel的地方就调用该方法就可以了,下面我们就来实现它。 首先,为了提高可扩展性,也为了方便扩展到譬如Word、PPT这类文原创 2017-03-20 09:56:23 · 4943 阅读 · 5 评论 -
解决Hibernate连接postgresql数据库慢的问题
博主最近写了一个大数据的项目,数据库采用的是greenplum,他是基于postgresql的,里面有几千张数据库表,每张表都有上亿的数据,在用Hibernat启动时连接postgresql的时候很慢,大概需要半小时的时间,这让博主怎么受的了,就 一步一步追踪代码,最后发现问题出在postgresql驱动的PgDatabaseMetaData类里面,他的源码是这样的:/* * Copyright原创 2017-03-22 10:18:44 · 4712 阅读 · 0 评论 -
SpringMVC集成RabbitMQ
RabbitMQ在集成到SpringMVC的过程中,可能会遇到很多坑,网上很多配置都有问题,要么无法发消息,要么无法接收消息,LZ特将能够使用的配置发出来,分享给大家。 首先添加Maven依赖: org.springframework.amqp spring-rabbit 1.3.6.RELEASE原创 2017-05-12 17:57:17 · 5325 阅读 · 0 评论 -
Netty实现客户端和服务端的通信
Netty是Apache团队的又一个优秀的Socket框架,它和mina是一个团队开发的,所以很多思想是相同的,接下来,我们就来实现客户端和服务端的双向通信。 首先,我们定义消息类型: /** * 消息类型 * @author 李熠 * */public enum MsgType { PING,SEND,LOGIN,NO_TARGET}分别是心跳、发送、原创 2017-05-23 09:31:28 · 11093 阅读 · 0 评论 -
Java实现的计算任意时间是星期几
利用蔡勒公式,通过Java代码实现,具体请看源码:目前公历日历400年一轮回,所以1600年和2000年的日期星期完全一致。/** * 计算任意时间是星期几 * 利用蔡勒公式 * 公式:(年份代码+月份代码+日期)mod 7 * @param year * @param month * @param day * @return */ public static i原创 2017-04-25 16:43:09 · 2908 阅读 · 2 评论 -
java开启多个线程,执行完成后再执行主线程
博主昨天去一家公司面试,被面试官问到一个问题,如果开启10个线程,但是需要这10个线程都执行完成后,再交由主线程统一输入,如何实现?当时我没有回答,我对多线程并不是那么的熟悉,面试结束后,我通过查阅资料找到了解决方案,下面我贴出代码: int count = 10; List<Thread> workers = new ArrayList<>(); for(in原创 2017-07-21 09:53:55 · 11292 阅读 · 5 评论 -
java23种设计模式十四(连载)
十四、原型模式 原型模式属于对象的创建模式,它要求对象可以“克隆”自身,从而可以复制本身的对象来创建一个实例。通过原型创建的对象,不需要关心这个实例本身,只要实现了克隆方法,就可以通过这个方法来创建新的实例,而无需new一个对象。 原型模式有两种实现方式:简单式和管理式。 首先我们来看简单式的实现,简单式主要包含三个要素:原型接口、具体的原型实现和客户端,下面我们来看代码: `原创 2017-08-31 15:54:38 · 780 阅读 · 0 评论 -
Java虚拟机之运行时数据区
在谈运行时数据区之前我们先来看看几个概念: 1、JVM 在我们工作和学习中JVM估计都已经听出老茧来了,但是大家有没有真正了解过什么是JVM,它是干嘛用的? JVM(Java Virtual Machine),顾名思义就是Java虚拟机,首先它是虚拟机,其次它用于执行Java字节码,将Java字节码翻译成计算机能运行的机器语言,所以Java是一种跨平台的语言。那么JVM就只是单纯的原创 2017-09-09 14:14:38 · 946 阅读 · 0 评论 -
Java实现多线程环境下的计数器功能
我们在做一个Web应用程序会遇到这样一个需求:在全局定义一个count,每次调用一个接口则count+1,用于统计接口调用次数和频率,代码入下:public class CountServlet implements HttpServlet { private long count = 0; @Override protected void service(HttpServlet原创 2017-09-21 11:27:54 · 5559 阅读 · 0 评论 -
Java虚拟机之内存管理
内存模型 一说到内存管理,首先需要了解它的内存模型。 虚拟机的内存模型在jdk1.8之后有了一些变化,我们分开来看,请看下图: 由图我们可以看出,jdk每个版本都会有新生代和老年代,唯一不同的是小于1.8的版本为永久代,而大于等于1.8的版本去掉了永久代,转为元空间(Meta Space)。 永久代也就是存储的数据区里面的方法区,如果程序在运行中发生P原创 2017-09-19 08:45:21 · 4195 阅读 · 9 评论 -
Java动态代理
代理模式分为静态代理和动态代理,在《Java设计模式八》一文中描述的是静态代理的实现方法,静态代理也带来了一些局限性: 1、可扩展性差,表现在每增加一个被代理对象,就需要增加一个代理类,被代理对象每实现一个方法,代理类就需要实现一个方法,即横向扩展和纵向扩展皆差。 2、可维护性差 鉴于这些局限性,Java为我们实现了动态代理的机制。 动态代理,顾名思义就是可以在程序运行时动态创建一个代理类来原创 2017-09-22 08:43:21 · 942 阅读 · 2 评论 -
SpringMVC优雅的实现数据校验
我们在使用SpringMVC提供接口时,所提供的参数难免会进行参数的合法性校验,比如非空校验,最原始的办法就是手动校验,比如下面的代码:if(StringUtils.isBlank(authorize.getClientId())){ log.debug("clientId为必填项!");} 如果一个两个参数还好,如果参数很多比如几十个,那么就要判断几十次,代码量剧增,原创 2018-01-06 15:18:32 · 6493 阅读 · 1 评论 -
SpringCloud实现简单的微服务架构
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉原创 2018-01-10 09:27:21 · 4502 阅读 · 7 评论 -
Java动态代理实现动态爬虫
笔者公司是一家区块链门户网站,该网站的很多资讯,快讯,视频等数据都是通过爬虫爬取得第三方网站获得的,需要从很多网站要爬取数据,如果每个数据源网站都需要单独写个接口去爬的话,工作量无疑是巨大的,因为笔者想到了通过动态代理实现一套爬虫机制,每次要爬取新的数据源,只要在数据库里增加一条数据源即可,无需修改代码。 废话不多说,下贴出数据库表结构DROP TABLE IF EXISTS...原创 2018-03-26 12:23:34 · 2404 阅读 · 0 评论 -
前后端分离架构中的接口安全(上篇)
互联网发展至今,已由传统的前后端统一架构演变为如今的前后端分离架构,最初的前端网页大多由JSP、ASP、PHP等动态网页技术生成,前后端十分耦合,也不利于扩展。现在的前端分支很多,如:Web前端、Android端、IOS端,甚至还有物联网等。前后端分离的好处就是后端只需要实现一套界面,所有前端即可通用。 前后端的传输通过HTTP进行传输,也带来了一些安全问题,如果抓包、模拟请求、洪水攻击、参数劫...原创 2018-06-10 10:44:12 · 30446 阅读 · 17 评论 -
java23种设计模式十三(连载)
本文主要介绍抽象工厂模式,和上文介绍的工厂方法模式的区别是:工厂方法模式是针对一个产品来构建,而抽象工厂模式则是针对多个产品来构建。下面我直接上代码来阐述抽象工厂模式的具体实现:public final class Factory { public final static Product createProduct(String name){ switch(name){ case "原创 2017-02-23 13:13:46 · 1100 阅读 · 0 评论 -
java23种设计模式十二(连载)
前端时间博主很忙,所以一直到现在才有时间更新博客,请见谅!原创 2017-02-13 12:24:26 · 632 阅读 · 0 评论 -
数据结构之链表
class Node{ int val; Node next; Node(int val){ this.val = val; }}原创 2014-04-11 13:17:52 · 994 阅读 · 0 评论 -
Java8 Lambda表达式教程
1. 什么是λ表达式 λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int y) { return x + y; }转成λ表达式后是这个样子: (int x, int y) -> x + y;参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y转载 2014-09-19 17:40:52 · 768 阅读 · 0 评论 -
spring集成mongodb封装的简单的CRUD
1、什么是mongodb MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 mongoDB MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较原创 2013-09-18 17:50:57 · 40061 阅读 · 9 评论 -
性能分析系列——小命令保证大性能
原文链接:点击打开链接最近在工作中经常和性能压测工作打交道,积累了一些性能分析经验,我觉得这些经验对每一个开发者都有帮助的,能开发出性能高的代码也是我们的最终目标。由易到难,我们逐步介绍不同命令的用法和好处,这些命令是如何帮助我们开发人员进行性能分析的。一、开发者的自测利器-Hprof命令1. 示例演示例子程序:/** * PROJECT_NAME: test *转载 2016-07-22 16:16:15 · 1482 阅读 · 0 评论 -
Java 开发必会的 Linux 命令
原文链接:http://www.techug.com/java-linux?_biz=MjM5OTA1MDUyMA==&mid=407358558&idx=2&sn=b21877f23bf4063fa311185009c1f0b7&scene=0#wechat_redirect1468904778046作为一个Java开发人员,有些常用的Linux命令必须掌握。即时平时开发过程中不使用Li转载 2016-07-19 14:12:34 · 1294 阅读 · 0 评论 -
java23种设计模式五(连载)
五、单例模式 单例模式下,有且仅有一个对象存在,当需要一个类只有一个实例的时候采用单例模式,单例模式分为饿汉式和懒汉式,下面请看代码。1、饿汉式public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){原创 2016-07-20 09:15:30 · 1603 阅读 · 0 评论 -
浮点数的相关运算Java实现
计算机处理浮点数不像普通的整数那样,直接通过简单的加减乘除就能办到,这里涉及到一个精度问题,这里举个例子:在java里面如果要比较两个浮点数是否相等,不能单纯的使用“=”来比较,通常会设定一个精度,比如:0.000001,比较的时候,将两个浮点数相减,得到的值取绝对值,如果值小于设定的精度,说明相等,否则不相等,这里博主封装了常用的浮点数的操作,包括了加减乘除四舍五入比较等方法,请看代码:impo原创 2016-07-21 10:28:45 · 4432 阅读 · 0 评论 -
SpingMVC框架实现restfull接口的版本控制
互联网发展到今天,基于restfull开发的系统也越来越多,不再局限于jsp等脚本语言来实现动态数据的展示,而是通过后台提供的http接口给前端调用,但是当系统越做越大,同一个接口可能会不断的修改,一旦调用方式发生改变,后果是非常严重的,客户端将无法正常调用,除非强制客户端升级到最新版本,这个也是不太现实的,那怎么办呢?我们想到的就是通过版本来控制同一个接口,类似这样的一个地址:http://lo原创 2016-08-05 16:02:20 · 8396 阅读 · 18 评论 -
java23种设计模式六(连载)
六、观察者模式定义:一种对象对另一种对象存在某种依赖关系,当一个对象发生改变的时候,需要改变另一个对象的状态。在设计一个系统的时候,经常会有这样一个需求,如果一个对象发生改变,需要改变另一个对象的数据。比如:android客户端的一个控件ListView,当数据发生改变的时候,我们需要通知对象,刷新当前控件。观察者模式一般有以下四个角色:观察者:作用是观察每个对象是否需要改变原创 2016-08-09 09:56:07 · 2197 阅读 · 0 评论 -
java23种设计模式八(连载)
八、代理模式 代理模式顾名思义就是构建一个代理类,来接管原来的类的工作,比如家里水管爆了,自己不修,则请工人来维修,买房子,自己请中介帮忙买,例子的工人、中介就是一个代理。下面请看代码实现: public interface Source { public void method();}public class CocretSource imp原创 2016-08-09 17:37:15 · 1401 阅读 · 0 评论 -
java23种设计模式七(连载)
七、调停者模式 调停者模式包装了一系列相互作用的对象,使得这些对象相互之间不必显式的引用,从而极大的降低了对象间的耦合性,调停者模式通过引入调停者作为中间人,使得对象间既不用相互作用又能相互影响。 调停者模式一般有以下几个角色: 调停者:只是一个接口,定义了同事对象到调停者对象间的接口,可以是一个或多个方法 具体的原创 2016-08-09 14:02:31 · 1420 阅读 · 0 评论 -
java23种设计模式十(连载)
十、享元模式 享元模式(Flyweight Pattern)顾名思义,就是多个对象共享一个对象,即共用一个内存地址,在实际应用中,采用享元模式的好处就是可以大大节约内存空间,提高系统的运行效率。享元模式经常会出现在工厂模式当中,下面是具体的实现代码:首先创建一个享元类:public abstract class Flyweight { public abstrac原创 2016-08-22 15:56:00 · 1657 阅读 · 0 评论 -
java23种设计模式九(连载)
九、责任链模式 通过字面意思我们大概能想到他是一个链条,每个人只负责自己可以做的事,不能做的事交给另外的人来做,这样就形成了一个链条,比如软件开发流程,客户提出了需求,但是要开发出一套完整的软件,要有美工、产品经理、程序员等角色,那么产品经理负责设计产品,产品设计完了后交给美工来做效果图,最后由程序员来实现功能。这就是一种责任链模式。 接下来请看实现的代码:原创 2016-08-11 12:54:36 · 1460 阅读 · 0 评论 -
java23种设计模式十一(连载)
十一、构建者模式 构建者模式主要是用于创建复杂的一些对象,这些对象的创建步骤基本固定,但是可能具体的对象的组成部分却又可以自由的变化,比如房子装修,我可以在卧室里放电视,也可以不放电视,我还可以摆个电脑,这些属性可以自由变化。 要构建这样一个对象,就需要一个创建一个Builder,用于构建需要的对象。 import java.util.HashMap;import原创 2016-10-10 14:31:01 · 1418 阅读 · 0 评论 -
maven+svn版本控制详谈
LZ最近在公司里开发一套公司自己的项目框架,并且封装了一些类库,采用的是maven来构建项目,每个项目都会涉及到版本的更新,maven项目一般的升级步骤是: 1、通过mvn deploy命令发布当前版本到maven仓库 2、将当前版本在svn服务器上打上一个标签 3、修改每个maven项目的pom.xml,改变所有版本为新版本原创 2016-10-12 13:37:24 · 7404 阅读 · 0 评论 -
前后端分离架构中的接口安全(下篇)
接着上一篇,我们继续来讨论。输入参数的合法性校验一般情况下,客户端会进行参数的合法性校验,这个只是为了减轻服务端的压力,针对于普通用户做的校验,如果黑客通过直接调用接口地址,就可绕过客户端的校验,这时要求我们服务端也应该做同样的校验。 SpringMVC提供了专门用于校验的注解,我们通过AOP即可实现统一的参数校验,下面请看代码:<dependency> ...原创 2018-06-11 08:46:20 · 5959 阅读 · 3 评论