Java_Spring:13. Spring5 的新特性

news/2024/6/3 22:23:17 标签: java, spring, eclipse

目录

1 与 JDK 相关的升级

1.1 jdk 版本要求:

1.2 利用 jdk8 版本更新的内容

2 核心容器的更新

3 JetBrains Kotlin 语言支持

4 响应式编程风格

5 Junit5 支持

6 依赖类库的更新


  • 1 与 JDK 相关的升级

    • 1.1 jdk 版本要求:

      • spring5.0 在 2017 年 9 月发布了它的 GA(通用)版本。该版本是基于 jdk8 编写的,所以 jdk8 以下版本将无法使用。同时,可以兼容 jdk9 版本。
      • tomcat 版本要求 8.5 及以上。
      • 注:
        • 使用 jdk8 构建工程,可以降版编译。但是不能使用 jdk8 以下版本构建工程。
        • 由于 jdk 和 tomcat 版本的更新,IDE 也需要同时更新。(目前使用的 eclipse 4.7.2)
    • 1.2 利用 jdk8 版本更新的内容

      • 第一:基于 JDK8 的反射增强
        • 请看下面的代码:
        • java">public class Test {
          
              //循环次数定义:10 亿次
              private static final int loopCnt = 1000 * 1000 * 1000;
              
              public static void main(String[] args) throws Exception {
                  //输出 jdk 的版本
                  System.out.println("java.version=" + System.getProperty("java.version"));
                  t1();
                  t2();
                  t3();
              }
          
              // 每次重新生成对象
              public static void t1() {
                  
                  long s = System.currentTimeMillis();
                  
                  for (int i = 0; i < loopCnt; i++) {
                      Person p = new Person();
                      p.setAge(31);
                  }
              
                  long e = System.currentTimeMillis();
                  System.out.println("循环 10 亿次创建对象的时间:" + (e - s));
              }
          
              // 同一个对象
              public static void t2() {
          
                  long s = System.currentTimeMillis();
                  Person p = new Person();
                  
                  for (int i = 0; i < loopCnt; i++) {
                      p.setAge(32);
                  }
          
                  long e = System.currentTimeMillis();
                  System.out.println("循环 10 亿次给同一对象赋值的时间: " + (e - s));
              }
          
              //使用反射创建对象
              public static void t3() throws Exception {
                  
                  long s = System.currentTimeMillis();
                  Class<Person> c = Person.class;
                  Person p = c.newInstance();
                  Method m = c.getMethod("setAge", Integer.class);
          
                  for (int i = 0; i < loopCnt; i++) {
                      m.invoke(p, 33);
                  }
          
                  long e = System.currentTimeMillis();
                  System.out.println("循环 10 亿次反射创建对象的时间:" + (e - s));
              }
          
              static class Person {
                  
                  private int age = 20;
              
                  public int getAge() {
                      return age;
                  }
          
                  public void setAge(Integer age) {
                      this.age = age;
                  }
              }
          }
        • jdk1.8 版本(就是 JDK8)运行时间如下:
        • 当切换到 jdk1.7 版本之后,运行时间如下:
        • 有此我们可以看出,在反射创建对象上,jdk8 确实做了加强。
      • 第二:@NonNull 注解和@Nullable 注解的使用
        • 用 @Nullable 和 @NotNull 注解来显示表明可为空的参数和以及返回值。这样就够在编译的时候处理空值而不是在运行时抛出 NullPointerExceptions。
      • 第三:日志记录方面
        • Spring Framework 5.0 带来了 Commons Logging 桥接模块的封装, 它被叫做 spring-jcl 而不是标准的 Commons Logging。当然,无需任何额外的桥接,新版本也会对 Log4j 2.x, SLF4J, JUL ( java.util.logging) 进行自动检测。
  • 2 核心容器的更新

    • Spring Framework 5.0 现在支持候选组件索引作为类路径扫描的替代方案。该功能已经在类路径扫描器中添加,以简化添加候选组件标识的步骤。
    • 应用程序构建任务可以定义当前项目自己的 META-INF/spring.components 文件。在编译时,源模型是自包含的,JPA 实体和 Spring 组件是已被标记的。
    • 从索引读取实体而不是扫描类路径对于小于 200 个类的小型项目是没有明显差异。但对大型项目影响较大。加载组件索引开销更低。因此,随着类数的增加,索引读取的启动时间将保持不变。
    • 加载组件索引的耗费是廉价的。因此当类的数量不断增长,加上构建索引的启动时间仍然可以维持一个常数, 不过对于组件扫描而言,启动时间则会有明显的增长。
    • 这个对于处于大型 Spring 项目的开发者所意味着的,是应用程序的启动时间将被大大缩减。虽然 20或者 30 秒钟看似没什么,但如果每天要这样登上好几百次,加起来就够你受的了。使用了组件索引的话,就能帮助你每天过的更加高效。
    • 可以在 Spring 的 Jira 上了解更多关于组件索引的相关信息。
  • 3 JetBrains Kotlin 语言支持

    • Kolin概述:是一种支持函数式编程编程风格的面向对象语言。Kotlin 运行在 JVM 之上,但运行环境并不限于 JVM。
    • Kolin 的示例代码:
    • {
          ("/movie" and accept(TEXT_HTML)).nest {
              GET("/", movieHandler::findAllView)
              GET("/{card}", movieHandler::findOneView)
          }
      
          ("/api/movie" and accept(APPLICATION_JSON)).nest {
              GET("/", movieApiHandler::findAll)
              GET("/{id}", movieApiHandler::findOne)
          }
      }
    • Kolin 注册 bean 对象到 spring 容器:
    • val context = GenericApplicationContext {
          registerBean()
          registerBean { Cinema(it.getBean()) }
      }
  • 4 响应式编程风格

    • 此次 Spring 发行版本的一个激动人心的特性就是新的响应式堆栈 WEB 框架。这个堆栈完全的响应式且非阻塞,适合于事件循环风格的处理,可以进行少量线程的扩展。
    • Reactive Streams 是来自于 Netflix, Pivotal, Typesafe, Red Hat, Oracle, Twitter 以及Spray.io 的工程师特地开发的一个 API。它为响应式编程实现的实现提供一个公共的 API,好实现Hibernate 的 JPA。这里 JPA 就是这个 API, 而 Hibernate 就是实现。
    • Reactive Streams API 是 Java 9 的官方版本的一部分。在 Java 8 中, 你会需要专门引入依赖来使用 Reactive Streams API。
    • Spring Framework 5.0 对于流式处理的支持依赖于 Project Reactor 来构建, 其专门实现了Reactive Streams API。
    • Spring Framework 5.0 拥有一个新的 spring-webflux 模块,支持响应式 HTTP 和 WebSocket 客户端。Spring Framework 5.0 还提供了对于运行于服务器之上,包含了 REST, HTML, 以及 WebSocket 风格交互的响应式网页应用程序的支持。
    • spring-webflux 中包含了两种独立的服务端编程模型:
      • 基于注解:使用到了@Controller 以及 Spring MVC 的其它一些注解;
      • 使用 Java 8 lambda 表达式的函数式风格的路由和处理。
      • 有 了 Spring Webflux, 你现在可以创建出 WebClient, 它是响应式且非阻塞的,可以作为RestTemplate 的一个替代方案。
    • 这里有一个使用 Spring 5.0 的 REST 端点的 WebClient 实现:
      • javascript">WebClient webClient = WebClient.create();
        Mono person = webClient.get()
                        .uri("http://localhost:8080/movie/42")
                        .accept(MediaType.APPLICATION_JSON)
                        .exchange()
                        .then(response -> response.bodyToMono(Movie.class));
  • 5 Junit5 支持

    • 完全支持 JUnit 5 Jupiter,所以可以使用 JUnit 5 来编写测试以及扩展。此外还提供了一个编程以及扩展模型,Jupiter 子项目提供了一个测试引擎来在 Spring 上运行基于 Jupiter 的测试。
    • 另外,Spring Framework 5 还提供了在 Spring TestContext Framework 中进行并行测试的扩展。
    • 针对响应式编程模型, spring-test 现在还引入了支持 Spring WebFlux 的 WebTestClient 集成测试的支持,类似于 MockMvc,并不需要一个运行着的服务端。使用一个模拟的请求或者响应, WebTestClient 就可以直接绑定到 WebFlux 服务端设施。
    • 可以在这里找到这个激动人心的 TestContext 框架所带来的增强功能的完整列表。
    • Spring Framework 5.0 仍然支持 JUnit!
  • 6 依赖类库的更新

    • 终止支持的类库
      • Portlet.
      • Velocity.
      • JasperReports.
      • XMLBeans.
      • JDO.
      • Guava.
      • 支持的类库
      • Jackson 2.6+
      • EhCache 2.10+ / 3.0 GA
      • Hibernate 5.0+
      • JDBC 4.0+
      • XmlUnit 2.x+
      • OkHttp 3.x+
      • Netty 4.1+

