详解spring6.0新特性汇总

news2024/11/19 19:19:00

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:目标方法参数
 *
 */
 @CallerSensitive
 public 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.创建enchance
      Enhancer enhancer=new Enhancer();
      //2.给enhancer对象设置setSuperclass
        enhancer.setSuperclass(target.getClass());

        //3.给enhancer设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            /**
             *
             * @param proxy 代理对象
             * @param method 代理对象正在调用的方法对象
             * @param args  代理对象方法传递的参数
             * @param methodProxy 方法的代理对象
             * @return
             */
            @Override
            public 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.创建ProxyBeanFactoryCglib
        ProxyBeanFactoryCglib 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.coloradmin.cn/o/1434799.html

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

相关文章

【如何学习CAN总线测试】——Vector VH6501干扰仪测试BusOff

系列文章目录 【如何学习CAN总线测试】系列文章目录汇总 文章目录 系列文章目录前言一、环境搭建1.硬件环境2.软件环境3.原理 二、测试方法1.打开Disturbance(CAN)工程2.使能 VH65013.MainConfigPanel面板4.TriggerConfiguration配置5.Sequence Configuration配置6.干扰结果 前…

论文阅读-通过云特征增强的深度学习预测云工作负载转折点

论文名称&#xff1a;Cloud Workload Turning Points Prediction via Cloud Feature-Enhanced Deep Learning 摘要 云工作负载转折点要么是代表工作负载压力的局部峰值点&#xff0c;要么是代表资源浪费的局部谷值点。预测这些关键点对于向系统管理者发出警告、采取预防措施以…

c语言动态数组的实现

动态数组是在程序运行时动态分配内存空间的数组&#xff0c;可以根据需要随时改变大小。在C语言中&#xff0c;动态数组通常通过指针和malloc函数来实现。 使用malloc函数动态分配内存空间&#xff1a; int *arr; int size 10; arr (int*)malloc(size * sizeof(int));使用r…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题一解析(选择题)

CSP-J入门组初赛模拟题一&#xff08;选择题&#xff09; 1、以下与电子邮件无关的网络协议是 A、SMTP B、POP3 C、MIME D、FTP 答案&#xff1a;D 考点分析&#xff1a;主要考查小朋友们网络相关知识的储备&#xff0c;FTP是文件传输协议和电子邮件无关&#xff0c;所以…

高校建设AI算力平台方案探索

近年来&#xff0c;人工智能行业发展迅速&#xff0c;在自动驾驶、金融、医疗、教育等行业广泛应用。尤其是ChatGPT发布以后更是掀起了生成式AI的热潮&#xff0c;国内各大互联网厂商也相继发布自己的AI大模型。这也造成了大量的AI人才缺口&#xff0c;同时促进了高校的AI专业建…

VitePress-09-文档中引入静态资源-图片-相对路径的方式

补充-markdown文档中引入图片的格式 格式如下 &#xff1a;![图片异常时展示的文案](图片资源的路径) 图片资源的路径 &#xff1a; 可以是【绝对路径】&#xff0c;也可以是【相对路径】&#xff0c;关键是可以正确的找到该资源。 引入静态资源的说明 需要注意的是&#xff0c…

第01课:自动驾驶概述

文章目录 1、无人驾驶行业概述什么是无人驾驶智慧出行大趋势无人驾驶能解决什么问题行业趋势无人驾驶的发展历程探索阶段&#xff08;2004年以前&#xff09;发展阶段&#xff08;2004年-2016年&#xff09;成熟阶段&#xff08;2016年以后&#xff09; 2、无人驾驶技术路径无人…

【码农新闻】 用HTTPS,还能被查出浏览记录吗 常用且好用的在线工具......

目录 【码农新闻】 用HTTPS&#xff0c;还能被查出浏览记录吗 常用且好用的在线工具...... 用HTTPS&#xff0c;还能被查出浏览记录吗常用且好用的在线工具尤雨溪 文章所属专区 码农新闻 欢迎各位编程大佬&#xff0c;技术达人&#xff0c;以及对编程充满热情的朋友们&#xf…

代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出…

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

01背包问题 动态规划

01背包问题 动态规划 01背包问题 动态规划写了点代码 C#实现程序运行结果代码和程序已经上传 01背包问题 动态规划 很有意思的问题。 写了点代码 C#实现 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Ta…

java之spring事务管理

spring事务管理 1. 事务概念 事务是一组操作的集合&#xff0c;是一个不可 分割的工作单位&#xff0c; 这些操作&#xff0c;要么同时成功&#xff0c;要么同时失败 和mysql数据库的事务管理道理一样。开启事务 start 提交事务 commit 回滚事务 rollback2.操作实现 Transa…

系统架构设计师考试大纲2023

一、 考试方式&#xff08;机考&#xff09; 考试采取科目连考、 分批次考试的方式&#xff0c; 连考的第一个科目作答结束交卷完成后自动进 入第二个科目&#xff0c; 第一个科目节余的时长可为第二个科目使用。 高级资格&#xff1a; 综合知识科目考试时长 150 分钟&#xff…

8868体育助力意甲国际米兰俱乐部 国米成功续约球员

意甲的国际米兰俱乐部是8868合作体育球队之一&#xff0c;根据国米新闻网站的消息&#xff0c;在与劳塔罗、巴雷拉续签之前&#xff0c;国际米兰将会首先签下约迪马尔科。 有消息说&#xff0c;国际米兰的确有和巴雷拉续约的打算&#xff0c;但是根据国际米兰的计划&#xff0…

YoloV8改进策略:Neck改进:HAM混合注意力机制改进YoloV8|多种改进,多种姿势涨点|代码注释详解

摘要 HAM通过快速一维卷积来缓解通道注意机制的负担,并引入通道分离技术自适应强调重要特征。HAM作为通用模块,在CIFAR-10、CIFAR-100和STL-10数据集上实现了SOTA级别的分类性能。 论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0031320322002667?vi…

迁移学习实现图片分类任务

导入工具包 import time import osimport numpy as np from tqdm import tqdmimport torch import torchvision import torch.nn as nn import torch.nn.functional as Fimport matplotlib.pyplot as plt %matplotlib inline# 忽略烦人的红色提示 import warnings warnings.fi…

Haas 开发板连接阿里云上传温湿度和电池电压

目录 一、在阿里云上创建一个产品 二、开发环境的介绍 三、创建wifi示例 四、编写SI7006和ADC驱动 五、wifi配网 六、主要源码 七、查看实现结果 一、在阿里云上创建一个产品 登录自己的阿里云账号&#xff0c; 应该支付宝&#xff0c;淘宝账号都是可以的。 接着根据需求…

【leetcode题解C++】77.组合 and 216.组合总和III and 17.电话号码的字母组合

77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a…

5 分钟让你了解什么是搜索引擎

文章目录 搜索引擎概述基于业务模式分类垂直搜索&#xff08;垂搜&#xff09;通用搜索&#xff08;通搜&#xff09;本地搜索引擎 基于技术实现分类基于关键词的搜索引擎&#xff08;Keyword-based Search Engine&#xff09;语义搜索引擎&#xff08;Semantic Search Engine&…

LeetCode 热题 100 | 链表(中下)

目录 1 19. 删除链表的倒数第 N 个节点 2 24. 两两交换链表中的节点 3 25. K 个一组翻转链表 4 138. 随机链表的复制 菜鸟做题第三周&#xff0c;语言是 C 1 19. 删除链表的倒数第 N 个节点 到底是节点还是结点。。。 解题思路&#xff1a; 设置双指针 left 和 ri…