php网站开发考试网站开发价格评估

bicheng/2026/1/22 6:16:08/文章来源:
php网站开发考试,网站开发价格评估,太原线上教学,镇江建网站Auditing 及其事件详解 Auditing 翻译过来是审计和审核#xff0c;Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案#xff0c;我们在实际的业务系统中#xff0c;针对一张表的操作大部分是需要记录谁什么时间创建的#xff0c;谁什么时间修改的#xff0c;并且… Auditing 及其事件详解 Auditing 翻译过来是审计和审核Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案我们在实际的业务系统中针对一张表的操作大部分是需要记录谁什么时间创建的谁什么时间修改的并且能让我们方便的记录操作日志。Spring Data JPA 为我们提供了审计功能的架构实现提供了四个注解专门解决这件事情 CreatedBy 哪个用户创建的。CreatedDate 创建的时间。LastModifiedBy 修改实体的用户。LastModifiedDate 最后一次修改时间。 Auditing 如何配置 我们以一个快速的例子看看它是怎么配置生效的。 1先新建一个 EntityUserCustomerEntity 里面的写法如下。 Entity Table(name user_customer, schema test, catalog ) EntityListeners(AuditingEntityListener.class) public class UserCustomerEntity {IdColumn(name id, nullable false) GeneratedValue(strategy GenerationType.IDENTITY)private Integer id;CreatedDateColumn(name create_time, nullable true)private Date createTime;CreatedByColumn(name create_user_id, nullable true)private Integer createUserId;LastModifiedByColumn(name last_modified_user_id, nullable true)private Integer lastModifiedUserId;LastModifiedDateColumn(name last_modified_time, nullable true)private Date lastModifiedTime;Column(name customer_name, nullable true, length 50)private String customerName;Column(name customer_email, nullable true, length 50)private String customerEmail; ...... } Entity 实体中我们需要做两点 相应的字段添加 CreatedBy、CreatedDate、LastModifiedBy and LastModifiedDate注解。增加 EntityListeners(AuditingEntityListener.class)。 2实现 AuditorAware 接口告诉 JPA 当前的用户是谁。 实现 AuditorAware 接口实现 getCurrentAuditor 方法返回一个 Integer 的 user ID。以下代码介绍了两种做法 public class MyAuditorAware implements AuditorAwareInteger {/*** Returns the current auditor of the application.* return the current auditor*/Overridepublic Integer getCurrentAuditor() { // 第一种方式如果我们集成了spring的Security我们直接通过如下方法即可获得当前请求的用户ID. // Authentication authentication SecurityContextHolder.getContext().getAuthentication(); // if (authentication null || !authentication.isAuthenticated()) { // return null; // } // return ((LoginUserInfo) authentication.getPrincipal()).getUser().getId();//第二种方式通过request里面取或者session里面取ServletRequestAttributes servletRequestAttributes (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();return (Integer) servletRequestAttributes.getRequest().getSession().getAttribute(userId);} } 而 AuditorAware 的源码如下 public interface AuditorAwareT {T getCurrentAuditor(); } 通过实现 AuditorAware 接口的 getCurrentAuditor() 方法告诉 JPA 当前的用户是谁里面实现方法千差万别作者举例了两种最常见的 通过 Security 取。通过 Request 取。 3通过 EnableJpaAuditing 注解开启 JPA 的 Auditing 功能。 并且告诉应用 AuditorAware 的实现类是谁也就是我们通过 Bean 注解把上面的实现类放到 Spring 的 Bean 管理里面当然了也可以上面的类加上 Component。具体配置方式如下 SpringBootApplication EnableJpaAuditing public class QuickStartApplication {public static void main(String[] args) {SpringApplication.run(QuickStartApplication.class, args);}Beanpublic AuditorAwareInteger auditorProvider() {return new MyAuditorAwareImpl();} } 验证结果如下。 通过以上的三步我们已经完成了 auting 的配置通过 userCustomerRepository.save(new UserCustomerEntity(1,Jack)); 的执行我们看数据库里面的 4 个字段已经给填上去了。 MappedSuperclass 实际工作中我们还会对上面的实体部分进行改进引入 MappedSuperclass 注解我们将 Id、CreatedBy、CreatedDate、LastModifiedBy and LastModifiedDate 抽象到一个公用的基类里面方便公用和形成每个表的字段约束。可以将其放到我们公司的框架代码上对表设计形成统一的强约束。 步骤如下 1改进后我们新增一个 AbstractAuditable 的抽象类 MappedSuperclass EntityListeners(AuditingEntityListener.class) public abstract class AbstractAuditable {IdColumn(name id, nullable false)GeneratedValue(strategy GenerationType.IDENTITY)private Integer id;CreatedDateColumn(name create_time, nullable true)private Date createTime;CreatedByColumn(name create_user_id, nullable true)private Integer createUserId;LastModifiedByColumn(name last_modified_user_id, nullable true)private Integer lastModifiedUserId;LastModifiedDateColumn(name last_modified_time, nullable true)private Date lastModifiedTime; ...... } 2而我们每个需要 Auditing 的实体只需要继承 AbstractAuditable 即可。 内容如下 Entity Table(name user_customer, schema test, catalog ) public class UserCustomerEntity extends AbstractAuditable {Column(name customer_name, nullable true, length 50)private String customerName;Column(name customer_email, nullable true, length 50)private String customerEmail; ......} Auditing 原理解析 1我们先看一下关键的几个源码的关系图 2AuditingEntityListener 的源码如下 Configurable public class AuditingEntityListener {private ObjectFactoryAuditingHandler handler;public void setAuditingHandler(ObjectFactoryAuditingHandler auditingHandler) {Assert.notNull(auditingHandler, AuditingHandler must not be null!);this.handler auditingHandler;}//在新增之前通过handler来往我们的Entity里面的auditor的那些字段塞值。PrePersistpublic void touchForCreate(Object target) {if (handler ! null) {handler.getObject().markCreated(target);}}//在更新之前通过handler来往我们的Entity里面的auditor的那些字段塞值。PreUpdatepublic void touchForUpdate(Object target) {if (handler ! null) {handler.getObject().markModified(target);}} } 3通过调用关系图和 AuditingEntityListener我们其实可以发现以下两点情况 AuditingEntityListener 通过委托设计模式委托 AuditingHandler 进行处理而我们看 AuditingHandler 的源码会发现里面就是根据 ID 和 Version后面介绍来判断我们的对象是新增还是更新从而来更改时间字段和 User 字段。而 User 字段是通过 AuditorAware 的实现类来取的并且 AuditorAware 没有默认实现类只有我们自己的实现类也就是 AuditorAware 的实现类必须我们自己来定义否则启动会报错。AuditingEntityListener 的代码如此简单我们能不能自定义呢答案是肯定的通过 PrePersist、PreUpdate 查看源码得出Java Persistence API 底层又帮我们提供的 Callbacks而这些回调方法用于侦听保存、查询抓取、更新和删除数据库中的数据。注解方式如下Type 描述 PrePersist 新增之前 PreRemove 删除之前 PostPersist 新增之后 PostRemove 删除之后 PreUpdate 更新之前 PostUpdate 更新之后 PostLoad 加载后 注意这个方法都是同步机制一但报错将会影响所有底层代码执行。在实际工作中实现这些方法的时候方法体里面开启异步线程或者消息队列来异步处理日志或者更繁重的工作。 Listener 事件的扩展 自定义 EntityListener 随着 DDD 的设计模式逐渐被大家认可和热捧JPA 通过这种 Listener 这种机制可以很好的实现事件分离、状体分离。假如订单的状态变化可能对我们来说比较重要我们需要定一个类去监听订单状态变更通知相应的逻辑代码各自去干各自的活。 1新增一个 OrderStatusAuditListener 类在相应的操作上添加 Callbacks 注解。 public class OrderStatusAuditListener {PostPersistprivate void postPersist(OrderEntiy entity) {//当更新的时候做一些逻辑判断及其事件通知。}PostRemoveprivate void PostRemove(OrderEntiy entity) {//当删除的时候做一些逻辑判断。}PostUpdate private void PostUpdate(OrderEntiy entity) {//当更新的时候// entity.getOrderStatus()做一些逻辑判断} } 2我们的订单实体变化如下 Entity Table(orders) EntityListeners({AuditingEntityListener.class, OrderStatusAuditListener.class}) public class OrderEntity extends AbstractAuditable{Enumerated(EnumType.STRING)Column(order_status)private OrderStatusEnum orderStatus;...... } 即可完成自定义 EntityListener。 实际工作记录操作日志的实例 public class ActionsLogsAuditListener {private static final Logger logger LoggerFactory.getLogger(ActionsLogsAuditListener.class);PostLoadprivate void postLoad(Object entity) {this.notice(entity, OperateType.load);}PostPersistprivate void postPersist(Object entity) {this.notice(entity, OperateType.create);}PostRemoveprivate void PostRemove(Object entity) {this.notice(entity, OperateType.remove);}PostUpdateprivate void PostUpdate(Object entity) {this.notice(entity, OperateType.update);}private void notice(Object entity, OperateType type) {logger.info({} 执行了 {} 操作, entity, type.getDescription());//我们通过active mq 异步发出消息处理事件ActiveMqEventManager.notice(new ActiveMqEvent(type, entity));}enum OperateType {create(创建), remove(删除),update(修改),load(查询);private final String description;OperateType(String description) {this.descriptiondescription;}public String getDescription() {return description;}} } 我们通过自定义的 ActionsLogsAuditListener 来监听我们要处理日志的实体然后将事件变更通过消息队列进行异步处理这样就可以完全解耦了。当然了这里我们解耦的方式也可以通过 Spring 的事件机制进行解决。通过工作中的此示例来帮助大家更好的理解 Audit 的机制顺便说一下处理操作的日志的正确思路记录当前真实发生的数据和状态及其时间即可具体变化了什么那是在业务展示层面上要做的事情这里没有必要做比对的事情记住这一点之后就会让你的日志处理实现机制豁然明朗变得容易许多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彩票网站什么做网站验证码原理

