Java
文章平均质量分 74
明月松间照,清泉石上流
hober.z
修炼
展开
-
Java业务研发中的一些经验(持续补充ing)
如何获取当前时间?当前时间的获取方式有多重,一是可以直接取服务器时间,即new Date(),二是可以使用数据库时间。一般来说,使用数据库时间比较好。一是因为我们的业务大多与数据库进行交互,相关时间也存储到数据库中,使用数据库时间可以很好的进行统一。另一方面,在分布式环境下,由于Java所运行环境服务器的不同,根据new Date()获取到的当前时间可能也有差异,,可能会造成业务时间不统一而带来的问题。断言的使用业务代码编写时,我们时常会针对一些异常的场景,抛出对应的异常,防止程序进入后续的处理流程原创 2022-05-15 23:53:25 · 387 阅读 · 0 评论 -
面试中的HashMap
关键常量static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;默认初始bucket容量static final int MAXIMUM_CAPACITY = 1 << 30;默认最大bucket容量static final float DEFAULT_LOAD_FACTOR = 0.75f;默认负载因子,当元素数量超过 负载因子 * bucket容量 时,就会触发扩容static final int TRE原创 2021-08-31 21:45:07 · 231 阅读 · 0 评论 -
Spring AOP代理原理
如果仅仅使用二级缓存,当然也能解决Spring AOP代理问题,但是就无法做到按需进行提前曝光,而是所有bean在实例化之后都要完成AOP代理,这样就写“死”了,违背了架构设计中对扩展开放的设计原则。原创 2021-07-18 22:55:49 · 318 阅读 · 0 评论 -
RSA加密、解密、签名、验签的原理、方法及应用
一、RSA加密简介 RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。 二、RSA加密、签名区别 加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说转载 2021-05-20 21:59:50 · 1055 阅读 · 0 评论 -
浅析Spring如何解决循环依赖问题
Spring通过三级缓存解决循环依赖问题。这三级缓存分别是指:- singletonObjects:单例对象的缓存- earlySingletonObjects:提前曝光的单例对象的缓存- singletonFactories:单例对象工厂的缓存原创 2021-05-17 23:54:15 · 199 阅读 · 3 评论 -
Java并发那些事
文章目录操作系统级的并发策略多核CPU与主内存的层次结构缓存与缓存行应用系统底层如何实现数据一致性系统底层如何保证有序性【扩展】缓存一致性协议Java线程与线程池线程的实现方式线程调度方式Java线程状态及转换线程池工作原理线程池相关参数线程池使用策略Java内存模型为什么要有Java内存模型Java内存模型运行机制内存间的交互操作as-if-serialhappens-beforeJava线程安全的实现方式1. 阻塞同步2. 非阻塞同步3. 无同步方案3.1 可重入代码3.2 线程本地存储Synchron原创 2021-04-03 22:58:01 · 397 阅读 · 0 评论 -
Spring @Autowired、@Resource注入过程
Spring启动时,会通过 ContextNamespaceHandler 加载一些 标签解析器,其中包括AnnotationConfigBeanDefinitionParser,其会解析 annotation-config 标签,并注册一些关键的 PostProcessor:CommonAnnotationBeanPostProcessor ,AutowiredAnnotationBeanPostProcessorComponentScanBeanDefinitionParser,其会解析 co..原创 2021-02-25 20:52:21 · 394 阅读 · 0 评论 -
Spring中的那些PostProcessor挂载点
在 bean 实例化、属性赋值、初始化这几个阶段中,Spring通过 `PostProcessor` 接口的形式,留下了很多挂载点。这一点符合 设计模式 中的开闭原则,让后续的开发者能够便捷使用 Spring 继承自己的应用和服务。原创 2021-02-25 20:51:41 · 182 阅读 · 0 评论 -
MESI(缓存一致性协议)
现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行),这就有了MESI协议。缓存行的四个状态:MESI中每个缓存行都有四个状态,分别是E(exclusive)、M(modified)、S(shared)、I(invalid)。下面我们介绍一下这四个状原创 2021-02-01 23:10:42 · 929 阅读 · 0 评论 -
Java等待通知机制的工作原理
在Java中,任意一个对象都拥有自己的监视器。当这个对象被同步块或这个对象的同步方法调用时,执行方法的线程必须先获取到这个对象的监视器 才能进入同步块或同步方法。没有获得监视器的线程将会被阻塞在同步块和同步方法的入口处,并且变为`Block`状态原创 2021-01-25 21:18:53 · 286 阅读 · 1 评论 -
关于JVM,你必须知道的这些知识点
一、一些必知参数堆的分配参数-Xmx:堆内存的最大大小(max)-Xms:堆内存的初始大小(start)-Xmn:新生代大小(new)-XX:NewRatio老年代和新生代(eden+2*s)的比值例如:4,表示老年代:新生代=4:1,即新生代占整个堆的1/5-XX:SurvivorRatio(Survivor)设置新生代eden区与Survivor区的比值例如:8,表示 eden:s0:s1 = 8:1:1,即一个Survivor占年轻代的1/10栈的分配参数栈的分配参数-原创 2020-12-20 00:41:59 · 532 阅读 · 1 评论 -
关于计算机二进制编码,你一定要知道这些
原码、反码、补码的计算方法结论:正数有:原码 = 其二进制编码原码 = 反码 = 补码负数有:原码 = 其绝对值二进制编码(即:对应正数的原码),最高位置1反码 = 原码符号位不变,其他位取反补码 = 反码+1举例:一个四字节的int类型的数字 9原码:0000 0000 0000 0000 0000 0000 0000 1001反码:0000 0000 0000 0000 0000 0000 0000 1001补码:0000 0000 0000 0000 0000 000原创 2020-11-29 22:35:08 · 1455 阅读 · 0 评论 -
CPU高负载原因定位的一般方法——Java版
总体原理:先定位到CPU高的进程,再定位到线程,然后从jstack导出的文件中找到该线程对应的方法使用 top 命令找到CPU高的进程使用命令 shift + H 切换到线程模式,找到线程执行CPU高的线程号把线程号转成16进制print "%x\n" 40437使用jstack 命令,将线程文件dump下来Jstack pid > tmp.txt有可能导出的时候,cpu并没有飚高哦。间歇性的cpu高场景,dump要看运气用刚刚转换的线程号,去dump出来的原创 2020-11-26 23:27:24 · 230 阅读 · 0 评论 -
Spring 常用注解原理剖析
前言Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用<bean/>标签来配置,对于 Bean 之间的依赖可以使用构造方法注入、Set 方法注入在 XML 里面配置。但是使用这种方式会使 XML 变的比较臃肿庞大,并且还需要开发人员一个个的在 XML 里面配置 Bean 之间的依赖,这简直是一个灾难,还好 Spring 框架给我们提供了一系列的注解让开发人员从这个灾难中解脱出来,比...转载 2020-10-21 23:07:45 · 266 阅读 · 0 评论 -
String操作的细节——你的单位统一了吗?
究其原因,还是因为Oracle数据库字段的定义 与 代码实现的基准不一致导致的。如果Oracle中varchar用byte作为基准进行存储,我们的Java代码中也要按照字节来进行计算,这样才能符合我们的预期。原创 2020-10-11 22:53:15 · 170 阅读 · 0 评论 -
Java获取数据库表结构
虽然各个DB厂商查询数据库表结构的语句不同,但是Java中通过封装,可以使用共同的API来获取。各个具体的DB厂商有各自的实现,只需导入相应的包即可。原创 2020-09-01 23:33:18 · 8990 阅读 · 1 评论 -
Tomcat的结构体系
本文基于Tomcat 7,参考了 汪建的《Tomcat内核设计剖析》,也许对理解Tomcat知识体系、面试有所帮助。原创 2020-08-31 23:42:20 · 329 阅读 · 0 评论 -
定时任务处理中的分页问题
使用定位标识来进行遍历,从而在一个调度执行期间,能够对所有待处理任务进行处理;并且对于处理异常的任务,能够在下一次调度启动时自动拉起执行。另一方面,我们可以优化任务属性,添加一个重试次数字段。当达到最大重试次数后,任务翻为失败,由人工进行处理。具体的重试次数和调度执行时间间隔,可以由具体的业务场景来决定。这样就能尽可能减少人工干预的次数,减少人力成本。原创 2020-07-27 23:33:47 · 2275 阅读 · 4 评论 -
Java实现大文件分割与合并
逻辑很简单,是使用二进制方式读取的,所以打开的临时文件会是乱码。如果要读取成字符串,就可以避免乱码的问题了。我们可以将读取成的二进制流,再通过Base64编码,这样就可以变成字符串了。原创 2020-06-27 09:52:57 · 1616 阅读 · 0 评论 -
SOAP和WSDL的一些必要知识
原文地址SOAP和WSDL对Web Service、WCF进行深入了解的基础,因此花一些时间去了解一下是很有必要的。一、SOAP(Simple Object Access Protocol)如果我们要调用远程对象的方法,就必定要告诉对方,我们要调用的是一个什么方法,以及这个方法的参数的值等等。然后对方把数据返回给我们。这其中就涉及到两个问题:1、数据如何在网络上传输。2、如何表示数据?用什...转载 2018-09-30 17:52:05 · 265 阅读 · 0 评论 -
Redis缓存删不掉?查看你的Key序列化方式吧
排查问题发现,原来是B系统的Redis key序列化方式与A系统不一致,导致缓存删除失败。原创 2020-05-03 10:52:09 · 3233 阅读 · 0 评论 -
震惊!日志级别居然可能导致Dubbo出现空指针异常
你可能是被标题吸引过来的,但这确实是一次真实的产线事件。日志级别影响Dubbo出现空指针异常,这个是在查看源码排查问题之后,反推得到的结论。文章所用Dubbo版本为2.6.3问题复现Consumer A服务依赖Provider B服务。Consumer先启动了,此时注册中心无B服务实现,而后Provider启动。调用A服务时,报空指针异常:[dispatcherServlet] in...原创 2020-04-11 00:15:44 · 9172 阅读 · 6 评论 -
Java二维码图片处理
目标根据文字内容生成二维码,在二维码中间加入logo图片,最后将二维码嵌入外部背景图中,写入到指定路径效果测试代码:String content = "这是二维码内容";String logoPath = "F:/test/qrcode/logo.png";String backImagePath = "F:/test/qrcode/backImage.jpg";String out...原创 2020-03-22 11:48:39 · 929 阅读 · 0 评论 -
当策略模式遇上Spring
策略模式是一种比较简单的模式。一般来说,我们可以根据不同的任务类型,来选择不同的执行策略。普通调用写法对于Java语言来说,一般来说可以简化如下:if ("01".equals(type)) { firstStrategy.execute();} else if ("02".equals(type)) { secondStrategy.execute();}firstS...原创 2020-03-22 00:34:33 · 447 阅读 · 0 评论 -
使用poi+itextpdf将word转成pdf
将word转换成pdf确实有很多种方案!背景最近正好需要做一个这样的功能,需求是将word模板进行签名后转换为pdf。为此,我花了一点时间去网上找方案。期间遇到了一些坑,这里记录一下。方案选择首先,因为代码是跑在linux服务器上的,所以一般的,依赖windows office功能的方案就行不通了。这就排除了jacob这样一些效果很好的方案。其次,我们的服务器上是不能安装office这样...原创 2020-03-05 22:22:11 · 21627 阅读 · 28 评论 -
记一次sftp工具类导致jvm频繁GC事件
背景项目中需要使用sftp进行远程文件的读取,入库。原有代码中存在一个SFTPUtil类,底层使用的是jsch库调用方法。经过事件前一天正好进行了发版,上线版本中,我修改了原有SFTPUtil中的一个问题:原有代码读取完成了之后,没有关闭连接,导致读取了文件之后,连接一直保持着。我在此次版本中关闭了连接。当天中午,当我正好中午出去吃饭时,产线上突然出现了Cat预警。报错:jvm eden...原创 2020-01-06 22:07:23 · 1155 阅读 · 2 评论 -
Java URLEncode空格转换为“+”号问题
问题最近做一个URL拼接的函数,需要将用户名拼接到url上。因为用户名可能会有特殊字符,所以需要进行urlencode。这里我使用的是java的urlEncode方式。问题代码可以提炼如下:public static void main(String[] args) throws UnsupportedEncodingException, EncoderException, DecoderEx...原创 2019-11-21 22:56:15 · 7930 阅读 · 1 评论 -
Java8 Optional的正确打开方式
Java8新推出了Optional,配合lambda,对null对象的处理变得cool起来,但是如何使用呢先看Optional中的一些常用方法- public<U> Optional<U> map(Function<? super T, ? extends U> mapper) - public T orElse(T other) - public T ...原创 2019-10-15 23:51:34 · 218 阅读 · 0 评论 -
NIO通信架构原理学习笔记
1. BIO1.1 BIO概念即 Blocking IO 同步阻塞IO阻塞:在单线程的环境下,IO操作没有完成的话,当前线程不能进行其他操作(流的一个特性是阻塞的)1.2 BIO原理BIO模型中,accept得到一个Socket之后,需要创建线程对每一个Socket进行处理。1.3 BIO问题当客户端多了之后,服务端对应的处理线程也会增加,每一个线程都会占用栈空间和CPU资源针对...原创 2018-10-16 18:08:21 · 952 阅读 · 0 评论 -
设计模式之单例模式
单例模式:一个类只能生成唯一一个实例对象的设计模式 为了实现这一目标,需要我们: 1.将类的构造器私有化,这样就不能被其他方法调用 2.提供一个获取该类实例变量的方法,该方法必定是公有静态的(因为此时我们还不能获得该类的实例对象,只能通过类名.方法调用) 3.该类自己创建自己的唯一实例,这个实例是静态私有单例模式有三种实现方法: 懒汉式:顾名思义,在调用的时候才会创建实例对象/*...原创 2018-04-03 23:06:05 · 129 阅读 · 0 评论 -
从Java的重载/重写往下看——Java分派
首先来看以下代码的运行结果public class StaticDispatch { static abstract class Human { } static class Man extends Human { } static class Woman extends Human { } public void sayHello(...原创 2019-08-09 01:01:19 · 399 阅读 · 0 评论 -
【深入理解JVM】:Java内存模型JMM
原文地址:https://blog.csdn.net/u011080472/article/details/51337422 多任务和高并发的内存交互多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程...转载 2018-05-05 13:08:50 · 136 阅读 · 0 评论 -
设计模式之装饰模式
问题的引出人们日常生活中所使用的手机是不断迭代的、不断产生新功能的。初代的座机,只能打电话。如今手机经过了发展,又产生了很多功能,如听音乐、看视频等。将手机当做一个产品类,如果我们要实现这一模型的话,若采用一般继承的方式来构造的话,无疑会产生很多类。如下:interface ITelephone{ void use();}class Telephone implement...原创 2018-04-25 10:14:14 · 216 阅读 · 0 评论 -
maven工程下报错Invalid bound statement (not found)
我用maven搭建一个ssm项目时,遇到了如下问题:HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.hewie.dao.UserMappe...原创 2018-04-13 16:00:25 · 1942 阅读 · 0 评论 -
简单模拟Java中的ArrayList
Java中的ArrayList是用数组实现的。 数组是有界的,因此实现最重要的是数组的扩容机制。 扩容机制: 当要存的数据大于数组大小时,会扩容。 在JDK1.8中,会创建一个新数组,新数组大小为原数组的1.5倍,并将原数组复制到该新数组中。可以发现,扩容过程会消耗大量的时间、空间,应当尽量避免数组扩容。因此在创建ArrayList时,确定一个合适的初始数组大小是很有必要的...原创 2018-04-05 16:41:36 · 473 阅读 · 0 评论 -
设计模式之工厂方法模式
使用工厂模式创建对象时,我们不需要对客户端暴露创建逻辑,只需要通过一个共同的接口(工厂)来创建即可,从而使得代码简洁易懂。工厂方法模式中有以下几个元素:产品:要创建的对象工厂:用于创建产品的媒介在介绍工厂方法模式之前,先介绍一下简单工厂 简单工厂的实现十分简单:共同的产品接口产品类实现产品接口提供工厂类,用于创建不同的产品以生产汽车为例1.共同的产品接口...原创 2018-04-17 14:19:33 · 185 阅读 · 0 评论 -
设计模式之静态代理模式
代理模式生活中,我们很多地方要用到代理。比如租房,我们一般不会自己去找房子,而是通过中介帮我们租房子,这样中介就“代理”了我们租房的这个过程。同样的,在程序设计中也会有这样的问题。我们不能直接访问某个对象或方法,而是通过代理对象来访问。这就是代理模式。静态代理静态代理是我们“知根知底”的一种代理模式,因为其被代理者、代理者都是需要我们自己来实现的。与之相对的动态代理的代理者则不是我们实...原创 2018-04-10 21:39:12 · 177 阅读 · 0 评论 -
设计模式之动态代理
动态代理和静态代理同属于代理模式。所不同的是,在Java中,动态代理的代理者对象是由Jdk给我们提供的。 以上次租房为案例,真实角色和共同接口如下:// 共同的接口interface Rent{ abstract void rentHouse();}// 真实对象class Person implements Rent{ @Override public...原创 2018-04-16 11:10:06 · 157 阅读 · 0 评论 -
java中的日期转换
java相关的几个时间类 可以看出Date类是核心/** * Date和DateFormat格式转化 * > Date类的核心在于其内部的时间戳属性 * @throws ParseException */public static void testTimeTransfer() throws ParseException { // 获取当前时间戳 long...原创 2018-04-01 00:04:20 · 2137 阅读 · 0 评论 -
Tomcat设置虚拟目录
tomcat配置虚拟目录有多种方式在tomcat的server/xml目录中配置,不推荐在tomcat文件夹的 conf\catalina\localhost增加project .xml文件,推荐这里记录一下第2种方法 project.xml文件内容:<Context reloadable="true" docBase="E:\javaProject\test" work...原创 2018-03-31 22:30:17 · 221 阅读 · 0 评论