谈谈自己对AOP以及动态代理的理解 还有 数据库时区的问题

1.AOP 和动态代理与事务

AOP  大家已经很熟悉了吧,Spring核心思想之一,面向切面编程。

今天给大家说说aop,他就是对 IOC容器里的对象,进行方法的增强。

注意,他只能增强 IOC容器内的bean,通过自己new出来的不能被代理,

原理就是,有接口就是JDKproxy,没有接口就是CGLIB。

自定义切面,切的注解,也是,注解标在IOC容器里的对象,才能够代理它,Spring管理的对象嘛。才支持被AOP的权利,原理就是,看看IOC容器中有没有这个类,或者有没有被注解标记的方法,有就创建代理类去代理当前类,最后通过依赖注入到 别的对象属性中  供它使用。

再说说事务 ,Spring声明式事务也是通过AOP实现的。

如果事务AOP 和 环绕执行增强,共同切了一个方法,那么谁代理谁呢?

正确答案是,经过测试,不管注解摆放的顺序,都是Transaction在代理  增强类。

简单来说,你环绕增强执行完真实对象的方法之后抛了异常, 是在Spring事务代理范围之内的

会回滚事务!

所以事务的代理是最后代理的,里面不管你加了几层 AOP 都是最后 加的事务代理,然后抛异常肯定能够回滚。

2.数据库时区

当使用 Mysql  8.0的时候。我们配置Springboot yml配置文件的时候,需要配置时区,这里的时区一定要和数据库配置一样的时区,要不然数据库使用UTC时区,Java默认时区为GMT+8 东八区,

会使数据库时间类型的传到Java上面来,小时+8,导致时间不一致。  

和Jackson原理一样,在spingboot 接口controller 转JSON到前端,默认以格林威治时间,转化,所以会 减8,在yml文件配置Jackson 时区配置了 GMT+8 保证格式与 Java默认时区一致,就不会在转换时区的时候,被增加或减少,导致不必要的麻烦。

总结,数据库时区和Java时区和Jackson时区保证一致就不会导致时间不一致的现象发生。

但是字符串不会受时区的印象,比如mybatis plus 使用时间当参数,你穿字符串的话,是不会被 时区解析,直接当字符串传入SQL,然后进入数据库,是原样的。

在数据库转换时区,是在那一步,是在SQL预编译,将Date转化为时间戳,然后转化为java.sql.Date 类的时候,会以yml文件url后面的时区,进行时区的转化,时间戳就是格林威治到现在的毫秒值,然后根据不同时区,转化为不同的日期值嘛,然后转化到UTC的话,那就是正常GMT+8时区 -8小时,就是UTC,这就是为什么我查出来的时间,比我放入字符串的时间,多8小时,是因为它传上来的时间戳,按照GMT+8时区,把原来的时间先加8小时,才能和Java时区对上。但是你设置数据库时区为GMT+8,时区一致了,就不会有时区转化了。

转换原理:

前端到controller:没规定时区,就是UTC ,然后转化为时间戳,放到 Java里,根据Java时区,是GMT+8所以Java时间就多了8小时,然后如果给了时区和GMT+8一致 ,先减8 转化为时间戳,到Java 转化为 GMT+8在加回来。

数据库到Java同理。从Java Date转化时间戳,少了8小时,然后UTC的时区,转化为数据库Java.sql.Date,他不加回来了,这就是为什么少了8小时

数据库传上来 Java.sql.Date类型,你设置时区为UTC,他不会减8小时变时间戳,然后时间戳转化GMT+8又加了8小时,这就是为什么时间多了8个小时的原因。

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

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

相关文章

uniapp点击tabbar之前做判断

