Spring Framework 是一种流行的开源企业级框架,用于创建在 Java Virtual Machine (JVM) 上运行的独立、生产级应用程序。而Spring Boot 是一个工具,可以让使用 Spring 框架更快、更轻松地开发 Web 应用程序和微服务。随着 Spring Boot 的不断发展,开发人员必须跟上最新的升级和变化。
最近,Spring Boot 宣布发布 3.2.x 版本,该版本带来了多项新功能、错误修复和增强功能,鉴于对 Spring Boot 2.7.x 版本的支持已于 2023 年 11 月 18 日结束,这是一个非常重要且强制性的关注用于将 Spring Boot 应用程序升级到最新的 3.x 版本。
因此,在本文中,我们将讨论如何从 Spring Boot 2.x 迁移到 3.x,以及升级的优势以及开发人员在此过程中可能遇到的潜在困难。
Spring Boot 3.0 需要 Java 17 作为最低版本。
如果您当前使用的是 Java 8 或 Java 11,则需要在 Spring Boot 迁移之前升级 JDK。
查看项目及其依赖项的状态后,请升级到 Spring Boot 3.0 的最新维护版本。
我们将使用 Spring Boot 3.2.0 进行升级。
打开项目的?pom.xml
?并更新 Spring Boot 的版本,如下所示。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> </parent>
在 Spring Boot 3.0 中,一些配置属性被重命名/删除,开发人员需要相应地更新其?application.properties/application.yml
。
为了帮助您实现这一点,Spring Boot 提供了一个?spring-boot-properties-migrator
?模块。
我们可以通过将以下内容添加到 Maven?pom.xml
?来添加迁移器:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> <scope>runtime</scope> </dependency>
由于 Java EE 已更改为 Jakarta EE,Spring Boot 3.x 的所有依赖项 API 也从 Java EE 升级为 Jakarta EE。
简单来说,您需要将所有?javax
?的 imports 都替换为?jakarta
。具体如下:
javax.persistence.* -> jakarta.persistence.* javax.validation.* -> jakarta.validation.* javax.servlet.* -> jakarta.servlet.* javax.annotation.* -> jakarta.annotation.* javax.transaction.* -> jakarta.transaction.*
@ConstructorBinding
注解@ConstructorBinding
?在?@ConfigurationProperties
?类的类型级别不再需要,应将其删除。
当一个类或记录有多个构造函数时,它仍然可以在构造函数上使用,以指示应使用哪一个构造函数进行属性绑定。
从 Spring Framework 6.0 开始,尾部斜杠匹配配置选项已为 deprecated,其默认值设置为 false。
这意味着以前,以下控制器将匹配GET /health
和GET /health/
@RestController public class HealthController { @GetMapping("/health") public String health() { return "Application is Working"; } } @RestController public class HealthController { @GetMapping("/health") public Mono<String> health() { return Mono.just("Application is Working"); } }
Spring Framework 6.0 中已删除对 Apache HttpClient 的支持,现在由?org.apache.httpcomponents.client5:httpclient5
?取代(注意:此依赖项具有不同的 groupId)。
如果您注意到 HTTP 客户端行为存在问题,则?RestTemplate
?可能会回退到 JDK 客户端。
org.apache.httpcomponents:httpclient
?可以由其他依赖项传递传递,因此您的应用程序可能依赖此依赖项而不声明它。
下面是迁移后的RestTemplate
示例:
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(){ final SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactoryBuilder.create() .build(); final PoolingHttpClientConnectionManager manager = PoolingHttpClientConnectionManagerBuilder.create() .setSSLSocketFactory(sslConnectionSocketFactory) .build(); final CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(manager) .build(); final HttpComponentsClientHttpRequestFactory componentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(); componentsClientHttpRequestFactory.setHttpClient(closeableHttpClient); final RestTemplate restTemplate = new RestTemplate(componentsClientHttpRequestFactory); return restTemplate; } }
Spring Boot 3.0 已升级到 Spring Security 6.0。
因此,WebSecurityConfigurerAdapter
?已被弃用。 Spring鼓励用户转向基于组件的安全配置。
为了演示新的配置风格,我们使用 Spring Security lambda DSL 和方法?HttpSecurity#authorizeHttpRequests
?来定义我们的授权规则。
下面是使用?WebSecurityConfigurerAdapter
?的示例配置,它通过 HTTP Basic 保护所有端点:
@Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authz) -> authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); } }
展望未来,推荐的方法是注册一个?SecurityFilterChain
?bean:
@Configuration public class SecurityConfiguration { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests((authz) -> authz .anyRequest().authenticated() ) .httpBasic(withDefaults()); return http.build(); } }
KafkaTemplate
?方法现在返回?CompleteableFuture
?而不是?ListenableFuture
,后者已被弃用。
Spring Boot 2.x 中带有?ListenableFuture
?的 Kafka 模板:
private RoutingKafkaTemplate routingKafkaTemplate; public void send(){ ListenableFuture<SendResult<Object,Object>> future = routingKafkaTemplate.send("Message","topic"); future.addCallback(new ListenableFutureCallback<>() { @Override public void onFailure(Throwable ex) { log.error(ex); } @Override public void onSuccess(SendResult<Object, Object> result) { log.info("success"); } }); }
Spring Boot 3.x 中带有?CompletableFuture
?的 Kafka 模板:
private RoutingKafkaTemplate routingKafkaTemplate; public void send() { CompletableFuture<SendResult<Object, Object>> future = routingKafkaTemplate.send("Message", "topic"); future.thenAccept(log::info) .exceptionally(exception -> { log.error(exception); return null; }); }
springdoc-openapi
用于为Spring Boot 项目自动生成 API 文档。
springdoc-openapi
的工作原理是在运行时检查应用程序,以根据 spring 配置、类结构和各种注释推断 API 语义。
对于 spring-boot 3 支持,请确保使用 springdoc-openapi v2。
对于 WebMVC 项目,您需要在?pom.xml
. 文件中包含以下依赖项。
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.3.0</version> </dependency>
对于 WebFlux 项目,您需要在?pom.xml
. 文件中包含以下依赖项。
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webflux-ui</artifactId> <version>2.3.0</version> </dependency>
前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。
介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。
看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~
今日分享就到这里,感谢阅读!