重磅!SpringBoot4发布,11项重大变更全解析!

不知道大家最近没有发现?在我们新创建 Spring Boot 项目的时候,已经有了 Spring Boot 4.0.0 预览版这个选项了,如下图所示:

并且 Spring Boot 4 底层是基于全新的 Spring Framework 7.0.0 实现的,如下图所示:

那么问题来了,新版本都有哪些重要的变更呢?接下来由磊哥带着大家抢先来看。

1.优雅版本控制

新版本引入了优雅的 API 版本控制支持,允许开发者通过 @RequestMapping 注解中的 version 参数来实现版本控制,如下代码所示:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class VersionedController {

    @RequestMapping(value = "/user", version = "1")
    public String getUserV1() {
        // 版本1实现
        System.out.println("Version 1");
        return "Version 1";
    }

    @RequestMapping(value = "/user", version = "2")
    public String getUserV2() {
        // 版本2实现
        System.out.println("Version 2");
        return "Version 2";
    }
}

程序执行效果:

2.方便的Bean注入

新版本引入了新的 BeanRegistrar 合约,允许更灵活地注册 Bean(一次性注入多个 Bean),示例代码如下:

import org.springframework.beans.factory.BeanRegistrar;
import org.springframework.beans.factory.BeanRegistry;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.Environment;

@Configuration
@Import(MyBeansRegistrar.class)
public class MyConfiguration {
}

class MyBeansRegistrar implements BeanRegistrar {

    @Override
    public void register(BeanRegistry registry,
                         Environment env) {
        registry.registerBean("user", User.class);
        if (env.matchesProfiles("dev")) {
            registry.registerBean(Order.class, spec -> spec
                    .supplier(context -> new Order("order_001")));
        }
    }
}

class User {
    private String name;
}

class Order {
    public Order(String name) {
        this.name = name;
    }

    private String name;
}

写一个单元测试证明注册的 Bean 是可以正常使用的:

3.Null安全改进

新版本采用 JSpecify 注解来声明 API 的空值安全性,使用 @Nullable 表示可为 Null,使用 @NonNull 表示不能为空,并且会通过 Idea 配合提示警告或错误信息,例如以下代码:

import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;

public class Person {
    private String name;

    public void setName(@NonNull String name) {
        this.name = name;
    }

    @Nullable
    public String getName() {
        return this.name;
    }
}

在 Idea 中也能看到警告信息:

不同 Idea 版本展现形式不一样,博主使用的是 Idea 2024,新版本应该才会支持新特性。

4.HTTP代理轻松创建

新版本提供了 @ImportHttpServices 注解,让你为 HTTP 接口创建代理更加容易,示例代码如下(它允许您轻松声明、检测和配置整个 HTTP 服务组):

@Configuration(proxyBeanMethods = false)
@ImportHttpServices(group = "weather", types = {FreeWeather.class, CommercialWeather.class})
@ImportHttpServices(group = "user", types = {UserServiceInternal.class, UserServiceOfficial.class})
static class HttpServicesConfiguration extends AbstractHttpServiceRegistrar {
    @Bean
    public RestClientHttpServiceGroupConfigurer groupConfigurer() {
        return groups -> groups.filterByName("weather", "user")
                .configureClient((group, builder) -> builder.defaultHeader("User-Agent", "My-Application"));
    }
}

5.其他七个变更

