# PersistFunction 持久化函数
MornBoot提供多种函数式接口,处理不同业务场景下的持久化操作,实现业务代码之间低耦合。将数据验证、关联处理等常见操作与业务代码彻底分离。
Since:v1.2.0
# 数据验证
业务场景
删除部门时,若部门中存在用户,则不能删除。
# Trigger Validator
使用PersistFunctionUtils
触发删除校验
public class DepartmentService {
public void delete(TestDepartment department) {
boolean valid = PersistFunctionUtils.validateDelete(department);
// if valid, do delete department...
}
}
传统项目中,要实现类似功能,
DepartmentService
必须直接或间接引用UserService
,一旦验证链过于庞杂,就会非常不利于维护,但MornBoot可以避免这个问题。
# Validator
实现DeleteValidator<T>
验证器接口,并使用@Source
指定验证源
@Component
@Source(TestDepartment.class)
public class DepartmentDeleteValidator implements DeleteValidator<TestDepartment> {
@Override
public boolean validate(TestDepartment source) {
// dependency UserService for getting user by departmentId, here is a mock
boolean isEquals = Objects.equals(source.getId(), USER.getDepartmentId());
if (isEquals) {
// u can also throw an ApplicationException to rollback the transaction
log.warn("无法删除部门,仍有用户关联。");
}
return !isEquals;
}
}
由于相关验证器数量可以是0~n,因此无论验证器使用何种方式实现,都不会导致
DepartmentService
和任何其它业务强耦合
# Expand
AddValidator
:新增UpdateValidator
:更新PersistValidator
:自定义场景
# 关联处理
类似数据验证 (opens new window),关联处理也可以达到高内聚、低耦合的目的
业务场景
删除部门时,同步至其它系统,并通知负责人
# Trigger Processor
使用PersistFunctionUtils
触发处理函数
public class DepartmentService {
public void delete(TestDepartment department) {
// do delete department...
PersistFunctionUtils.handleDelete(department);
}
}
# Processor
实现DeleteProcessor<T>
处理者接口,并使用@Source
指定处理源。
@Component
@Source(TestDepartment.class)
public static class NotifyDepartmentDeleteProcessor implements DeleteProcessor<TestDepartment> {
@Override
public void handle(TestDepartment data) {
// get manager by departmentId
// do notify manager
}
}
@Component
@Source(TestDepartment.class)
public static class SendDepartmentDeleteProcessor implements DeleteProcessor<TestDepartment> {
@Override
public void handle(TestDepartment data) {
// do send department to other system
}
}
若处理函数与持久化业务无关,则应阻止异常抛出,以避免影响持久化事务
# Expand
AddProcessor
:新增UpdateProcessor
:更新PersistProcessor
:自定义场景