详解spring6.0新特性汇总

spring6新特性汇总

part1 spring6.0新特性

spring6.0 2022年11月。新一代框架带jdk17&jakarta ee9
在这里插入图片描述
在这里插入图片描述

https://www.graalvm.org/

part2 AOP&事务

1.AOP:面向切面编程

  • 通过预编译方式和运行期动态 代理实现程序功能的统一维护的一种技术。

  • 使用场景:
    权限的校验
    日志记录
    事务处理
    性能检测

  • 常用代理方式

    1. jdk动态代理,只能代理接口
    2. Cglib动态代理,spring提供,只能代理类
  • jdk动态代理:Proxy类,该类中有一个静态方法,可以创建代理对象

 /***classloader:类加载器,加载代理对象,Class对象就可以获取类加载器**Class<?>[] interfaces 接口的字节码数组对象,通过该参数,生成代理对象,可以知道该接口*有那些方法**InvocationHandler h :执行句柄,也是一个接口; 当生成代理对象后,调用原目标方法的时候,自动进入到InvocationHandler中invoke方法;**invoke(Object proxy,Method method,Object[] args):*   Object proxy:代理对象*   Method method:代理对象目前正在调用的方法,invoke(Object ...param)*   Object[] args:目标方法参数**/@CallerSensitivepublic static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) {Objects.requireNonNull(h);@SuppressWarnings("removal")final Class<?> caller = System.getSecurityManager() == null? null: Reflection.getCallerClass();/** Look up or generate the designated proxy class and its constructor.*/Constructor<?> cons = getProxyConstructor(caller, loader, interfaces);return newProxyInstance(caller, cons, h);}
  • Cglib动态代理
    Enhance cglib的核心类,主要作用是先设置属性,再创建代理对象

    1. setSuperClass(被代理对象.getClass()):设置目标类的字节码对象
    2. setCallback(MethodInceptor对象)设置回调函数,让代理对象执行的时候进入回调函数执行具体逻辑;
      该方法的参数 :callback接口,传递的是子接口MethodInceptor匿名内部类
    3. create() 创建代理对象的方法

    自定义实现cglib动态代理:

    1.导入cglib依赖库

    <!--使用Cglib动态代理,需要导入spring-context-->
    <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.3</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.1.3</version></dependency>
    

在这里插入图片描述

2.代码实现:

package com.spring;public class PersonService {public void work(){System.out.println("我爱上班");}
}package com.spring;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;/*** 创建代理对象*/
public class ProxyBeanFactoryCglib {//1.定义代理对象private  PersonService target;//2.构造方法初始化代理对象public ProxyBeanFactoryCglib(PersonService target){this.target=target;}//3.编写一个获取代理对象的方法public Object getProxy(){//1.创建enchanceEnhancer enhancer=new Enhancer();//2.给enhancer对象设置setSuperclassenhancer.setSuperclass(target.getClass());//3.给enhancer设置回调函数enhancer.setCallback(new MethodInterceptor() {/**** @param proxy 代理对象* @param method 代理对象正在调用的方法对象* @param args  代理对象方法传递的参数* @param methodProxy 方法的代理对象* @return*/@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {//1.通过method对象,反射调用原始类的方法method.invoke(target);//2.补充一个记录日志的功能System.out.println("记录日志,记录工作状态。。");return null;}});//4.调用enhancer的create方法,创建代理对象return enhancer.create();}
}package com.spring;/*** 测试类*/
public class PersonServiceTest {public static void main(String[] args) {//1.创建PersonService 这个的被代理对象PersonService personService=new PersonService();//2.创建ProxyBeanFactoryCglibProxyBeanFactoryCglib proxyBeanFactoryCglib=new ProxyBeanFactoryCglib(personService);//3.调用ProxyBeanFactoryCglib的getProxy方法PersonService proxy= (PersonService) proxyBeanFactoryCglib.getProxy();//4.调用work方法,看是否有日志proxy.work();}
}
AOP术语:
  1. 目标类target:就是需要增强的那个类
  2. 代理类proxy:就是自定义的代理的对象
  3. 连接点joinPoint:程序执行的一个特定位置,spring仅支持方法的连接点
  4. 切入点pointCut:就是在目标类中实际增强的方法
  5. 织入weave:就是将代理类中需要增强的方法放入到目标类中去执行的过程
  6. 引介Introduction:引介是一种特殊的 增强,他为类添加一些属性和方法
  7. 通知advice:将代理对象中的方法应用到目标类 的过程中产生的结果
  8. 切面aspect:所有的切入点和代理对象的方法组成在一起构成了切面
切点表达式:

在这里插入图片描述

在这里插入图片描述

5种通知方式:
  1. 前置通知(beforeAdvice):增强的逻辑在目标方法之前执行
  2. 后置通知(afterReturningAdvice):增强的逻辑在目标方法之后执行
  3. 异常通知(throwableAdvice):目标方法出现异常,则增强逻辑运行
  4. 环绕通知(aroundAdvice):增强的逻辑在目标方法的前后执行
  5. 最终通知(afterAdvice):增强的逻辑在目标方法的之后执行,不管有没有异常都会执行

2.事务:保证一组操作执行过程要么成功要么失败