其实要提高搜索引擎蜘蛛的来访次数,唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容,才能够提高蜘蛛的来访次数。如果本身内容更新不多,外部引流的蜘蛛过多,最终发现没什么内容索引,蜘蛛来访的次数也会…

网站建设技术标书网站开发实例视频

lua解析器 void Start(){//Lua解析器 能够让我们在Unity中执行Lua//一般情况下 保持它的唯一性LuaEnv env new LuaEnv();//执行Lua语言env.DoString("print(你好世界)");//执行一个Lua脚本 Lua知识点 :多脚本执行 require//默认寻找脚本的路径 是在 Res…

安庆网站建设朋友圈发布到wordpress

1,打开自定义功能区 [文件]->[选项]->[自定义功能区] 2,打开设置页边距设置界面 点击之后再上方输入框进行修改,点击对钩进行确认修改,修改PageLeftMargin、PageRightMargin、PageTopMargin和PageBottomMargin这四个参数。

济南公司网站建设seo搜索引擎优化是什么意思

my.cnf(或my.ini)是MySQL的配置文件,其中包含了多种设置,用于控制MySQL服务器的运行方式。以下是my.cnf中一些常见的配置项目: 服务器设置 - [mysqld]:服务器的配置部分。 - user:指定M…

建立自己的网站用花钱吗淮安做网站的公司有哪些公司

来自 http://www.cnblogs.com/kaima/archive/2008/08/17/1269637.html 在缺乏SilverLight中文教程的今天,新人要入门不容易,所以我根据自己阅读英文原档和实践经验,总结一个系列。首先介绍的是开发环境的搭建。 个人强烈推荐安装英文版的开发…

国内红酒网站建设wordpress获取指定图片

互联网问答平台上线以来,问答口碑营销一直是企业进行网络营销推广不可缺少的一种方式,那么,什么是问答营销推广呢?如何开展问答营销推广?问答营销有哪些优势呢?小马识途营销顾问在本文分析一下。 什么是问答…

揭阳市建设发展总公司网站盘锦化工网站建设

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题:当sigmoid的输出非常接近0或者1时,区域的梯度几乎为0,而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化,它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …

微网站的优势注册网站那里能注册

1、两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以…

哪里有未成年做的网站做网站需要域名还需要什么

概述 在工作中,软件、代码、程序这三个词经常被换用,大部分情况下,这种混用都不会出问题,实际上,它们是不同的概念,有相交的部分,也有不同的地方。本文就简单阐述一下他们的区别。 在计算机领…

如果一个网站的域名是一个网站项目多少钱

正题 题目大意 刚开始一棵树&#xff0c;在树中加入k条边(k<2)使得这些边都得走过的情况下&#xff0c;每个点都到达并回到原点的最少边。 解题思路 首先我们发现如果不加边的话答案是2∗(n−1)2*(n-1)2∗(n−1)。 之后我们考虑k1k1k1的情况&#xff0c;我们找树的直径&am…

青岛做网站建设的公司网站建设中的pv指的是啥

基础数据类型和引用数据类型的区别如下&#xff1a; 存储上的区别&#xff1a;基础数据类型是存放在栈中的简单数据段&#xff1b;引用数据类型是存放在堆内存中的对象&#xff0c;在栈内存中存放的是堆内存中具体内容的引用地址&#xff0c;通过这个地址可以快速查找到对象。…

gif图标网站淘宝客网站的建设

MSVCR110.dll的丢失可能导致某些应用程序无法启动。当用户试图打开依赖于该特定版本DLL文件的软件时&#xff0c;可能会遭遇“找不到指定模块”的错误提示&#xff0c;使得程序启动进程戛然而止。这种突如其来的故障不仅打断了用户的正常工作流程&#xff0c;也可能导致重要数据…

教学资源网站建设方案作文大全网站

一。以太网 1.nc模拟UDP &#xff08;1&#xff09;COMMBOX通信调试工具 &#xff08;2&#xff09; 控制台输入nc -u 127.0.0.1 8000,此时串口也可以获得数据 &#xff08;3&#xff09;串口调试程序发送字符串&#xff0c;电脑控制台也会展示同样字符串&#xff08;说明UDP…

湖南沙坪建设有限公司网站简述网站栏目管理

源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88403340 源码下载2&#xff1a; 关注我留言 开源OA协同办公系统&#xff0c;集成Flowable流程引擎 可拖拽创建个性表单。基于RuoYi-VUE版本开发。 1、使用RuoYi-Vue的基础上开发。 2、集成flowable&a…

惠州网站建设 翻译6完美动力培训价格表

在 JavaScript 中&#xff0c;函数可以通过不同的方式进行调用。以下是常见的几种函数调用方式&#xff1a; 函数调用&#xff1a;使用函数名称后跟一对小括号来调用函数&#xff0c;这是最基本的调用方式。 functionName(); 方法调用&#xff1a;函数可以作为对象的方法进行调…

上海市网站wordpress安装 503

转载于:https://www.cnblogs.com/invisible2/p/11514817.html

临沂经开区建设局网站天津服务设计

1.动态实时查找命令 使用以下命令的前提是需要在找到日志位置 tail -f server.log 实时展示日志末尾内容&#xff0c;默认最后10行,相当于增加参数 -n 10 tail -n filename; tail命令扩展 查看日志最后20行内容并实时更新日志 tail -f -n 20 server.log或者 tail -fn 20 ser…

株洲网站设计外包运营上海百网优seo优化公司

随着大模型的飞速发展&#xff0c;在短短一年间就有了大幅度的技术迭代更新&#xff0c;从LoRA、QLoRA、AdaLoRa、ZeroQuant、Flash Attention、KTO、蒸馏技术到模型增量学习、数据处理、新的开源模型的理解等&#xff0c;几乎每天都有新的发展。 作为算法工程师&#xff0c;面…

做地方网站能赚钱吗wordpress修改底部

Safari是一款由苹果公司开发的多功能浏览器&#xff0c;以其快速、稳定和安全而受到用户的青睐。在我们使用Safari时&#xff0c;它会产生大量的缓存文件。 这些缓存文件会占用存储空间&#xff0c;影响设备的运行速度。那么&#xff0c;safari怎么清理缓存呢&#xff1f;本文…

台州做网站最好的开发一个软件需要什么过程

简介 作为 Facebook 在 2015 年推出的查询语言&#xff0c;GraphQL 能够对 API 中的数据提供一套易于理解的完整描述&#xff0c;使得客户端能够更加准确的获得它需要的数据 现在的web系统大多是基于restful的&#xff0c;我们知道&#xff0c;REST强调以资源来划分系统&#x…