其他升级的特性还包括:

  1. SPEL 表达式升级SPEL 表达式中支持空安全和 Elvis 运算符,例如以下代码:

    @Value("#{systemProperties['pop3.port'] ?: 25}")
    

    它表示,将注入系统属性 pop3.port 的值,如果未定义该属性值,注入 25 这个值。

  2. GraalVM 原生应用支持:借助 Spring AOT 技术,将应用编译成原生镜像,极大地缩短了启动时间。

  3. 支持 Jackson 3.x:放弃对 Jackson 2.x 的支持,升级为 Jackson 3.x。

  4. Servlet 和 WebSocket 版本升级:使用 Servlet 6.1 和 WebSocket 2.2 作为 Web 应用程序的底层实现,这意味着应用程序应该部署在最新的 Servlet 容器上,比如 Tomcat 11+ 和 Jetty 12.1+。

  5. HttpHeaders 优化:HttpHeaders 操作如下:

    @RestController
    public class MyController {
    
        @GetMapping("/headers")
        public ResponseEntity<String> handleRequest(HttpHeaders headers) {
            // 旧方式(已废弃)
            // headers.getFirst("X-Custom-Header");
    
            // 新方式
            String value = headers.firstValue("X-Custom-Header").orElse(null);
    
            // 遍历所有头部
            headers.forEach((name, values) -> {
                System.out.println(name + ": " + values);
            });
    
            return ResponseEntity.ok("Processed");
        }
    }
    
  6. 功能删除:新版本中的删除的内容如下:

    • Spring MVC 的 XML 配置名称空间现在被弃用,取而代之的是 Java 配置体。
    • Spring TestContext 框架中的 JUnit 4 支持现在已经被弃用。
    • Jackson 2.x 支持已被弃用,取而代之的是 Jackson 3.x。
    • Spring JCL 停用。
  7. 最低环境要求提高

    • Jakarta EE 11 (Tomcat 11+)
    • Kotlin 2.x
    • JSONassert 2.0
    • GraalVM 23

更多升级信息参考官网:https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-7.0-Release-Notes

小结

程序员是干到老学到老的行业,框架和工具的变更意味着我们会有更便利、更友好的调用方式,所以对于程序员是利好的,因此一起学起来、用起来、折腾起来吧。

本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring Boot、Spring Cloud、Spring AI、LangChain4j、Dify、AI Agent、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。