  1. 目的:保持多并发情况下数据一致性
  2. 目的:如果出现错误的操作可以进行修改

事务的特性(ACID):

  1. 原子性:一个事务是最小的执行单元,不可分割
  2. 一致性:事务执行前后,数据要保持 一致性
  3. 持久性:事务一旦提交或回滚,在数据库中持久的改变
  4. 隔离性:隔离性用来保证多个用户操作数据库的同一份数据,不会受到相关干扰

并发操作数据库会出现问题

  1. 脏读:一个事务读到了另一个事务的还没有提交数据。
    在这里插入图片描述

  2. 不可重复读:一个事务中多次读到的数据不一致。一个事务读到了另一个事务修改后的数据。

在这里插入图片描述

  1. **幻读(虚读)😗*一个事务读到了insert的数据。
    在这里插入图片描述
隔离级别出现的问题
读未提交(read uncommited)都会出现
读已提交(read committed)不会出现脏读,但会出现不可重复读和幻读(oracle 默认隔离级别)
可重复读(repeatable read)不会出现脏读 不可重复读,但会出现幻读(mysql的默认隔离基本)
串行化(serializable)以上问题都不会出现(不支持并发)
spring 事务管理 api
  1. PlatformTransactionManager:平台事务管理器 ->DataSourceTransactionManager
    常用方法:
    commit:提交事务
    rollback回滚事务
    transactionStatus getTrasaction(TransactionDefinition definition)

  2. TransactionDefinition :事务定义信息(隔离、传播、超时、只读)
    a. ISOLATION_XXX 设置事务的隔离级别

    b. PROPAGATION_XXX 事务传播行为
    c. TIMEOUT_DEFAULT 默认超时时间 -1
    d. isReadOnly() 事务是否只读(增删改 false) 查询 true

     传播行为图解:
    

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

package org.springframework.transaction;import java.io.Flushable;public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
/**
*事务保存点
*/default boolean hasSavepoint() {return false;}default void flush() {}
}

part3 提前编译:AOT