http://www.niftyadmin.cn/n/197128.html

相关文章

Linux uart驱动框架

Linux内核提供了标准的UART驱动程序&#xff0c;可以通过以下步骤编写&#xff1a; 首先需要定义一个结构体来存储串口设备数据。在该结构体中&#xff0c;包含一个uart_port结构体&#xff0c;用于与Linux内核通信&#xff0c;并包含一些设备特定的数据&#xff08;例如波特率…

多线程的锁策略

文章目录前言一.乐观锁与悲观锁二.轻量级锁和重量锁三.自旋锁和挂起等待锁四.互斥锁和读写锁五.不可重入锁和可重入锁六.公平锁和非公平锁前言 其实这里指的锁策略&#xff0c;不只只是线程才存在的。也不只是针对Java的&#xff0c;我现在就即将介绍常见的锁策略。 一.乐观锁…

Mac 安装node.js

Mac系统安装Node.js&#xff0c;下载地址。 如上图安装路径&#xff1a; This package will install:• Node.js v16.19.1 to /usr/local/bin/node• npm v8.19.3 to /usr/local/bin/npm查看node.js版本以及npm版本&#xff1a; node -vnpm -v

vue3 中 pinia 数据持久化配置使用sessionStorage

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录前言一、Pinia的使用二、Pinia数据持久化1、安装pinia-plugin-persistedstate2、在main.js中引用3、修改store4、修改持久化存储位置5、其他配置前言 现在&#xff0c;Vue 的官方状态管理库已更改为 Pinia&am…

