详解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.hqwc.cn/news/454430.html

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

相关文章

SpringBoot整合Flowable最新教程(一)Flowable介绍

一、Flowable 入门介绍 代码实现文章&#xff1a;SpringBoot整合Flowable最新教程&#xff08;二&#xff09; 官网地址&#xff1a;https://www.flowable.org/   Flowable6.3中文教程&#xff1a;中文教程地址   可以在官网下载对应的jar包在本地部署运行&#xff0c;官方…

Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)

目录 **Spring5** 框架新功能系列一Spring 5.0 框架自带了通用的日志封装Spring5 **框架核心容器**支持Nullable **注解****Spring5** **核心容器支持函数式风格** GenericApplicationContext**Spring5** **支持整合** JUnit5感谢阅读 开篇: 欢迎再次来到 Spring 5 学习系列&am…

【Linux】文件周边002之初步理解文件管理(打开的文件)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.&#xff08;打开…

C++ 类与对象(下)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3.友元 3.1友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 【本节目标】 1. 再谈构造函数 2. Static成员…

动态颗粒背景,适合VUE、HTML前端显示

动态颗粒背景&#xff0c;适合做背景使用&#xff0c;VUE、HTML前端显示直接看效果 废话不多说直接上代码&#xff1b; 一、html 代码部分 <template><div id"login"><div class"container"><div class"login-form"&g…

情人节浪漫礼物指南:精选共享甜蜜时光的情人节礼物推荐

情人节&#xff0c;代表着浪漫和爱意的纪念日&#xff0c;总能激起每个人内心深处的悸动&#xff0c;促使他们渴望与爱侣共度美好时刻。为爱人精心选择一份情人节礼物&#xff0c;不仅是对他们深情的告白&#xff0c;更是将这份爱升华&#xff0c;让它成为两人爱情故事里的宝贵…

Swift 隐藏宝藏:“逆天改命”调整方法重载(function overloading)优先级

概览 在 Swift 语言中有很多隐藏“宝藏”悄悄深埋在不为人知的角落&#xff0c;静静等待着有缘秃头码农们的大力挖掘。 而在这里&#xff0c;我们将介绍 Swift 语言中一个非常有用的秘技&#xff1a;方法重载优先级判断以及如何改变它。 在本篇博文中&#xff0c;您将学到如下…

跟着pink老师前端入门教程-day18

3、CSS3 3D转换 生活中的环境是3D的&#xff0c;照片就是3D物体在2D平面呈现的例子 特点&#xff1a;近大远小&#xff0c;物体后面遮挡不可见 3.1 三维坐标系 三维坐标系其实就是指立体空间&#xff0c;立体空间是由3个轴共同组成的 x轴&#xff1a;水平向右 注意&#x…

服务器和云服务器哪个更安全?

随着云计算技术的不断发展&#xff0c;越来越多的企业开始选择使用云服务器来存储和处理数据。然而&#xff0c;对于一些企业来说&#xff0c;他们可能更倾向于使用传统的服务器。在这种情况下&#xff0c;安全性成为了一个重要的考虑因素。那么&#xff0c;服务器和云服务器哪…

JavaWeb之HTML-CSS --黑马笔记

什么是HTML ? 标记语言&#xff1a;由标签构成的语言。 注意&#xff1a;HTML标签都是预定义好的&#xff0c;HTML代码直接在浏览器中运行&#xff0c;HTML标签由浏览器解析。 什么是CSS ? 开发工具 VS Code --安装文档和安装包都在网盘中 链接&#xff1a;https://p…

基础数学问题整理

最近刷了一些关于基础数学问题的题目&#xff0c;大致是关于组合数、分解质因数还有一些思维题&#xff0c;题目来自洛谷的【数学1】基础数学问题 - 题单 - 洛谷&#xff0c;很多思路还是之前没有见过的&#xff0c;都是简单到一般难度的题目&#xff08;橙、题、绿题&#xff…

解读域用户属性值UserPrincipalName

在Active Directory (AD) 环境中&#xff0c;UserPrincipalName&#xff08;UPN&#xff09;属性是一个用于标识域用户的特殊属性&#xff0c;其解读如下&#xff1a; 全称&#xff1a;User Principal Name用途&#xff1a;UserPrincipalName 是一个基于Internet电子邮件地址格…