深入Java
文章平均质量分 73
冲冲冲!!!
这个作者很懒,什么都没留下…
展开
-
适用Java SpringBoot项目的分布式锁
在分布式系统中,常用到分布式锁,它有多中实现方式,如:基于redis,database,zookeeper等。在需要分布式加锁的时候,先通过redisLockRegistry获取到lock对象,然后用lock对象加锁(可以设置等待尝试时间,到点自动放弃,不加时间默认立即放弃),处理完业务之后一定要记得解锁。在需要分布式加锁的时候,先通过jdbcLockRegistry获取到lock对象,然后用lock对象加锁(可以设置等待尝试时间,到点自动放弃,不加时间默认立即放弃),处理完业务之后一定要记得解锁。原创 2024-02-29 19:03:44 · 604 阅读 · 0 评论 -
Spring Data Envers 数据审计实战2 - 自定义监听程序扩展审计字段及字段值
上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。之前演示的是业务表中已有的字段进行审计,那么如果我们想扩展审计字段呢?比如目前对员工表加入了@Audited审计,员工表有个字段为dept_id,为了页面展示更人性化,我想把dept_id关联的部门名称(当时的快照值)也存入审计版本中...原创 2024-02-05 17:48:01 · 958 阅读 · 1 评论 -
Spring Data Envers 数据审计实战
随着各行各业信息化发展,决策者们越来越意识到数据版本追踪的重要性,尤其是上市公司,数据对于他们尤为重要。考虑到研发成本,对重要表单数据支持页面级的修改历史查看、对所有业务数据支持DB级的版本查看是一个不错的选择。对于使用了Spring框架的Java项目而言,Spring Data Envers就是一个非常适合做数据审计的组件。下面我们看看如何在项目中集成Spring Data Envers实现数据审计功能。原创 2024-02-05 15:38:31 · 870 阅读 · 0 评论 -
云原生架构
这些云原生技术支持对应用程序进行快速、频繁的更改,而不影响服务交付,从而为采用者提供创新的竞争优势。微服务是小型、独立的软件组件,它们共同作为完整的云原生软件运行。提到云原生就必须介绍一个组织 - 云原生计算基金会 (CNCF) ,它是一个开源基金会,可帮助组织启动云原生之旅。CNCF 成立于 2015 年,支持开源社区开发关键的云原生组件,包括 Kubernetes等,很多大型云厂商是该基金会成员,如亚马逊。云原生架构结合了开发团队用来构建和运行可扩展的云原生应用程序的软件组件。这可以长期节省运营支出。原创 2023-07-28 22:30:34 · 389 阅读 · 0 评论 -
Java的4种内部类的使用方式及适用场景
Java中有四种形式的内部类,在开发的过程中需要理清楚何时使用合适的内部类,内部类用好了可以提高编码效率、更好的实现封装、甚至可以巧妙实现多继承。当然,某些内部类用多了会削弱面向对象的设计思想,所以内部类不可滥用,要清楚各种形式内部类的作用和适用场景。原创 2023-05-25 19:02:12 · 3154 阅读 · 0 评论 -
Spring的7种事务传播方式
Spring事务传播行为体现在某个service方法调用另一个service方法,事务该如何进行下去。Spring支持7中事务传播方式...原创 2022-12-30 14:32:52 · 2685 阅读 · 3 评论 -
Redis缓存集群概述
当我们的存取的key到达的时候,Redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。6.当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。原创 2022-11-27 17:37:36 · 226 阅读 · 0 评论 -
缓存穿透、缓存击穿、缓存雪崩及其解决方案
当大量的读、写请求涌向数据库时,磁盘的处理速度与内存显然不在一个量级,因此,在数据库之前加一层缓存,能够显著提高系统的响应速度,并降低数据库的压力。当缓存未命中,查询持久层也为空,可以将返回的空对象写到缓存中,这样下次请求该key时直接从缓存中查询返回空对象,请求不会落到持久层数据库。缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。物理不过期,针对热点key不设置过期时间。原创 2022-11-27 17:27:01 · 529 阅读 · 0 评论 -
API网关之Nginx作为网关的优势及实战
Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。原创 2022-11-20 18:13:29 · 2536 阅读 · 0 评论 -
API网关之网关概述、技术选型
的,模式固定我们可以理解为,你的一个客户他发送过来的请求实际上就是那么几种,它的路径、包体大小、请求头等这些都是比较趋向于固定的,很难会有一个客户他的请求是完全随机生成的,这对我们后面针对这种情况做。3. Zuul, Netflix开源,功能丰富,使用Java开发,易于二次开发,需要运行在Web容器中,如Tomcat。API网关有时也叫应用网关、业务网关,是后台接口的统一入口,进入系统的所有请求都要经过API网关。云开发有自己的一套账号身份体系,请求里如果是带有身份信息的,那么网关会对身份进行鉴权。原创 2022-11-20 18:09:46 · 800 阅读 · 0 评论 -
阿里云架构实战之VPC(虚拟专有网络)介绍与搭建
虚拟专有网络VPC是用户或企业专有的云上私有网络,不同的专有网络之间二层逻辑隔离。用户可以完全掌控自己的专有网络,例如选择IP地址范围、配置路由表和网关等,用户可以在自己定义的专有网络中使用阿里云资源,如云服务器、云数据库RDS和负载均衡等。每个专有网络都由、。示例:,,10.0.0.0/8及自定义地址段是专有网络的枢纽。作为专有网络中重要的功能组件,它可以连接专有网络内的各个交换机,同时也是连接专有网络和其他网络的网关设备。每个专有网络创建成功后,系统会自动创建一个路由器。原创 2022-11-20 17:22:14 · 3231 阅读 · 0 评论 -
图解G1GC原理
本文介绍了G1垃圾回收器的工作原理转载 2022-07-12 17:53:01 · 770 阅读 · 0 评论 -
多线程环境中lock.trylock方法争抢锁
在多线程或分布式环境中,经常需要用到锁,trylock有两种用法,一种是不带参数:不设置等待时间,获取失败立即返回false。另一种是带等待时间的,线程会先挂起等待设置的时间结束如果还未获取到锁则返回false。下面来看一个多线程争抢锁的实例:public void execWithLock(Lock lock, Supplier<Boolean> supplier) { //Lock lock = new ReentrantLock(); //obtainLock(l原创 2022-01-10 21:07:21 · 2549 阅读 · 0 评论 -
JDK8 List中实用方法
List<String> list = Lists.newArrayList();list.add("2");list.add("1");list.add("3");System.out.println("forEach demo:");list.stream().forEach(str -> System.out.println(str));System.out.println("filter demo:");list.stream().filter(str ->.原创 2021-04-22 22:36:46 · 173 阅读 · 0 评论 -
发布订阅 -- 观察者模式介绍 优缺点 使用场景、案例及代码演示
一句话概括:定义对象间的一种一对多关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。关键点:一对多,一个对象改变所有依赖它的对象得到通知补充介绍:观察者模式(Observer Pattern)是对象的行为模式,又叫发布-订阅模式、源-监听器模式和从属者模式等。两种模型(推模型和拉模型):■推模型是假定主题对象知道观察者需要的数据;而拉模型是主题对象不...原创 2019-04-15 23:40:21 · 7044 阅读 · 0 评论 -
Java 多线程同步关键字synchronized各种用法/特性 总结
一、synchronized锁对象:1. synchronizedd锁对象的两种方式:一种是在方法里面使用synchronizedd代码块:public void testSyncObj() { synchronized (this) { System.out.println("锁对象的方式一:synchronized代码块"); }}还有一...原创 2019-05-17 00:01:06 · 2962 阅读 · 0 评论 -
计算机内存体系与Java 内存模型
计算机内存相关硬件介绍与缓存一致性:让计算机并发执行若干个任务与更充分的利用计算机处理器的效能之间的因果关系,非常的复杂,其中一个重要的复杂性来源是绝大多数的运算任务都不可能只靠处理器计算就能完成的,处理器至少要与内存交互,如:读取运算数据,存储运算结果等。这个IO操作是很难消除的(无法仅靠寄存器来完成所有的运算任务)。由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系...原创 2019-05-26 15:39:41 · 3632 阅读 · 0 评论 -
Java多线程模型及实现方式
为什么要多线程并发?并发处理的广泛应用是使得阿姆达尔定律代替摩尔定律成为计算机发展源动力的根本原因,也是人类压榨计算机运算能力的最强有力武器。阿姆达尔(Amdahl)定律通过系统中并行化与串行化的比重来描述多个处理器系统能获得的运算加速能力。摩尔定律则用于描述处理器晶体管数量与运行效率之间的发展关系。这两个定律的更替代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展过程。...原创 2019-05-26 15:46:07 · 4366 阅读 · 0 评论 -
Java线程的6种状态
Java的线程大致有6种状态:NEW:新建状态,new了一个线程。Runable:可执行状态,线程调用了start()或run()方法,或者等待结束,都会进入Runable状态,在操作系统或处理器而言,java的Runable状态可能是他们的就绪态或运行态,因为从就绪态到运行态是处理器决定的,Java无权过问,所以为了可以控制Java能控制的部分,方便理解和管理线程,Java将这种...原创 2019-05-26 15:46:56 · 3197 阅读 · 0 评论 -
几种常用的Web安全认证方式
1. Http Basic Auth这是一种最古老的安全认证方式,这种方式就是简单的访问API的时候,带上访问的username和password,由于信息会暴露出去,所以现在也越来越少用了,现在都用更加安全保密的认证方式,可能某些老的平台还在用。如下图所示,弹出一个框,让你填写用户名密码。这就是Tomcat自带的HTTPBasic认证。当用户名密码输入错误后,会返回401 Una...原创 2019-05-26 20:13:12 · 23969 阅读 · 2 评论 -
Spring Boot,Spring Security实现OAuth2 + JWT认证服务
阅读此文,希望是对JWT以及OAuth2有一定了解的童鞋。JWT认证,提供了对称加密以及非对称的实现。内容源码点我涉及到源码中两个服务spring-boot-oauth-jwt-serverspring-boot-oauth-jwt-resource-server认证服务端提供认证、授权服务实现方式,主要复写AuthorizationServerConfigurer...转载 2019-06-08 18:22:13 · 5283 阅读 · 0 评论 -
Java 线程安全与锁优化
什么是线程安全?线程安全经常会被各种行业大佬或者面试官大佬挂在嘴边,如何找到一个通俗易懂一点的方式解释线程安全呢,伟大的砖家给出了答案:如果一个对象可以安全的被多个对象使用,那它就是线程安全的。是的,这种回答非常的巧妙精彩…巧妙到你无法怼它是错误的…但是也无法从中找到任何有用信息…众多定义中,《Java Concurrency In Practice》的作者Brian Goetz对线程安全...原创 2019-05-25 14:56:53 · 3365 阅读 · 1 评论 -
Java导出CSV用MS Office Excel打开乱码问题一招制胜办法
废话不多说,上代码:OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream(), "UTF-8");response.setContentType("application/octet-stream");response.addHeader("Content-Disposition", "atta...原创 2019-05-24 17:04:07 · 3934 阅读 · 0 评论 -
Java 线程间的通信wait(), notify(), join(), ThreadLocal讲解
等待/通知机制(wait/notify)线程与线程之间不一定是独立的个体,他们之间可以相互通信和协作。等待通知机制的应用案例非常广泛,比如常见的消息发布订阅就是一种等待通知的实现,一个线程订阅某个消息/事件,然后就开始等待,然后另一个线程发布这个消息,然后通知第一个线程,第一个线程接收这个消息并处理。Java多线程中等待通知机制的实现离不开下面这两个方法:1)wait() :...原创 2019-05-19 20:34:03 · 3171 阅读 · 0 评论 -
二维连接桥 -- 桥接模式介绍 使用场景案例 优缺点 及代码演示
一句话概括:将类的功能层次结构与实现层次结构分离。补充介绍:桥接模式(Bridge Pattern)涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。类的功能层次结构:父类具有基本功能在子类中增加新的功能类的实现层次结构:父类通过声明抽象方法来定义接口子类通过实现具体方法来实现接口参与角色:1)功能...原创 2019-04-22 23:37:55 · 3743 阅读 · 0 评论 -
大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示
一句话概括:使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离。补充介绍:建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。建造者模式的目的是将复杂对象的构建与表示相分离,使同样的构建过程可以构建不同的表示。将复杂对象的变与不变相分开。建造高楼大厦时,需要打地基,...原创 2019-04-26 23:40:34 · 2432 阅读 · 0 评论 -
皇帝的新衣 -- 装饰器模式介绍 使用案例 优缺点及代码演示
一句话概括:在不改变对象结构的情况下向一个现有对象添加新的功能。关键点:不改变现有,加新的功能补充介绍:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。就增加功能来...原创 2019-04-16 23:21:56 · 3354 阅读 · 0 评论 -
对象流水线 -- 工厂模式介绍 使用案例及代码演示
一句话概括:建立一个工厂类,对实现了同一接口的一些类 根据传入的不同参数进行不同实例的创建。补充介绍:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。参与角色:1)抽象基类(也可以是接口)2)多个具体的实现类3)工厂类(包括创建a的实例的方法)优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根...原创 2019-04-14 16:56:34 · 2863 阅读 · 0 评论 -
fasterxml Jackson 各种使用场景以及序列化、反序列化的时候忽略不必要的Properties
1. 将json字符串转成Map:public static Map jsonToMap(String json) { ObjectMapper objectMapper = new ObjectMapper(); try { return objectMapper.readValue(json, Map.class); } catch (IOExce...原创 2019-04-12 14:01:00 · 1800 阅读 · 0 评论 -
Java 多线程同步妙招 -- CountDownLatch计数器
CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他n个批量任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。比如我们要监控所有上游系统的状态,于是可以用一个线程池去跑每个上游系统的健康状态,等他们全部跑完我们才能返回所有系统的检测结果,这是后就可以在初始化线程池的时候...原创 2019-04-08 10:45:47 · 1353 阅读 · 0 评论 -
Java 原生API 实现zip和unzip (用文件和响应流两种方式)
package com.ford.dsl.controller;import org.springframework.http.HttpEntity;import org.springframework.http.HttpMethod;import org.springframework.web.client.RestTemplate;import java.io.*;impor...转载 2019-04-02 13:39:44 · 1413 阅读 · 0 评论 -
在Java中使用XPath快速优雅的读取XML, JAXB真的是太繁重
这是一个XPath的工具类:不需要任何依赖,都是Java原生APIpublic class XPathReader implements Closeable { private InputStream is = null; private Document document; /** * * @param is * @return...原创 2019-04-04 16:28:31 · 1357 阅读 · 0 评论 -
对象克隆 -- 原型模式 (Prototype Pattern) 介绍 使用场景案例分析 优缺点 及代码演示
一句话概括:创建重复的对象,同时又能保证性能。补充介绍:原型模式(Prototype Pattern)实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象代价比较大时则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建,我们则可以缓存该对象,在下次调用的时候直接返回它的克隆,在需要的时候来更新数据库,以减少对数据库的调用。利用已有的一个原型对象,快速...原创 2019-04-27 14:59:40 · 2138 阅读 · 0 评论 -
对象间的USB -- 适配器模式 (Adapter Pattern) 介绍 使用场景案例分析 优缺点 及代码演示
一句话概括:两个不兼容的接口之间的桥梁(不要与桥接模式的定义混淆哦)。补充介绍:适配器模式(Adapter Pattern)涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能,它好比一个插座或USB接口,将两个器件连接到一起。适配器模式用于将一个类的接口转换成客户希望看到的另外一个接口,它使得那些原本因为接口不兼容而不能一起开心玩耍的类可以一起玩耍了。适配器模式主要应用于...原创 2019-04-27 16:55:17 · 2180 阅读 · 0 评论 -
部分-整体(树结构) -- 组合模式 (Composite) 介绍 使用场景案例 优缺点 及代码演示
一句话概括:对象A里面又包含List<A>的一个树状结构。补充介绍:组合模式(Composite Pattern)创建了一个包含自己对象组的类。该类提供了修改对象组的方式。组合模式将对象组合成属性结构以表示“部分-整体”的层次结构(树形结构)。组合模式使得用户单个对象和组合对象的使用具有一致性。参与角色:1)组合类 (包括该类自己的属性以及一个元素为类本身的Li...原创 2019-04-27 18:11:52 · 2534 阅读 · 0 评论 -
Java volatile关键字特性介绍
一句话概括:关键字volatile的主要作用是使变量在多个线程间可见。补充介绍:了解过JVM工作原理的都应该知道,在多线程环境中,每个私有线程会拷贝公共堆栈上需要用到的变量数据,然后读取变量是从私有数据栈中读取的,这样可能造成读取的数据不是实时的,出现脏读情况。而用volatile修饰的公共变量则每次都强制从公共堆栈中取得变量的值,而不是从私有数据栈中读取。这样至少能保证每次读取...原创 2019-05-19 19:26:26 · 3564 阅读 · 0 评论 -
Thread和Runable比较
大多数情况下,不考虑代码书写方式,这两个都是可以实现多线程功能的。所以他们的区别并不是性能上 功能上的区别,而是书写方式,代码可维护性,松耦合性 以及操作方便等方便的区别了。1. 最直接的区别就是Runable是接口,是支持多继承的,也就是实现类也可以实现其他的接口,降低了耦合。而Tread是类,只能被单一继承,这样它的子类不能再继承其他类了,增加了耦合性。2. Runable书写更加方便...原创 2019-05-19 17:17:39 · 3667 阅读 · 1 评论 -
集合遍历利器 -- 迭代器模式 介绍 使用场景案例 优缺点及程序演示
一句话概括:顺序访问集合对象的元素,不需要知道集合对象的底层表示。补充介绍:迭代器模式(Iterator Pattern)相信大家都已经见过不少次了,当你学习Java或者其他编程语言的开始你就会接触它,因为集合就是这种设计模式:提供一种方法顺序访问聚合对象中各个元素而又无需暴露该对象的内部表示。这种模式将元素之间的游走交给迭代器,而不是具体的聚合对象。从而达到一种低耦合目的。关...原创 2019-04-24 23:58:19 · 3515 阅读 · 0 评论 -
简单工厂的霸霸 -- 抽象工厂模式 介绍 使用场景案例 优缺点及程序演示
一句话概括:可以生产多种产品的超级工厂(简单工厂模式只能上产一种产品)。补充介绍:抽象工厂模式(Abstract Factory Pattern)的核心是一个超级工厂,这个超级工厂可以创建很多不同的产品,每种产品又都是简单工厂模式生产出来的,可以说它是简单工厂的工厂。超级工厂不需要知道具体产品的类型,只需要知道每种产品的基类类型。如果说简单工厂可以生产某种产品,那么抽象工厂是可...原创 2019-04-24 23:34:04 · 2857 阅读 · 0 评论 -
孤独的猛兽 -- 单例模式 五种实现方式介绍 优缺点 使用场景及代码演示
一句话概括:顾名思义,一个类只有一个实例。补充介绍:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:单例模式只...原创 2019-04-24 19:23:35 · 2139 阅读 · 0 评论