edge-tts微软文本转语音库,来听听这些语音是否很熟悉?

上期图文教程,我们分享了Azure机器学习的文本转语音的账号申请与API申请的详细步骤,也介绍了基于python3实现Azure机器学习文本转语音功能的代码实现过程,虽然我们可以使用Azure账号免费提供一年的试用期,但是毕竟是要付费的,我们的API也无法长期使用,好在微软发布了edge…

PlayWright浏览器测试

Playwright是专门为满足端到端测试的需求而创建的。Playwright支持所有现代渲染引擎&#xff0c;包括Chromium、WebKit和Firefox。在Windows、Linux和macOS上进行测试&#xff0c;无论是在本地还是在CI上&#xff0c;无论是无头模式还是有头模式&#xff0c;都可以使用原生的移…

变强速度超出预期,安全问题逐渐变大,多国停用ChatGPT

前段时间&#xff0c;小编向大家介绍过&#xff0c;随着最近GPT-4语言模型的正式投入使用&#xff0c;ChatGPT也带来了全新的插件——网络浏览器和代码解释器&#xff0c;赋予ChatGPT使用工具、联网、运行计算的能力。 更新后&#xff0c;跟据全球媒体的反馈来看&#xff0c;GP…

学习基金(2)避坑-如何选择基金

选择基金 在选择基金的时候要看基金经理的基本情况&#xff0c;尤其是在选择主动型基金的时候&#xff0c;大家要留意基金经理管理的所有基金的收益情况&#xff0c;而不能仅仅只关注基金经理管理的一只基金。 “抬轿子”&#xff1a;为了打造一只明星基金吸引更多的投资者投…