公众号,欢迎关注
提到审计,首先从脑海中蹦出的就是审计日志,记录了实体版本的修改信息。但是实现审计日志是个既耗时又复杂的任务,幸运的是,大部分时候我们都不需要
然而,还是有些经常碰到的问题:
- 实体什么时候被创建和修改?
- 谁创建和修改了这个实体?
Spring Data JPA的审计功能可以帮助我们解决这两个问题,下面我们介绍一下怎样通过Spring Data JPA提供的审计功能记录实体的创建和修改时间
一开始,我们需要先写一个返回当前日期和时间的服务,定义一个DateTimeService
接口
为什么使用接口而不是类实现这个服务呢,原因如下:
- 我们想创建两个不同的实现类
- 第一个实现返回当前的日期和时间
- 第二个实现用于测试,每次返回相同的日期和时间
- 如果是个产品应用,其他组件也会通过接口进行调用
DateTimeService
接口的声明只有一个方法:
getCurrentDateAndTime()
,该方法返回一个ZonedDateTime
对象
DateTimeService
接口代码如下:
import java.time.ZonedDateTime;
public interface DateTimeService {
ZonedDateTime getCurrentDateAndTime();
}
CurrentTimeDateTimeService
实现了DateTimeService
接口,getCurrentDateAndTime()
的实现只是简单的返回了当前时间
CurrentTimeDateTimeService
实现如下:
import java.time.ZonedDateTime;
public class CurrentTimeDateTimeService implements DateTimeService {
@Override
public ZonedDateTime getCurrentDateAndTime() {
return ZonedDateTime.now();
}
}
下面我们看看怎样将我们写的service与Spring Data JPA进行集成
Spring Data JPA使用DateTimeProvider
接口获取日期和时间,所以我们只要实现这个接口就可以将我们的service集成到Spring中
步骤如下:
- 创建一个
AuditingDateTimeProvider
类,实现DateTimeProvider
接口 - 添加一个
DateTimeService
类型的字段,通过构造函数注入 - 实现
getNow()
方法,通过DateTimeService
对象获取当前日期和时间,返回一个GregorianCalendar
对象
AuditingDateTimeProvider
实现如下:
import org.springframework.data.auditing.DateTimeProvider;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class AuditingDateTimeProvider implements