java之路
开发之路漫漫,点滴积累,重在收获!
普通网友
这个作者很懒,什么都没留下…
展开
-
高并发限流方案
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限...原创 2019-07-31 19:41:37 · 1829 阅读 · 1 评论 -
fail-fast机制
在JDK的Collection中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检...转载 2019-08-21 10:27:05 · 1376 阅读 · 1 评论 -
spring mvc异常统一处理(实现HandlerExceptionResolver接口)不生效的问题解决
spring mvc异常统一处理常见的有3种方式:使用 @ ExceptionHandler 注解 实现 HandlerExceptionResolver 接口 使用 @controlleradvice 注解详细的使用方法可参考博文:https://blog.csdn.net/yjclsx/article/details/85230404有一次在实现HandlerExceptionR...原创 2019-07-31 19:38:37 · 7965 阅读 · 6 评论 -
Spring MVC异常统一处理的三种方式
Spring 统一异常处理有 3 种方式,分别为:使用 @ ExceptionHandler 注解 实现 HandlerExceptionResolver 接口 使用 @controlleradvice 注解使用 @ ExceptionHandler 注解使用该注解有一个不好的地方就是:进行异常处理的方法必须与出错的方法在同一个Controller里面。使用如下:@Contro...转载 2019-08-21 10:27:51 · 3578 阅读 · 1 评论 -
spring普通类获取session和request对象
在使用spring时,经常需要在普通类中获取session、request对象。比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts2.ServletActionContext即可很方便的取到session对象。用法:ServletActionContext.getRequest().getSession();在传统jav...原创 2019-07-31 19:36:27 · 3659 阅读 · 2 评论 -
Hibernate中的懒加载
懒加载的应用场景考虑一个简单的网络应用程序:网上书店,书店维护者产品的目录。最原始的方法,它可以投射到一个模型实体中去用来管理一系列的产品实体。在一个大的书店中,会有成千上万的产品划分成不同的目录。当一个用户访问这个书店的时候,目录必须要从数据库中加载,我们很可能不想要加载每一个实体到内存中去。对于一个大型的零售商,考虑到物理内存把这个大量的数据加载到机器中或许不可能,即使这是可能的,它也会削...原创 2019-07-31 19:36:04 · 691 阅读 · 1 评论 -
synchronized关键字的使用
synchronized关键字是java并发编程中常使用的同步锁,用于锁住方法或者代码块,锁代码块时可以是synchronized(this){}、synchronized(Object){}、synchronized(类class){}。当锁住的内容执行完或者在执行过程中抛出异常,才会自动释放锁。如果想手动释放锁,需要调用锁住的对象的wait()方法释放掉锁并且置于等待状态,切换到其他线程运...原创 2019-07-31 19:34:24 · 8298 阅读 · 13 评论 -
Java获取客户端用户真实IP地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL...转载 2019-07-31 19:34:08 · 16713 阅读 · 6 评论 -
mybatis拦截器
一、前言拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,或者丢弃这些被拦截的方法而执行自己的逻辑。如对于mybatis的Executor,有几种实现:BatchExecutor,ReuseExecutor、SimpleExecutor和CachingExecutor,当这几种Executor接口的query方法无法满足我们的要求的时候,我们就...原创 2019-07-31 19:32:57 · 1097 阅读 · 1 评论 -
同步类容器和并发类容器
一.为什么会出现同步容器?在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。注意Collection和Map是顶层接口,而List、Set、Queue接口则分别继承了Collection接口,分别代表数组、集合和队列这三大类容器。像ArrayList、LinkedList都是实现了List接口,HashSet实现了Set接口,而Deque(双向队列,允许...原创 2019-07-31 19:22:20 · 417972 阅读 · 2 评论 -
java中的参数传递(只有值传递没有引用传递)
Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。java中的数据类型Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。基本类型的变量保存原始值,即它代表的值就是数值本身;而引用类型的变量保存的值是引用值,...原创 2019-07-31 19:25:14 · 276306 阅读 · 14 评论 -
并发编程模式
一、future模式在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时,当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的是一直等待到这个答复收到时再去做别的事情,但如果利用Future设计模式就无需等待答复的到来,在等待答复的过程中可以干其他事情。future模式核心思想就是异步调用,去除了主函数的等待时间,并使得原本需要等待的时...原创 2019-07-31 20:12:05 · 6364 阅读 · 2 评论 -
Maven的Pom文件中的隐式依赖导致Jar包冲突的问题
在一次的maven项目中遇到这样一个bug: 编译器没有报什么错,但无法编译,或者能编译,项目启动不了。后来我才发现是以下的问题: 项目中的pom文件中,依赖了webx3.core,而webx3.core又隐式依赖了fasttext相关的jar包,同时我在pom中也引人了fasttext.all, fasttext.all也隐式依赖了fasttext相关的jar包,两...原创 2019-07-31 18:33:30 · 1196 阅读 · 4 评论 -
jsp和velocity的区别
jsp和velocity都是模板引擎,jsp可以在页面代码里增加java代码,虽然这样可读性很差,但有时候是很方便。velocity不支持java代码,但有特定的标签表达式。velocity代码展示:... <legend>信用贷</legend>#if($applyVO.site == "ALIPAY")<p class="apply-tip"&...原创 2019-07-31 18:35:09 · 897 阅读 · 1 评论 -
TestNG数据驱动
TestNG数据驱动testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。@DataProvider注解简介:@DataProvider标记专门为测试方法提供参数的方法。这类方法必须返回Object[][]类型的二维数组或者Iterator<Object>[],每一行的Object[]...原创 2019-07-31 18:35:41 · 430524 阅读 · 1 评论 -
hashMap实现原理
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的)。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一...原创 2019-07-31 18:35:50 · 431016 阅读 · 6 评论 -
Map集合中value()与keySet()、entrySet()区别
在Map集合中values():方法是获取集合中的所有的值----没有键,没有对应关系,KeySet():将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取keyentrySet():Set<Map.Entry<K,V>> ent...原创 2019-07-31 18:36:36 · 424017 阅读 · 4 评论 -
4个主要的map实现类介绍
一、简单介绍map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。其中这四者的区别如下(简单介绍):HashMap:我们最常用的Map,HashMap的值是没有顺序的,他是按照key的HashCode来实现的,就是根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问...原创 2019-07-31 18:36:57 · 440220 阅读 · 3 评论 -
equals和hashcode总结
equals和hashcode总结:1.equals方法没有重写的话,用于判断对象的内存地址引用是否是用一个地址。重写之后一般用来比较对象的内容是否相等(比如student对象,里面有姓名和年龄,我们重写equals方法来判断只要姓名和年龄相同就认为是用一个学生)。2.hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,当然你也可以重写它,hashcode...原创 2019-07-31 18:37:06 · 433824 阅读 · 12 评论 -
Thinking in Java读书笔记
Thinking in Java读书笔记(IO和并发除外)1.1、类中所有的private方法都隐式地指定为final的,由于其他类无法取用private方法,所以也就无法覆盖它;private方法无法被重写,继承对应private的方法无效,private的属性也无法拿到,但我们通常private的属性有对应的get、set方法,通常是public的,所以子类继承后可以调用方法来取得到父类的...原创 2019-07-31 18:37:16 · 424375 阅读 · 4 评论 -
并发编程经历:线程池的使用
线程池的使用使用线程池管理线程可以最大程度的利用线程,节省资源消耗,它通过利用已有的线程多次循环执行多个任务从而提高系统的处理能力。我们可以通过java.util.concurrent.ThreadPoolExecutor类来创建线程池,一个任务通过execute(Runnable)方法被添加到线程池,任务就是一个Runnable类型的对象,任务的执行方法就是Runnable类型对象的...原创 2019-07-31 18:38:24 · 424691 阅读 · 1 评论 -
JAVA导出EXCEL实现
JAVA导出EXCEL实现原创 2019-07-31 18:39:28 · 450552 阅读 · 5 评论 -
java实现在线预览--poi实现word、excel、ppt转html
java实现在线预览- -之poi实现word、excel、ppt转html原创 2019-07-31 18:39:43 · 534530 阅读 · 83 评论 -
Java实现在线预览--openOffice实现
Java实现在线预览–openOffice实现原创 2019-07-31 18:39:57 · 465445 阅读 · 29 评论 -
附件在线预览控件实现的市场调研
附件在线预览控件实现的市场调研原创 2019-07-31 18:40:08 · 426259 阅读 · 4 评论 -
深入JAVA注解(Annotation):自定义注解
一、基础知识:元注解要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。元注解: 元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解: 1.@Targe...原创 2019-07-31 18:40:53 · 466793 阅读 · 17 评论 -
悲观锁和乐观锁的使用
1、悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 最常用的就是 select .. for update,它是一种行锁,会把select出来的结果行锁住,在本原创 2019-07-31 18:41:47 · 425982 阅读 · 7 评论 -
JWT产生和验证Token
Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下。很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强,也更安全点,非常适合用在 Web 应用或者移动应用上。Token 的中文有人翻译成 “令牌”,我觉得挺好,意思就是,你拿着这个令牌,才能过一些关卡。传统的Token验证...原创 2019-07-31 19:15:33 · 441915 阅读 · 8 评论 -
java过滤器Filter
一、简介Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应 (Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、...原创 2019-07-31 19:08:31 · 424954 阅读 · 1 评论 -
java后台发起上传文件的post请求(http和https)
一、http post对于文件上传,客户端通常就是页面,在页面里实现上传文件不是什么难事,写个form,加上enctype="multipart/form-data",在写个接收的就可以了,没什么难的。如:<!DOCTYPEhtml> <html> <head> <title>HelloWorld!</titl...原创 2019-07-31 19:11:04 · 536268 阅读 · 15 评论 -
spring boot 集成 sitemesh
一、Sitemesh简介Sitemesh是由一个基于Web页面布局、装饰及与现存Web应用整合的框架,是一个装饰器。它能帮助我们在由大量页面工程的项目中创建一致的页面布局和外观,如一致的导航条、一致的banner、一致的版权等。SiteMesh是基于Servlet的filter的,它通过截取response,并进行装饰后再交付给客户端。二、spring boot 集成 sitemesh...原创 2019-07-31 19:11:47 · 433552 阅读 · 1 评论 -
常用设计模式总结
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是可复用面向对象软件的基础。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中...原创 2019-07-31 19:13:12 · 436032 阅读 · 11 评论 -
Java基于Redis实现分布式锁
分布式锁可以基于很多种方式实现,比如zookeeper、redis...。不管哪种方式,他的基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。一、为什么Redis可以方便地实现分布式锁1、Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。2、Redis的SETNX命令可以方便的实现分布式锁。setN...原创 2019-07-31 19:12:35 · 13023 阅读 · 12 评论 -
并发编程经历:同步加锁之业务锁
业务锁在处理并发问题时,很多情况下需要用到业务锁来达到按照某个维度同步执行业务块。例子:@Override@Transactional(rollbackFor = Exception.class, noRollbackFor = TerminateException.class)public ApplyDO submitApply(ApplyDOapplyDO) { ...原创 2019-07-31 18:37:55 · 424770 阅读 · 2 评论 -
spring security CSRF防护
CSRF是指跨站请求伪造(Cross-site request forgery),是web常见的攻击之一。 从Spring Security 4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,Spring Security CSRF会针对PATCH,POST,PUT和DELETE方法进行防护。 我这边是spring boot项目,在启用了@EnableWebSecurity...原创 2019-07-31 19:14:30 · 450320 阅读 · 9 评论 -
在Spring AOP切面中启用新事务
在工作中有一个在切面中需要记录一下操作日志的需求,而且要求这些操作日志要存入数据库,并且无论业务层有什么异常,日志照常记录,那就不能沿用业务层的事务,而是需要新启一个事务了。 sping的声明式事务就是靠AOP来实现的,一般事务都在业务层中启用,那如果要在AOP的逻辑中启用一个新的事务要怎么做呢?比如下面的例子://定义一个切点,这里指com.lidehang.remote包下所有的类的方法...原创 2019-07-31 19:16:01 · 437746 阅读 · 6 评论 -
Spring+Quartz实现定时任务的配置方法
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.spring原创 2019-07-31 19:16:18 · 425739 阅读 · 1 评论 -
java rmi与dubbo
首先得知道什么是分布式,以及和集群的区别? 分布式:一个业务分拆成多个子业务,部署在不同的服务器上,多半是为了业务解耦,不同的业务可以分别部署,互不干扰,只在需要时相互调用,提升效率。 集群:同一个业务,部署在多个服务器上,多半是为了解决高并发,高访问量,提高系统性能。RMIRMI(Remote Method Invocation)即远程方法调用,是java在JDK1.1中实现的一...原创 2019-07-31 19:17:07 · 3997 阅读 · 1 评论 -
java对象相等问题
public class TestA { private Integer a; public Integer getA() { return a; } public void setA(Integer a) { this.a = a; }}public class Test { public static void...原创 2019-07-31 19:17:15 · 424334 阅读 · 4 评论