AOT概述
  1. 概念介绍:

    • AOT是 Ahead-of-Time的缩写,意为提前编译
    • 对比AOT和JIT(Just-in-time)编译的区别:AOT在程序运行之前将代码编译成本地机器码;JIT是在程序运行时动态将代码编译成机器码;
  2. 工作原理:

    • 描述AOT编译的工作原理,即在程序部署或安装时将代码转换为本地机器码
    • 强调AOT编译可以提前优化代码,从而在程序运行时无需再进行实时编译,从而获得更快的启动时间和更稳定的性能
    • 提前编译的过程
      在这里插入图片描述
  3. 使用场景

    • AOT编译适用的常见,eg: 移动应用程序、嵌入式系统、WebAssembly、服务器应用程序、安全性要求较高的常见
    • AOT编译并非适用所有情况,需要根据应用程序的特点和需求选择编译策略
  4. AOT的优缺点:

    • 优点:
      a. 更快的启动时间:AOT编译将应用程序在部署前预先编译成本地机器码,因此应用程序启动可以显著降低解释执行的开销,从而减少启动时间

      b.减少运行时内存使用:由于代码被提前编译,AOT可以消除JIT编译器在运行时生成的中间代码和优化信息,从而降低应用程序的内存占用.
      c.更好的安全性:AOT编译可以减少运行时的动态代码生成,从而减少潜在的安全漏洞,因为攻击者无法利用动态生成的代码进行攻击

    • 缺点:
      a.冷启动时间:AOT编译会将应用程序的代码提前编译成机器码,可导致应用程序的初始启动时间增加,特别大型复杂的应用程序
      b.预先编译的局限性:由于AOT编译时需要提前确定代码的结构和执行路径,可能无法充分利用一些运行时信息进行优化,从而降低一些特定场景下的性能
      c.多平台支持:AOT编译通常会生成特定平台的本地机器码,可能需要针对不同的目标平台进行不同的编译,增加了构建和发布的复杂性

part4 GraalVM

GraalVM介绍

GraalVM(格拉尔虚拟机)是一种高性能的通用虚拟机,由Oracle Labs开发。

GraalVM Native Image(简称Native Image):是GraalVM的一个特性,是一种用于将java应用程序编译成本地机器代码的工具,它提供了将java应用程序编译成本地机器代码的能力,从而使得应用程序可以在没有java虚拟机情况下直接运行

AOT和GraalVM的关系

GraalVM支持两种编译方式,并且它将AOT编译与JIT编译结合在一起,形成了一种称为 "GraalVM Native image"的功能。GraalVM Native Image允许将整个java应用程序(或特定部分)预先编译成本地机器码,生成一个可执行的本地二进制文件。这样的本地二进制文件可以独立运行,无需java虚拟机的存在,从而显著降低了应用程序的启动时间和内存占用.

Native image的用途和优势:
  1. 快速启动和低内存占用:与传统的java应用相比,Native Image编译的应用程序可以在启动时间上有显著优势,由于编译为本地机器代码,不需要启动JVM,因此启动时间明显缩短,而且应用程序的内存占用也会减少。
  2. 镜像化和容器化:Native Image使得将Java应用程序打包为轻量级容器变得更容易,因为不需要依赖Java虚拟机的存在。这样可以减少容器的体检,加快部署速度,并降低资源消耗。
  3. 安全性:使用Native Image编译的应用程序可以减少攻击面,因为不需要依赖外部的JVM或JRE,从而减少一些与Java运行时相关的安全风险
  4. AOT编译:GraalVM Native Image使用AOT编译技术,意味着代码在部署之前就已经被编译成机器代码,而不是在运行时进行即时编译。有助于进一步优化性能,并提前发现潜在的编译错误.

Native Image的限制:

  1. 启动时间优化:尽管Native Image可以大大减少启动时间,但在构建过程中可能需要额外的时间和资源
  2. 动态特性限制:由于编译时需要明确的知道应用程序的所有依赖,所以动态特性(eg:反射)的使用会受到限制
  3. 操作系统和架构限制:由于native image是提前编译的,所以生成的本地可执行文件将与特定的操作系统和架构相关

part5 native image

Native image安装
  1. 下载安装

    访问地址: https://www.graalvm.org/

在这里插入图片描述

选择版本:
在这里插入图片描述

配置环境变量: GRAALVM_HOME

在这里插入图片描述

给path增加%GRAALVM_HOME%\bin;
在这里插入图片描述

注意:给Path增加%GRAALVM_HOME%bin;一定要放在%JAVA_HOME%bin;之前。不然执行java -version不生效,只能看到jdk配置的信息,看不到GraalVM信息;建议就 把这两个放在path开头

执行 java -version:
在这里插入图片描述

执行gu install native-image: 安装native-image

