Java 里锁的简单使用回顾

当代码中在多个线程中访问一个数据时,该数据就需要进行保护,保证在查询和修改时不会因为其它线程的操作而产生不可预料的异常。

下面简单总结了 Java 多线程开发中几个不同场景下的线程安全类和锁的使用样例。

阅读更多

HashMap 成环问题

在 JDK 1.7 的实现中,使用头插法来实现元素的插入和数组扩容。

扩容的 Resize 包含扩容和 Rehash 两个步骤,Rehash 在并发的情况下可能会形成链表环。

Sun 认为这不是一个 Bug,因为 HashMap 本来就不支持并发,要并发就用 ConcurrentHashMap

这个问题只存在于 JDK1.7 中,在 JDK1.8 中使用了不同的扩容实现方式,不会出现这种情况。

阅读更多
Java HashMap 实现

Java HashMap 实现

HashMap 是 Java 中最重要的数据结构,也是最常用的集合类型。面试中基本都会问到一两个 HashMap 相关的问题。

由于 JDK 1.8 对 HashMap 进行了优化,基本上重写了 HashMap 的实现,所以通常还会考查 HashMap 的优化点。

本文收集整理了网上一些相关介绍,也是我在面试中常被问到的相关内容。

阅读更多

Spring 应用无法启动,报无法读取配置文件错误

公司研发部门提供了一个组件包,该包在启动的时候会根据配置文件创建 MQ 消费线程,消费指定消息。集成到项目中后项目完全无法启动,报取不到配置的错误。经排查,
配置文件的配置是正确的,但在启动类中就是读不到相关配置。

阅读更多

用 @ApiVersion 注解给 API 增加版本号

通常我们设计 REST 接口时会要求在 API 上增加版本号,以方便在接口升级时保证一定的兼容性。我们假定设计的接口入下:

1
GET /api/v1/user/{userId}

在 Spring MVC 中可以这样这样实现:

1
2
3
4
5
@GetMapping(value = "/api/v1/user/{userId}")
public ResponseEntity<?> getUser(@PathVariable(value = "userId") String userId) {
return WebResponse.create(userService.getUser(userId))
.ok();
}

GetMapping 注解中手动指定了接口版本,但每个接口都指定或指定在类上也是非常不方便的,我们希望有一个注解来简化的约束这个配置的过程

阅读更多

Spring 中手动注入 @Autowired 字段

自己 new 出来的对象如何让 Spring 帮我们注入其中依赖的对象?可以使用以下方法:

1
2
3
4
Bean bean = new Bean();
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean( bean );
factory.initializeBean( bean, "bean" );
阅读更多
MapStruct 的 @BeanMapping 和 @Mapping 的不同

MapStruct 的 @BeanMapping 和 @Mapping 的不同

@MappingMapStruct 的核心注解,用于定义不同名字的属性之间的映射。

JavaDoc:
Configures the mapping of one bean attribute.
配置一个 bean 属性的映射

@BeanMapping 用于控制整个映射方法。你可以通过设置 @BeanMappingNullValueCheckStrategy 使整个方法都生效。

JavaDoc:
Configures the mapping between two bean types
配置两个 bean 类型的映射

阅读更多
MapStruct 忽略 source 中的空值属性

MapStruct 忽略 source 中的空值属性

Bean 属性映射中如何满足以下场景:

  1. 给定一个有数据的 Bean 对象,该对象的数据可能从 DB 或其它什么地方获取而来
  2. 从前端传递一个 DTO 对象过来,将该对象的内容更新到 bean 中
  3. 忽略 DTO 中的空属性(NULL)
阅读更多
MapStruct 使用介绍

MapStruct 使用介绍

MapStruct 是一个 Bean 映射工具,通过配置的注解,可以生成 Java 代码进行 Bean 映射。

由于是通过两个 Bean 的信息生成 Java 代码,并通过调用属性的 Getter/Setter 方法来实现的功能,性能上比其它通过反射实现的 Bean 映射工具要高很多,相当于自己手写代码复制对象。

本文主要介绍 MapStruct 的几种对象映射场景,方便使用时选用。

阅读更多

Flowable 中节点任意跳转

工作流开发中经常有一种回退的需求,审批回退、驳回、撤回等都需要。

在 Activiti 中流程底层没开放对应的接口,而在 Flowable 中已经提供了支持节点跳转的功能。同时我们也可以像在 Activiti 中通过实现自己的 Command 来实现任意节点跳转的需求。

下面我们先介绍一下 Flowable 提供的内置跳转功能,最后我们再手动实现任务跳转的 Command。

阅读更多