跳到主要内容
Spring Boot 3 新特性详解与迁移指南:Java 17 至云原生最佳实践 | 极客日志
Java java
Spring Boot 3 新特性详解与迁移指南:Java 17 至云原生最佳实践 Spring Boot 3 核心新特性,包括 Jakarta EE 命名空间变更、Java 17+ 整合、AOT 编译与 GraalVM 原生镜像支持、虚拟线程及增强可观测性。提供从 2.x 到 3.x 的完整迁移指南,涵盖依赖升级、代码重构(javax 转 jakarta)、配置调整及安全优化。此外,还包含 Docker 与 Kubernetes 部署方案、性能调优策略及生产环境落地建议,帮助开发者平滑过渡至云原生架构。
监控大屏 发布于 2026/3/30 更新于 2026/5/23 29 浏览Spring Boot 3 新特性详解与迁移指南:从 Java 17 到云原生最佳实践
前言 :截至 2026 年 2 月,Spring Boot 3.x 已成为企业级 Java 开发的主流选择。然而,从 Spring Boot 2.x 迁移至 3.x 的破坏性变更让不少团队踩坑——Jakarta EE 命名空间迁移、Java 17 最低要求、AOT 编译适配等问题频发。本文将从新特性、迁移路径、实战优化到生产落地,提供完整指南。
一、Spring Boot 3 版本概览
1.1 版本生命周期
版本 发布时间 功能截止 安全截止 状态 2.7.x 2022-05 2023-06 2029-06 ⚠️ 维护期 (仅安全修复) 3.0.x 2022-11 2023-05 2024-05 ❌ 已终止支持 3.1.x 2023-05 2023-11 2024-11 ❌ 已终止支持 3.2.x 2023-11 2024-05 2025-12 ⚠️ 维护期 3.3.x 2024-05 2024-11 2026-06 ✅ 推荐稳定版 3.4.x 2024-11 2025-05 2026-11 ✅ 推荐稳定版 3.5.x 2025-05 2025-11 2027-05 ✅ 最新 LTS 4.0.x 2025-11 - - 🆕 新一代 (Java 25+)
💡 建议:新项目选择 3.4.x/3.5.x,存量项目优先迁移至 3.3.x+
1.2 技术基线对比
特性 Spring Boot 2.x Spring Boot 3.x Spring Boot 4.x 最低 Java 版本 8 17 25 Spring Framework 5.x 6.x 7.x Jakarta EE 8 (javax.*) 9+ (jakarta.*) 10+ GraalVM 原生 实验性 正式支持
二、核心新特性深度解析
2.1 Java 17+ 特性整合 Spring Boot 3 充分利用 Java 17-21 的新特性,带来代码简洁性和性能提升。
@Data @AllArgsConstructor @NoArgsConstructor
public class UserDTO {
private Long id;
private String name;
private String email;
}
public record UserDTO (Long id, String name, String email) {}
public sealed class PaymentRequest permits CreditCardPayment, AlipayPayment, WechatPayment {
}
public String getPaymentStatus (PaymentType type) {
return switch (type) {
case CREDIT_CARD -> "信用卡支付" ;
case ALIPAY -> "支付宝支付" ;
case WECHAT -> "微信支付" ;
case null , default -> "未知支付方式" ;
};
}
public String getQuery () {
return """
SELECT u.id, u.name, u.email FROM users u WHERE u.status = 'ACTIVE' ORDER BY u.created_at DESC
""" ;
}
2.2 Jakarta EE 9+ 命名空间迁移 最关键的破坏性变更 :所有 javax.* 包名改为 jakarta.*
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;
import javax.annotation.PostConstruct;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotNull;
import jakarta.annotation.PostConstruct;
原包名 (2.x) 新包名 (3.x) 影响范围 javax.persistencejakarta.persistenceJPA/Hibernate javax.servletjakarta.servletWeb MVC javax.validationjakarta.validationBean Validation javax.annotationjakarta.annotation通用注解 javax.transactionjakarta.transaction事务管理 javax.ws.rsjakarta.ws.rsJAX-RS javax.mailjakarta.mail邮件发送 javax.cachejakarta.cache缓存抽象
2.3 AOT 编译与 GraalVM 原生镜像 Spring Boot 3 正式支持 Ahead-Of-Time (AOT) 编译,可生成 GraalVM 原生镜像。
spring:
aot:
enabled: true
@NativeHint( options = "--initialize-at-run-time=com.example.MyClass", types = @TypeHint(types = {User.class, Order.class}) )
public class NativeConfiguration {
}
./mvnw -Pnative native:compile
./gradlew nativeCompile
指标 JVM 模式 原生镜像 提升幅度 启动时间 2.5-3.5s 0.08-0.15s 20-30x ⬆️ 内存占用 400-600MB 40-80MB 5-8x ⬇️ 首请求延迟 500-800ms 50-100ms 5-8x ⬆️ 吞吐量 100% 85-95% 略降 5-15% 构建时间 30s 2-5min 构建较慢
2.4 虚拟线程支持 (Java 21+) Spring Boot 3.2+ 完整支持 Java 21 虚拟线程,大幅提升并发处理能力。
spring:
threads:
virtual:
enabled: true
task:
executor:
virtual: true
@Service
public class OrderService {
@Async("taskExecutor")
public void processOrderTraditional (Order order) {
}
@Async
public void processOrderVirtual (Order order) {
blockingIoOperation();
}
public void batchProcess (List<Order> orders) {
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
orders.forEach(order -> executor.submit(() -> processOrderVirtual(order)));
}
}
}
并发数 平台线程 QPS 虚拟线程 QPS 提升幅度 100 8,500 9,200 8% ⬆️ 1,000 7,800 12,500 60% ⬆️ 10,000 3,200 18,000 462% ⬆️ 100,000 500 (OOM) 15,000 无法对比
💡 适用场景:高并发 I/O 密集型应用、微服务网关、API 聚合层
2.5 增强的可观测性 Spring Boot 3 整合 Micrometer 1.10+ 和 OpenTelemetry ,提供统一的可观测性方案。
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus,threaddump
endpoint:
health:
show-details: always
metrics:
export:
prometheus:
enabled: true
otel:
enabled: true
tracing:
sampling:
probability: 1.0
propagation:
type: tracecontext,b3
@Component
public class OrderMetrics {
private final Counter orderCounter;
private final Timer orderTimer;
private final DistributionSummary orderAmountSummary;
public OrderMetrics (MeterRegistry registry) {
this .orderCounter = registry.counter("orders.total" );
this .orderTimer = registry.timer("orders.processing.time" );
this .orderAmountSummary = registry.summary("orders.amount" );
}
public Order process (Order order) {
return orderTimer.record(() -> {
orderCounter.increment();
orderAmountSummary.record(order.getAmount());
return orderRepository.save(order);
});
}
}
@RestController
public class OrderController {
private final Tracer tracer;
public OrderController (Tracer tracer) {
this .tracer = tracer;
}
@PostMapping("/orders")
public Order createOrder (@RequestBody Order order) {
Span span = tracer.spanBuilder("create-order" )
.setSpanKind(SpanKind.SERVER)
.startSpan();
try (var scope = span.makeCurrent()) {
span.setAttribute("order.type" , order.getType());
return orderService.create(order);
} finally {
span.end();
}
}
}
2.6 声明式 HTTP 客户端 (Spring Boot 3.2+) 替代 Feign 的官方声明式 HTTP 客户端。
@HttpExchange(url = "https://api.example.com")
public interface UserClient {
@GetExchange("/users/{id}")
User getUser (@PathVariable Long id) ;
@PostExchange("/users")
User createUser (@Body User user) ;
@PutExchange("/users/{id}")
User updateUser (@PathVariable Long id, @Body User user) ;
@DeleteExchange("/users/{id}")
void deleteUser (@PathVariable Long id) ;
}
@Configuration
public class ClientConfig {
@Bean
public UserClient userClient (HttpExchangeAdapter adapter) {
return HttpExchangeProxyFactory.of(UserClient.class, adapter);
}
@Bean
public RestClient.Builder restClientBuilder () {
return RestClient.builder()
.requestInterceptor((request, body, execution) -> {
request.getHeaders().set("X-API-Key" , apiKey);
return execution.execute(request, body);
});
}
}
@Service
public class UserService {
private final UserClient userClient;
public UserService (UserClient userClient) {
this .userClient = userClient;
}
public User getUser (Long id) {
return userClient.getUser(id);
}
}
三、从 Spring Boot 2.x 迁移至 3.x 完整指南
3.1 迁移前准备清单
3.2 依赖升级
<parent >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-parent</artifactId >
<version > 3.4.2</version >
<relativePath />
</parent >
<properties >
<java.version > 17</java.version >
<java.version > 21</java.version >
</properties >
<dependencies >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-web</artifactId >
</dependency >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-data-jpa</artifactId >
</dependency >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-validation</artifactId >
</dependency >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-security</artifactId >
</dependency >
<dependency >
<groupId > org.springframework.boot</groupId >
<artifactId > spring-boot-starter-actuator</artifactId >
</dependency >
<dependency >
<groupId > io.micrometer</groupId >
<artifactId > micrometer-registry-prometheus</artifactId >
</dependency >
</dependencies >
// build.gradle - Spring Boot 3.x
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.graalvm.buildtools.native' version '0.10.3' // 原生镜像支持
}
java {
sourceCompatibility = '17'
targetCompatibility = '17'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
// 测试依赖
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
3.3 代码迁移 - javax 到 jakarta
./mvnw org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:2.10.0 \
-Drewrite.activeRecipes=org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure (HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/**" ).authenticated()
.and().formLogin();
}
@Bean
public UserDetailsService userDetailsService () {
return new InMemoryUserDetailsManager (...);
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain (HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**" ).authenticated()
.anyRequest().permitAll()
).formLogin(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService () {
return new InMemoryUserDetailsManager (...);
}
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
@NotNull
private String name;
@PostConstruct
public void init () {
}
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
@NotNull
private String name;
@PostConstruct
public void init () {
}
}
@Component
public class RequestFilter implements Filter {
@Override
public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
chain.doFilter(request, response);
}
}
@Component
public class RequestFilter implements Filter {
@Override
public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
chain.doFilter(request, response);
}
}
3.4 配置文件迁移
spring:
threads:
virtual:
enabled: true
aot:
enabled: true
jackson:
default-property-inclusion: non_null
serialization:
write-dates-as-timestamps: false
datasource:
hikari:
pool-name: MyHikariPool
password: ENC(encrypted-password)
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: always
probes:
enabled: true
metrics:
tags:
application: ${spring.application.name}
3.5 第三方依赖兼容性 依赖 2.x 版本 3.x 兼容版本 注意事项 Spring Cloud 2021.x 2022.x+ 需同步升级 Hibernate 5.x 6.x+ Jakarta 迁移 Lombok 1.18.x 1.18.26+ 支持 Records MapStruct 1.4.x 1.5.5+ Jakarta 支持 Swagger 2.x 2.2.15+ springdoc-openapi Redis 2.x 3.x+ Lettuce 升级 Kafka 2.x 3.x+ Spring Kafka 3.x Elasticsearch 7.x 8.x+ 客户端变更
<dependencyManagement >
<dependencies >
<dependency >
<groupId > org.springframework.cloud</groupId >
<artifactId > spring-cloud-dependencies</artifactId >
<version > 2023.0.3</version >
<type > pom</type >
<scope > import</scope >
</dependency >
</dependencies >
</dependencyManagement >
四、性能优化最佳实践
4.1 启动优化
@SpringBootApplication
public class Application {
public static void main (String[] args) {
SpringApplication app = new SpringApplication (Application.class);
app.setLazyInitialization(true );
app.run(args);
}
}
spring:
main:
lazy-initialization: true
web-application-type: servlet
config:
import: optional:configserver:http://config-server:8888
优化项 优化前 优化后 提升 基础启动 3.5s 3.5s - + 延迟初始化 3.5s 2.8s 20% ⬆️ + AOT 编译 2.8s 0.1s 28x ⬆️ + 虚拟线程 0.1s 0.1s 并发提升
4.2 数据库连接池优化 spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
idle-timeout: 300000
connection-timeout: 20000
max-lifetime: 1200000
pool-name: AppHikariPool
register-mbeans: true
jpa:
properties:
hibernate:
format_sql: true
use_sql_comments: true
cache:
use_second_level_cache: true
region:
factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
4.3 缓存策略优化 @Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager (RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30 ))
.serializeKeysWith(
RedisSerializationContext.SerializationPair
.fromSerializer(new StringRedisSerializer ())
)
.serializeValuesWith(
RedisSerializationContext.SerializationPair
.fromSerializer(new GenericJackson2JsonRedisSerializer ())
);
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.withCacheConfiguration("users" , config.entryTtl(Duration.ofMinutes(60 )))
.withCacheConfiguration("orders" , config.entryTtl(Duration.ofMinutes(15 )))
.build();
}
}
@Service
public class UserService {
@Cacheable(value = "users", key = "#id", unless = "#result == null")
public User getUser (Long id) {
return userRepository.findById(id).orElse(null );
}
@CachePut(value = "users", key = "#user.id")
public User updateUser (User user) {
return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id")
public void deleteUser (Long id) {
userRepository.deleteById(id);
}
}
五、生产环境落地指南
5.1 Docker 部署配置 # Dockerfile - 多阶段构建
# ===== 构建阶段 =====
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /app
COPY . .
RUN ./gradlew bootJar -Pnative
# ===== 运行阶段 (JVM) =====
FROM eclipse-temurin:21-jre-alpine AS jvm-run
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
# ===== 运行阶段 (原生镜像) =====
FROM gcr.io/distroless/cc-debian12 AS native-run
WORKDIR /app
COPY --from=builder /app/build/native/nativeCompile/app .
EXPOSE 8080
ENTRYPOINT ["./app"]
version: '3.8'
services:
app:
build:
context: .
target: jvm-run
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- JAVA_OPTS=-Xms512m -Xmx512m
depends_on:
- postgres
- redis
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: appdb
POSTGRES_USER: appuser
POSTGRES_PASSWORD: apppass
redis:
image: redis:7-alpine
ports:
- "6379:6379"
5.2 Kubernetes 部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-app
spec:
replicas: 3
selector:
matchLabels:
app: spring-boot-app
template:
metadata:
labels:
app: spring-boot-app
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
prometheus.io/path: "/actuator/prometheus"
spec:
containers:
- name: app
image: myregistry/spring-boot-app:3.4.2
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
- name: JAVA_OPTS
value: "-Xms512m -Xmx512m"
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
5.3 监控告警配置
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080' ]
metric_relabel_configs:
- source_labels: [__name__ ]
regex: 'jvm_.*'
action: drop
groups:
- name: spring-boot-alerts
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) > 0.1
for: 5m
annotations:
summary: "高错误率告警"
- alert: HighMemoryUsage
expr: jvm_memory_used_bytes / jvm_memory_max_bytes > 0.9
for: 10m
annotations:
summary: "内存使用率过高"
- alert: SlowResponse
expr: histogram_quantile(0.95, rate(http_server_requests_seconds_bucket[5m])) > 2
for: 5m
annotations:
summary: "响应时间过长"
六、常见陷阱与解决方案
6.1 迁移常见问题 问题 原因 解决方案 ClassNotFoundException: javax.*包名未迁移 全局替换 javax. → jakarta. WebSecurityConfigurerAdapter 废弃API 变更 使用 SecurityFilterChain Bean 原生镜像构建失败 反射配置缺失 添加 @NativeHint 或 reflect-config.json 第三方依赖不兼容 版本过旧 升级依赖或寻找替代方案 测试失败 Mock 对象变更 更新测试配置使用 Jakarta 启动变慢 未启用延迟初始化 配置 spring.main.lazy-initialization=true
6.2 安全配置变更
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure (HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/**" ).authenticated();
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain (HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**" ).permitAll()
.requestMatchers("/api/**" ).authenticated()
.anyRequest().permitAll()
)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder () {
return new BCryptPasswordEncoder ();
}
}
6.3 测试代码迁移
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void testGetUser () {
}
}
@SpringBootTest
class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
void testGetUser () {
when (userRepository.findById(1L )).thenReturn(Optional.of(new User ()));
User user = userService.getUser(1L );
assertNotNull(user);
}
}
七、2026 年趋势展望
7.1 Spring Boot 4.0 前瞻
• 最低 Java 版本:25 (不再支持 Java 21 及以下)
• Spring Framework 7.0
• 虚拟线程默认启用
• GraalVM 原生编译优化
• 移除已弃用的 API
• AI/ML 集成增强
💡 建议:2026 年新项目可评估 Spring Boot 4.0,存量项目建议停留在 3.4.x/3.5.x
7.2 大厂技术路线参考
阿里巴巴:Spring Boot 3.3.x + Spring Cloud Alibaba 2023.x
字节跳动:Spring Boot 3.4.x + 自研微服务框架
腾讯:Spring Boot 3.3.x + TARS 微服务
美团:Spring Boot 3.2.x + 自研服务治理平台
京东:Spring Boot 3.4.x + 云原生全栈方案
核心方向:云原生、微服务治理、可观测性、AI 能力下沉
八、总结与建议
8.1 迁移决策矩阵 开始迁移评估
├─ Java 版本 < 17? ──→ 先升级 Java 17+
└─ 业务紧急度 高/低?
├─ 高 ──→ 直接迁移 3.x
└─ 低 ──→ 渐进式迁移 3.x
8.2 核心建议 场景 推荐版本 理由 新项目 3.4.x / 3.5.x 稳定、长期支持 存量 2.x 项目 3.3.x 平衡稳定性和新特性 云原生/Serverless 3.4.x + GraalVM 快速启动、低内存 高并发 I/O 场景 3.4.x + Java 21 虚拟线程支持 企业级复杂系统 3.3.x 生态成熟、风险低 前沿技术探索 4.0.x Java 25 新特性
8.3 关键 Takeaway
✅ JDK 17 是最低要求,推荐 Java 21
✅ javax.* → jakarta.* 是最大变更点
✅ Security 配置 API 完全重构
✅ AOT 和 GraalVM 原生编译正式支持
✅ 虚拟线程 (Java 21+) 带来并发性能飞跃
✅ 可观测性整合 Micrometer + OpenTelemetry
✅ 声明式 HTTP 客户端替代 Feign
✅ 3.5.x 是 3.x 系列最后一个 LTS 版本
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online