原创作者: vipstone 转载于: https://www.cnblogs.com/vipstone/p/18900774
第 1 章 入门 ................................................ 1 1.1 Spring 风云再起 ........................................ 1 1.1.1 重新认识 Spring ............................ 2 1.1.2 Spring Boot 精要 ........................... 3 1.1.3 Spring Boot 不是什么 ................... 6 1.2 Spring Boot 入门 ....................................... 6 1.2.1 安装 Spring Boot CLI .................... 7 1.2.2 使用 Spring Initializr 初始化 Spring Boot 目 .......................... 10 1.3 小结 ......................................................... 18 第 2 章 开发第一个应用程序 .................... 19 2.1 运用 Spring Boot ..................................... 19 2.1.1 查看初始化的 Spring Boot 新目 .......................................... 21 2.1.2 Spring Boot 目构建过程 解析 .............................................. 24 2.2 使用起步依赖 .......................................... 27 2.2.1 指定基于功能的依赖 ................... 28 2.2.2 覆盖起步依赖引入的传递依赖 .... 29 2.3 使用自动配置 .......................................... 30 2.3.1 专注于应用程序功能 ................... 31 2.3.2 运行应用程序 .............................. 36 2.3.3 刚刚发生了什么 ........................... 38 2.4 小结 ......................................................... 41 第 3 章 自定义配置 .................................... 42 3.1 覆盖 Spring Boot 自动配置 ..................... 42 3.1.1 保护应用程序 .............................. 43 3.1.2 创建自定义的安配置 ............... 44 3.1.3 掀开自动配置的神秘面纱 ........... 48 3.2 通过属性文件外置配置 ........................... 49 3.2.1 自动配置微调 .............................. 50 3.2.2 应用程序 Bean 的配置外置 ......... 55 3.2.3 使用 Profile 进行配置 .................. 59 3.3 定制应用程序错误页面 ........................... 62 3.4 小结 ......................................................... 644 章 测试 ............................................... 66 4.1 集成测试自动配置 .................................. 66 4.2 测试 Web 应用程序 ................................. 68 4.2.1 模拟 Spring MVC ........................ 69 4.2.2 测试 Web 安 ............................. 72 4.3 测试运行中的应用程序 ........................... 74 4.3.1 用随机端口启动服务器 ............... 75 4.3.2 使用 Selenium 测试 HTML 页面 ............................................. 76 4.4 小结 ......................................................... 78 第 5 章 Groovy 与 Spring Boot CLI ......... 80 5.1 开发 Spring Boot CLI 应用程序 .............. 80 5.1.1 设置 CLI 目 .............................. 81 5.1.2 通过 Groovy 消除代码噪声 ......... 81 5.1.3 发生了什么 .................................. 85 5.2 获取依赖 .................................................. 86 5.2.1 覆盖默认依赖版本 ....................... 87 5.2.2 添加依赖仓库 .............................. 88 5.3 用 CLI 运行测试 ...................................... 89 5.4 创建可部署的产物 .................................. 91 5.5 小结 ......................................................... 91 第 6 章 在 Spring Boot 中使用 Grails ...... 93 6.1 使用 GORM 进行数据持久化 ................. 93 6.2 使用 Groovy Server Pages 定义视图 ....... 98 6.3 结合 Spring Boot 与 Grails 3 ................. 100 6.3.1 创建新的 Grails 目 ................. 100 6.3.2 定义领域模型 ............................ 103 6.3.3 开发 Grails 控制器 ..................... 104 6.3.4 创建视图 .................................... 105 6.4 小结 ....................................................... 107 第 7 章 深入 Actuator .............................. 108 7.1 揭秘 Actuator 的端点 ............................ 108 7.1.1 查看配置明细 ............................ 109 7.1.2 运行时度量 ................................ 115 7.1.3 关闭应用程序 ............................ 121 7.1.4 获取应用信息 ............................ 121 7.2 连接 Actuator 的远程 shell .................... 122 7.2.1 查看 autoconfig 报告 ........... 123 7.2.2 列出应用程序的 Bean ............... 124 7.2.3 查看应用程序的度量信息 ......... 124 7.2.4 调用 Actuator 端点 .................... 125 7.3 通过 JMX 监控应用程序 ....................... 126 7.4 定制 Actuator ......................................... 128 7.4.1 修改端点 ID ............................... 128 7.4.2 启用和禁用端点 ........................ 129 7.4.3 添加自定义度量信息 ................. 129 7.4.4 创建自定义跟踪仓库 ................. 132 7.4.5 插入自定义健康指示器 ............. 134 7.5 保护 Actuator 端点 ................................ 136 7.6 小结 ....................................................... 138 第 8 章 部署 Spring Boot 应用程序 ........ 139 8.1 衡量多种部署方式 ................................ 139 8.2 部署到应用服务器 ................................ 140 8.2.1 构建 WAR 文件 ......................... 141 8.2.2 创建生产 Profile ........................ 142 8.2.3 开启数据库迁移 ........................ 145 8.3 推上云端 ............................................... 150 8.3.1 部署到 Cloud Foundry ............... 150 8.3.2 部署到 Heroku ........................... 153 8.4 小结 ....................................................... 155 附录 A Spring Boot 开发者工具 .............. 157 附录 B Spring Boot 起步依赖 ................. 163 附录 C 配置属性 ...................................... 169 附录 D Spring Boot 依赖 ......................... 202
### Stable Diffusion 3 发布信息和特性 #### 架构特点 Stable Diffusion 3采用扩散转换器架构作为其核心竞争力,这种架构使得模型能够更有效地处理复杂的图像生成任务[^1]。 #### 性能提升 相比前代版本,Stable Diffusion 3在多个方面实现了显著改进。具体来说,在文本语义理解、色彩饱和度、图像构图等多个维度上均有增强,尤其值得注意的是对于多主题提示的支持以及更高的图像质量[^2]。 #### 参数规模与适用性 此款新型号拥有不同大小的变体,最小版仅有8亿参数而最大可达80亿参数。这样的设计不仅让高性能计算成为可能,同时也确保了轻量化部署的需求得到满足,甚至能够在移动终端等资源受限环境中运行良好[^4]。 #### 对比其他模型的表现 当与其他同类产品如 MidJourney 进行比较时,Stable Diffusion 3展现出了不俗的竞争实力;然而面对某些特定领域内的专用解决方案(例如 OUYSD3),则显示出更为优越的整体性能优势[^3]。 ```python # Python代码示例用于展示如何加载预训练好的StableDiffusionV3模型 from diffusers import StableDiffusionPipeline, EulerAncestralDiscreteScheduler import torch model_id = "stabilityai/stable-diffusion-3" scheduler = EulerAncestralDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler") pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, torch_dtype=torch.float16) pipe.to("cuda") prompt = "A fantasy landscape with a castle on top of the mountain under starry sky." image = pipe(prompt).images[0] image.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值