在UniApp中,可以通过监听 tabBar 的 click 事件来在点击 tabBar 前做判断。具体步骤如下: 在 pages.json 文件中配置 tabBar,例如: {"pages":[{"path":"pages/home/home","name":"h…

RT-Thread启动过程

RT-Thread启动流程 一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。 RT-Thread支持多种平台和多种编译器,而rtthread_startup()函数是RT-Thread规定的统一启动入口。 一般执行顺序是:系统先从启…

Ubuntu18.04安装GTSAM库(亲测可用)

在SLAM(Simultaneous Localization and Mapping)和SFM(Structure from Motion)这些复杂的估计问题中,因子图算法以其高效和灵活性而脱颖而出,成为图模型领域的核心技术。GTSAM(Georgia Tech Smo…

CSS3:绘制多边形

clip-path&#xff1a;该属性使用裁剪方式创建元素的可显示区域&#xff0c;区域内的显示&#xff0c;区域外的不显示。 构建一个三角形 <div class"mybox"></div><style>.mybox {width: 100px;height: 100px;background-color: yellow;clip-path…

JavaOOP篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、Hashcode的作用二、Java的四种引用,强弱软虚三、Java创建对象有几种方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码…

Android可折叠设备完全指南:展开未来

Android可折叠设备完全指南&#xff1a;展开未来 探索如何使用Android Jetpack组件折叠和展开设备。 近年来&#xff0c;科技界见证了可折叠设备的革命性趋势。这些设备融合了便携性和功能性的创新特点&#xff0c;使用户能够在不同的形态之间无缝切换。在本博客中&#xff0c…

浅析海博深造

文章目录 深造作用 留学种类 选专业 择校 申请流程 申请方式 深造作用 1、个人能力提升&#xff08;学术专业、语言、新文化或新生活方式&#xff09; 2、更好的职业发展&#xff08;起点更高、结交新朋友或扩大社交圈&#xff09; 3、北京上海落户优惠 4、海外居留福…

前端问题记录

jenkins安装vue依赖报错 jenkins 安装依赖&#xff0c;报错cannot find module ‘/root/.jenkins/workspace/项目路径/node_modules/xxxx’&#xff0c;如图上 解决&#xff1a;执行 npm install vue/cli-service --unsafe-perm&#xff0c;再执行npm i

解决 MATLAB 遗传算法中 exitflg=4 的问题

一、优化问题简介 以求解下述优化问题为例&#xff1a; P 1 : min ⁡ p ∑ k 1 K p k s . t . { ∑ k 1 K R k r e q l o g ( 1 α k ∗ p k ) ≤ B b s , ∀ k ∈ K p k ≥ 0 , ∀ k ∈ K \begin{align} {P_1:}&\mathop{\min}_{\bm{p}}{ \sum\limits_{k1}^K p_k } \no…

通过 Nginx 代理实现网页内容替换

突发奇想&#xff0c;用 Nginx 代理一个网站&#xff0c;把网站的一些关键字替换掉&#xff0c;蛮有意思的。 如下图&#xff1a; 一、编译安装 Nginx 一般 Nginx 中不包含 subs_filter 文本替换的模块&#xff0c;需要自己手动编译安装&#xff0c;步骤如下。 克隆 subs_fi…

物联网产品设计,聊聊设备OTA的升级

物联网产品设计部分的OTA设备固件是一个非常重要的部分&#xff0c;能够实现升级用户服务、保障系统安全等功能。 在迅速变化和发展的物联网市场&#xff0c;新的产品需求不断涌现&#xff0c;因此对于智能硬件设备的更新需求就变得空前高涨&#xff0c;设备不再像传统设备一样…

linux循环调度执行

9.2 循环调度执行 9.2.1 简介 cron的概念和crontab是不可分割的。 ​ crontab是一个命令&#xff0c;常见于Unix和Linux的操作系统之中用于设置周期性被执行的指令。 ​ 该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执…

移除石子使总数最小(LeetCode日记)

LeetCode-1962-移除石子使总数最小 题目信息: 给你一个整数数组 p i l e s piles piles &#xff0c;数组 下标从 0 0 0 开始 &#xff0c;其中 p i l e s [ i ] piles[i] piles[i] 表示第 i i i 堆石子中的石子数量。另给你一个整数 k k k &#xff0c;请你执行下述操作…

Django开发2

Django开发2 Django开发1.新建项目2.创建app3.设计表结构&#xff08;django&#xff09;4.在MySQL中生成表5.静态文件管理6.部门管理7.模板的继承8.用户管理8.1 初识Form1. views.py2.user_add.html 8.3 ModelForm&#xff08;推荐&#xff09;0. models.py1. views.py2.user_…

机器人创新实验室任务三参考文档

一、JAVA环境配置 需要在Linux里面下载并且安装java。 sudo apt-get install openjdk-17-jre-headless 打开终端并且运行指令&#xff0c;用apt下载安装java。官方用的好像是java11&#xff0c;我安装的是java17。 如果无法定位软件安装包&#xff0c;可以试试更新一下 sudo …

阿里云助力企业出海六大优势

企业基于阿里云出海六大优势&#xff1a;基础设施与网络覆盖全球多地域、国际级合规资质与认证、国内外一致的产品体验、富有竞争力的技术方案、丰富的行业实践与案例和贴身的本地化服务响应&#xff0c;阿里云百科aliyunbaike.com分享阿里云出海六大优势&#xff1a; 阿里云出…

直接插入排序【从0-1学数据结构】

文章目录 &#x1f497; 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…

JavaScript中的正则表达式构造函数和正则表达式字面量

在JavaScript中&#xff0c;我们可以使用两种方式创建正则表达式&#xff1a;通过正则表达式字面量和通过正则表达式构造函数。 正则表达式字面量是用斜杠&#xff08;/&#xff09;包围的模式&#xff0c;例如&#xff1a; var regex /pattern/;正则表达式构造函数是通过Re…

统计和绘图软件GraphPad Prism mac功能特点

GraphPad Prism mac是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据。用户可以轻松…

大白鲨生成Windows木马(仅供参考不可实践)

一、学习方法 一个正确的学习方法往往比学习更为重要 方法一&#xff1a;学习技术的本质性作用 &#xff08;第一性定律&#xff09; — 帮助我们解决的问题是什么 — 产生的原因/价值 方法二&#xff1a;在工作中到底如何使用&#xff1f; 方法三&#xff1a;技术是由人…