在这里插入图片描述

  1. 安装Visual Studio:
    构建环境需要用的c++的环境,因此要安装visual Studio,该软件包含了c++以及其他环境.
    step1.下载visual studio
    https://visualstudio.microsoft.com/zh-hans/downloads/

    step2 勾选安装桌面c++库

step3 配置 VC INCLUDE 环境变量:

在这里插入图片描述

在这里插入图片描述
注意:这里的include 配置有问题,请参考下面的配置

step4 打开x64 Native Tools ,执行cl命令验证环境是否已经配置正确:
在这里插入图片描述
在这里插入图片描述

  1. AOT Native Image的构建与使用

​ windows kits目录默认在C:\Program Files (x86)\Windows Kits 下

配置include:
C:\Program Files\Microsoft Visual Studio\2022\Community\

​ C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt

​ C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um
​ C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared
在这里插入图片描述

配置LIB:
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0\ucrt\x64

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130

在这里插入图片描述

在这里插入图片描述

给环境变量path增加如下:
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64

执行 javac BB.java 生成字节码文件
在这里插入图片描述

执行 native-image BB 生成镜像文件
在这里插入图片描述
在这里插入图片描述

执行BB.exe镜像文件

在这里插入图片描述

chatGPT easycode :AI编写代码工具

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

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

相关文章

2011-2022省级金融科技指数(基于百度搜索指数)

本文手工整理了2011-2022年金融科技相关关键词在各个省份的百度搜索指数&#xff0c;并汇总成金融科技指数。具体步骤如下。首先&#xff0c;基于商业银行小微企业信贷业务实践&#xff0c;参考沈悦和郭品&#xff08;2015&#xff09;&#xff0c;以及盛天翔和范从来&#xff…

云上未来:探索云计算的技术变革与应用趋势

一、云计算的起源和演进 1.1 早期计算模型 在探讨云计算的起源和演进之前&#xff0c;理解早期的计算模型对于构建全面的视角至关重要。早期计算模型的发展奠定了云计算的基础&#xff0c;为其演进提供了技术和理念的支撑。 1.1.1 集中式计算模型 在计算技术的早期阶段&…

map容器的基本概念及常用成员函数

map&#xff08;字典&#xff09;的基本概念 map是一个将一个值映射到另一个值的一种数据结构。&#xff08;即两个值之间有一一对应关系&#xff09;。 map的所有元素都是pair类型&#xff0c;pair中的第一个元素称为键值&#xff08;key&#xff09;第二个元素称为实值&…

OpenAI开放新功能,可通过@一键调用任意GPTs

人工智能技术的快速发展为我们的生活带来了许多便利和创新。作为人工智能领域的重要成果之一&#xff0c;OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型在自然语言处理方面取得了巨大的突破。 近日&#xff0c;OpenAI宣布推出了GPT Mentions功能…

解析Python中HTTP代理的常见问题

在Python编程中&#xff0c;HTTP代理是一个经常被提及的概念&#xff0c;尤其在处理网络请求和爬虫时。但与此同时&#xff0c;使用HTTP代理也经常会遇到一些令人头疼的问题。接下来&#xff0c;就让我们一起解析一下Python中使用HTTP代理时常见的那些问题。 1. 代理服务器无响…

大学医学统计学搜题软件?大学生必备应用:推荐几款高效的搜题工具 #经验分享#知识分享#笔记

大学生活中&#xff0c;选择适合自己的学习工具能够提高学习效率&#xff0c;让学习更加轻松愉快。 1.灵兔搜题 这是一个公众号 搜题速度极快&#xff0c;秒级响应&#xff01;不再浪费时间&#xff0c;高效解决难题。 下方附上一些测试的试题及答案 1、拟南芥中C类基因发生…

centos7安装oracle

1 安装虚拟机 设置4G内存&#xff0c;硬盘40G 2 配置网络环境 2.1配置主机名 # vi /etc/hostname 修改为 oracle2.2 配置IP地址 # vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改 BOOTPROTO"static" ONBOOT"yes" IPADDR192.168.109.110 NETMAS…

