项目架构级别规约框架Archunit调研
项目架构级别规约框架Archunit调研背景最近在做一个新项目的时候引入了一个架构方面的需求,就是需要检查项目的编码规范、模块分类规范、类依赖规范等,刚好接触到,正好做个调研。 很多时候,我们会制定项目的规范,例如: 硬性规定项目包结构中service层不能引用controller层的类(这个例子有点极端)。 硬性规定定义在controller包下的Controller类的类名称以”Controller”结尾,方法的入参类型命名以”Request”结尾,返回参数命名以”Response”结尾。 枚举类型必须放在common.constant包下,以类名称Enum结尾。 还有很多其他可能需要 ...
阅读更多
深入理解JDK中的Reference原理和源码实现
深入理解JDK中的Reference原理和源码实现前提这篇文章主要基于JDK11的源码和最近翻看的《深入理解Java虚拟机-2nd》一书的部分内容,对JDK11中的Reference(引用)做一些总结。值得注意的是,通过笔者对比一下JDK11和JDK8对于java.lang.ref包的相关实现,发现代码变化比较大,因此本文的源码分析可能并不适合于JDK11之外的JDK版本。 Reference的简介和分类在JDK1.2之前,Java中的引用的定义是十分传统的:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。在这种定义之下,一个对象只有被引用 ...
阅读更多
JSR310新日期API(五)-在主流框架中使用新日期时间类
JSR310新日期API(五)-在主流框架中使用新日期时间类前提前面的几篇文章已经基本介绍完了JSR-310日期时间类库的基本使用,这篇文章主要介绍在主流的框架中如何使用这些类库。因为涉及到数据库操作,先准备好一张表和对应的实体。 CREATE TABLE `t_user`( id BIGINT PRIMARY KEY COMMENT '主键', username VARCHAR(10) COMMENT '姓名', birthday DATE COMMENT '生日', create_time DATETIME COMMENT '创建时间', KEY idx_name(`userna ...
阅读更多
JSR310新日期API(四)-日期时间常用计算工具
JSR310新日期API(四)-日期时间常用计算工具前提这篇文章主要介绍JSR-310中日期时间类的常用计算工具,包括常规的两个日期时间实例之间的前后比较、间隔的时间量等等。 日期时间的基准类日期时间类库中提供了几个常用的计算或者度量基准类,分别是: 表示取值范围的ValueRange:内部持有四个主要的成员变量minSmallest、minLargest、maxSmallest和maxLargest,可以表示的值范围是[minSmallest/maxSmallest,minLargest/maxLargest]。 表示秒和纳秒级别的时间量Duration:TemporalAmount的实现 ...
阅读更多
JSR310新日期API(三)-日期时间格式化与解析
JSR310新日期API(三)-日期时间格式化与解析前提前一篇文章已经比较详细地介绍了JSR-310中新增的常用的日期时间类,在实际应用中,我们也十分关注这些日期时间类的格式化操作,更加通俗来说就是字符串和日期时间类的相互转换问题。下面先回顾一下Java旧有的日期时间类和字符串之间的转换方案,然后重点分析JSR-310中新增的常用的日期时间类和字符串之间的转换方案。 SimpleDateFormatJava旧有的日期时间类格式化为字符串或者字符串基于模式(pattern)解析为日期时间类完全依赖于java.text.DateFormat的实现类java.text.SimpleDateForma ...
阅读更多
JSR310新日期API(二)-日期时间API
JSR310新日期API(二)-日期时间API前提这篇文章主要介绍一下日期时间API中最常用的类库,分别是: java.time.Clock:时钟。 java.time.Instant:瞬时时间,时间戳java.sql.Timestamp的替代类。 java.time.LocalDate:本地日期,ISO-8601日历系统下的日期表示,不包含时区的概念,只能表示年月日。 java.time.LocalDateTime:本地日期时间,ISO-8601日历系统下的日期时间表示,不包含时区的概念,只能表示年月日时分秒。 java.time.LocalTime:本地时间,ISO-8601日历系统下的 ...
阅读更多
JSR310新日期API(一)-时区与时间偏移量
JSR310新日期API(一)-时区与时间偏移量前提最近刚好有新项目使用到JSR-310(JDK8)中引入的新日期API,打算做一下总结。本文编写基于JDK11,部分API可能是JDK9之后新增的。 地理知识补充主要补充一下一些地理知识:时区、UTC、GMT、CST、DST和ISO-8601的相关概念。 时区时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。造成时间上的混乱是由于世界各个国家位于地球不同位置上,因此不同国家,特别是东西跨度大的国家日出、日落时间必定有所偏差(这个偏差我们通常叫做时差 ...
阅读更多
RabbitMQ扩展之交换器间的绑定
RabbitMQ扩展之交换器间的绑定概要AMQP-0-9-1中提供了queue.bind方法用于绑定一个队列到一个交换器,然后发送消息的时候,数据流总是先通过交换器(source)最终到达目标队列中(destination)。RabbitMQ实现了扩展,为交换器提供了一个exchange.bind方法用于绑定一个交换器到另一个交换器。交换器之间的绑定和队列与交换器的绑定在语义上是相同的:单向的、使用路由键和多种交换器类型。这一点允许使用者创建更丰富的路由拓扑。exchange.bind方法中的source和destination反映了消息的流向:从源(source)交换器到目标(destina ...
阅读更多
基于SpringBoot的Environment源码理解实现分散配置
基于SpringBoot的Environment源码理解实现分散配置前提org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性。Environment继承自接口PropertyResolver,而PropertyResolver提供了属性访问的相关方法。这篇文章从源码的角度分析Environment的存储容器和加载流程,然后基于源码的理解给出一个生产级别的扩展。 本文较长,请用一个舒服的姿势阅读。 Environment类体系 PropertyResolver:提 ...
阅读更多
CGLIB动态代理原理分析
CGLIB动态代理原理分析前提前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理。 CGLIB动态代理原理分析我们经常说CGLIB的动态代理的底层通过被代理类生成代理子类实现的,那么下面我们就分析一下生成的子类到底是什么样的。开启CGLIB的debug模式,输出它生成的类到指定的目录: public class DebuggingCglibDemo { private static final String METHOD_NAME = "sayHello"; pub ...
阅读更多