Spring Boot 3.4 引入了多项显著特性,旨在提升开发者的生产力、性能以及集成能力。本文将详细解释这些特性,并通过完整的代码示例和逐步指导,对比新旧实现方式。
重点特性:
-
增强的 Spring AI 集成
-
改进的可观测性与 Micrometer 2.0
-
更好的虚拟线程支持
-
动态配置与新绑定特性
-
声明式安全策略的简化
-
声明式 REST 客户端增强
-
改进的 Testcontainers 集成
1. 增强的 Spring AI 集成
Spring Boot 3.4 提供了与 Spring AI 更紧密的集成,简化了 AI 服务的消费,特别是在创建和管理生成式 AI 管道方面。
旧方式(Spring Boot 3.4 之前):
开发者需要手动配置外部 AI 库,并为模型集成编写样板代码。
@Configuration
public class AIConfig {
@Bean
public OpenAiService openAiService() {
String apiKey = System.getenv("OPENAI_API_KEY");
return new OpenAiService(apiKey);
}
}
@RestController
@RequestMapping("/ai")
public class AIController {
private final OpenAiService openAiService;
public AIController(OpenAiService openAiService) {
this.openAiService = openAiService;
}
@PostMapping("/generate")
public String generateText(@RequestBody String prompt) {
// Manual handling of requests
CompletionRequest request = CompletionRequest.builder()
.prompt(prompt)
.maxTokens(100)
.build();
return openAiService.createCompletion(request).getChoices().get(0).getText();
}
}
步骤:
-
安装 OpenAI 依赖。
-
创建配置 Bean。
-
手动处理 API 调用。
新方式(Spring Boot 3.4):
Spring Boot 3.4 提供了对 AI 的一流支持,包括自动配置和简化使用。
@SpringBootApplication
public class AiApplication {
public static void main(String[] args) {
SpringApplication.run(AiApplication.class, args);
}
}
@RestController
@RequestMapping("/ai")
public class AIController {
private final AiService aiService;
public AIController(AiService aiService) {
this.aiService = aiService;
}
@PostMapping("/generate")
public String generateText(@RequestBody String prompt) {
return aiService.generate(prompt, new AiOptions().maxTokens(100));
}
}
步骤:
-
添加
spring-ai-starter
依赖。 -
直接使用预配置的
AiService
。 -
专注于业务逻辑,无需编写样板代码。
对比:
2. 改进的可观测性与 Micrometer 2.0
旧方式(3.4 之前):
Spring Boot 的可观测性虽然不错,但与 Prometheus 或 Grafana 等监控工具的集成需要额外配置,尤其是高级指标。
@Configuration
public class MetricsConfig {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("application", "my-service");
}
}
-
添加
micrometer-core
依赖。 -
配置
MeterRegistryCustomizer
以定义指标标签。 -
手动将指标导出到 Prometheus 或其他系统。
新方式(Spring Boot 3.4):
借助 Micrometer 2.0,Spring Boot 3.4 简化了指标导出,并增强了对直方图、百分位数计算和 OpenTelemetry 的支持。
management:
metrics:
export:
prometheus:
enabled: true
distribution:
percentiles-histogram: true
percentiles: 0.5, 0.9, 0.99
-
添加
spring-boot-starter-actuator
。 -
在
application.yml
中启用prometheus
指标导出。 -
无需自定义代码即可使用高级百分位直方图。
对比:
3. 更好的虚拟线程支持
旧方式(3.4 之前):
Java 中的虚拟线程在 Spring Boot 中并未完全优化。开发者需要手动启用实验性支持并调整线程池。
@Configuration
public class ExecutorConfig {
@Bean
public ExecutorService virtualThreadExecutor() {
return Executors.newVirtualThreadPerTaskExecutor();
}
}
步骤:
-
手动添加
Executors.newVirtualThreadPerTaskExecutor()
。 -
覆盖 Spring 中的默认线程池。
新方式(Spring Boot 3.4):
对虚拟线程的原生支持使其在 Web 和响应式应用中更易使用。
spring:
threads:
virtual: enabled
@RestController
public class DemoController {
@GetMapping("/compute")
public CompletableFuture<String> compute() {
return CompletableFuture.supplyAsync(() -> "Hello from Virtual Threads!");
}
}
步骤:
-
通过单个属性启用虚拟线程。
-
在应用中无缝使用。
对比:
4. 动态配置与新绑定特性
旧方式(3.4 之前):
将配置绑定到 Java 对象需要样板代码,处理动态属性时较为繁琐。
@ConfigurationProperties(prefix = "my.app")
public class AppProperties {
private String name;
private String description;
// Getters and Setters
}
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {
}
新方式(Spring Boot 3.4):
动态配置现在支持更少的注解自动绑定。
@ConfigurationPropertiesScan
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
@ConfigurationProperties(prefix = "my.app")
public record AppProperties(String name, String description) {}
步骤:
-
用
@ConfigurationPropertiesScan
替换@EnableConfigurationProperties
。 -
使用记录类进行简洁的配置绑定。
5. 声明式安全策略的简化
旧方式(3.4 之前):
安全规则需要多个注解或在 SecurityFilterChain
中手动配置。
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and().build();
}
步骤:
-
以编程方式定义安全规则。
-
手动处理方法级注解。
新方式(Spring Boot 3.4):
声明式策略通过简洁的语法简化了安全配置。
@SecurityPolicy
public class SecurityConfig {
@Authorize("/admin/**")
public boolean adminAccess(Authentication auth) {
return auth.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
}
-
使用
@SecurityPolicy
和@Authorize
注解方法。 -
从
SecurityFilterChain
中移除样板代码。
对比:
6. 声明式 REST 客户端增强
旧方式(3.4 之前)
使用 RestTemplate
或 WebClient
进行 REST 调用需要样板代码和显式配置。
@Component
public class UserService {
private final RestTemplate restTemplate;
public UserService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build();
}
public User getUser(Long id) {
return restTemplate.getForObject("/users/" + id, User.class);
}
public User createUser(User user) {
return restTemplate.postForObject("/users", user, User.class);
}
}
-
定义
RestTemplate
Bean 或使用RestTemplateBuilder
。 -
为每个 HTTP 调用实现方法。
-
手动处理 URI 构建和负载管理。
新方式(Spring Boot 3.4)
声明式 REST 客户端通过注解和 @HttpExchange
简化了 REST API 的消费。
@HttpExchange("/users")
public interface UserClient {
@GetExchange("/{id}")
User getUser(@PathVariable Long id);
@PostExchange
User createUser(@RequestBody User user);
}
使用:
@Service
public class UserService {
private final UserClient userClient;
public UserService(UserClient userClient) {
this.userClient = userClient;
}
public User getUser(Long id) {
return userClient.getUser(id);
}
public User createUser(User user) {
return userClient.createUser(user);
}
}
-
使用
@HttpExchange
和方法级 HTTP 注解(如@GetExchange
、@PostExchange
)定义接口。 -
将接口注入服务。
-
直接使用客户端方法。
对比:
7. 改进的 Testcontainers 集成
旧方式(3.4 之前)
使用 Testcontainers 需要手动集成数据库容器和处理动态属性。
@SpringBootTest
public class MyRepositoryTests {
static PostgreSQLContainer<?> postgres;
@BeforeAll
static void startContainer() {
postgres = new PostgreSQLContainer<>("postgres:14");
postgres.start();
System.setProperty("spring.datasource.url", postgres.getJdbcUrl());
System.setProperty("spring.datasource.username", postgres.getUsername());
System.setProperty("spring.datasource.password", postgres.getPassword());
}
@AfterAll
static void stopContainer() {
postgres.stop();
}
}
-
手动启动容器。
-
动态设置系统属性以供 Spring 使用。
-
测试后手动停止容器。
新方式(Spring Boot 3.4)
Spring Boot 3.4 通过 DynamicPropertySource
自动化了 Testcontainers 配置。
@Testcontainers
@SpringBootTest
public class MyRepositoryTests {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:14");
@DynamicPropertySource
static void registerProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
}
-
使用
@Container
定义容器生命周期。 -
使用
@DynamicPropertySource
注册动态属性。 -
容器由
@Testcontainers
注解自动管理。
对比:
以上就是 Spring Boot 3.4 的主要特性介绍。希望这些内容对您有所帮助!
如果您喜欢这篇文章或觉得它有用,请点赞分享支持一下。
没有回复内容