VMware无法检测到插入的USB设备,虚拟机插拔USB无反应

原本正常使用的VMware虚拟机&#xff0c;在进行了重装软件后&#xff0c;发现虚拟机插拔USB设备都无法检测到&#xff0c;没有任何的反应和提示。 通过一系列的操作发现&#xff0c;在新安装了VMware workstation 软件后&#xff0c;存在一定的概率性会发生VMware虚拟机无法自…

java并发执行批量插入

java并发执行批量插入 1、mybatis-plus批量插入 long start System.currentTimeMillis();int num 5000; //一次批量插入的数量int j 0;for (int i 0;i<20;i){List<User> userList new ArrayList<>();while (true){j;User user new User();user.setUserP…

【论文笔记】GS++: Error Analyzing and Optimal Gaussian Splatting

原文链接&#xff1a;https://browse.arxiv.org/abs/2402.00752 1. 引言 许多基于3D高斯溅射&#xff08;3D-GS&#xff09;的方法针对稀疏视图场景的鲁棒性、性能和存储效率进行增强&#xff0c;但没有专门处理高斯投影的误差。 3D-GS以一组图像和相机通过SfM校准产生的点云…

LabVIEW电能质量监测系统

LabVIEW电能质量监测系统 随着全球能源需求的增加以及能源危机的加剧&#xff0c;对电能的有效利用和质量监控变得越来越重要。特别是在电力系统中&#xff0c;电能质量的监测对于保证电力设备的稳定运行和提高能源利用效率具有重要意义。采用LabVIEW软件开发了一套高效的电能…

使用PHPStudy搭建Cloudreve网盘服务

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

充电桩项目实战:短信功能 分布式限流

你好&#xff0c;我是田哥 最近&#xff0c;我在对充电桩项目进行微服务升级中&#xff0c;肯定会遇到一些问题 前面分享了&#xff1a;充电桩项目实战&#xff1a;搞定多数据源&#xff01; 题外话&#xff1a;如果想年后找到更好的工作&#xff0c;推荐看这篇文章&#xff1a…

高端酒店宴会包间桌位预定小程序h5开源版开发

高端酒店宴会包间桌位预定小程序h5开源版开发 餐厅预定桌位系统&#xff0c;支持多店切换预约&#xff0c;提供全部前后台无加密源代码和数据库 功能特性 为你介绍餐厅预订系统的功能特性 多端适配 采用uniapp,目前适配小程序和微信H5 多店铺 支持多店铺预定 付费和免费预定 支…

『运维备忘录』之 Systemd 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

11月最新版付费进群源码自动定位+开源

Nginx 1.22.1 php5.6 mysql5.6 数据库配置&#xff1a;/config/database.php 配置后台域名&#xff1a;config/extra/ip.php 设置伪静态thinkphp 后台账号88886666 密码12345 代码结构 关键代码剖析 <?php // ----------------------------------------------------…

continue语句

一、continue语句 1、continue语句介绍 2、continue语句流程图 3、快速入门案例 4、continue语句的标签

毫米波雷达在汽车领域的原理、优势和未来趋势

1 毫米波雷达的原理 汽车引入毫米波雷达最初主要是为了实现盲点监测和定距巡航。毫米波实质上是电磁波&#xff0c;其频段位于无线电和可见光、红外线之间&#xff0c;频率范围为10GHz-200GHz。工作原理类似一般雷达&#xff0c;通过发射无线电波并接收回波&#xff0c;利用障…

理论与实战:一篇看懂Python词云

实现原理 导入一篇txt文档&#xff0c;使用jieba库对文档中的文字进行分词&#xff0c;计算各个词汇出现的频率&#xff0c;使用wordcloud库按照词汇频率的大小生成词云。 注意&#xff0c;不是使用wordcloud.generate()&#xff0c;这个方法没有按照词汇频率的方式实现词云 停…

Linux 驱动开发基础知识——总线设备驱动模型(七)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…