SpringBoot核心注解详解及3.0与2.0版本深度对比

SpringBoot核心注解详解及3.0与2.0版本深度对比

本文全面解析SpringBoot核心注解原理,深入对比3.0与2.0版本差异,助你掌握新一代SpringBoot开发精髓

一、SpringBoot核心注解全景解析

1.1 什么是SpringBoot核心注解

SpringBoot核心注解是构建SpringBoot应用程序的基石,它们通过约定优于配置 的原则,极大简化了Spring应用的初始搭建和开发过程。这些注解通过自动化配置 和智能决策机制,消除了传统Spring应用中大量的XML配置,使开发者能够专注于业务逻辑的实现。

1.2 核心注解三大支柱

SpringBoot核心注解体系建立在三大支柱之上:

  1. 启动引导注解 :@SpringBootApplication
  2. 配置核心注解 :@Configuration, @Bean, @ComponentScan
  3. 条件装配注解 :@Conditional及其衍生注解

这三大类注解共同构成了SpringBoot的自动配置 和快速启动能力,是现代Spring应用开发的基石。

二、SpringBoot核心注解深度剖析

2.1 核心中的核心:@SpringBootApplication

@SpringBootApplication 是SpringBoot应用的启动入口注解,它是一个组合注解,包含三个关键元注解:

java 复制代码
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
2.1.1 @SpringBootConfiguration详解

@SpringBootConfiguration 本质上是 @Configuration 的特化版本,标识该类为配置类。在SpringBoot中,通常将主类同时作为配置类使用:

java 复制代码
@SpringBootConfiguration
public class MyAppConfig {
    // 配置类中可以定义Bean
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
2.1.2 @EnableAutoConfiguration揭秘

@EnableAutoConfiguration 是SpringBoot自动配置的核心,它会基于类路径下的jar包、已定义的Bean以及各种属性设置,自动配置Spring应用。

自动配置实现原理:

  1. 扫描META-INF/spring.factories文件
  2. 加载org.springframework.boot.autoconfigure.EnableAutoConfiguration配置项
  3. 通过@Conditional条件注解判断是否满足装配条件
  4. 满足条件时自动配置相应组件
2.1.3 @ComponentScan机制解析

@ComponentScan 负责组件扫描,默认扫描启动类所在包及其子包下的所有组件。可通过参数自定义扫描行为:

java 复制代码
@SpringBootApplication
@ComponentScan(basePackages = "com.example",
               includeFilters = @Filter(type = FilterType.ANNOTATION, 
                                        classes = Controller.class),
               excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, 
                                        classes = ExcludeConfig.class))
public class Application {
    // ...
}

2.2 配置体系核心注解

2.2.1 @Configuration与@Bean

@Configuration 标注的类表明这是一个Spring配置类 ,其内部可以声明多个@Bean方法:

java 复制代码
@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

最佳实践:

  • 配置类应保持无状态
  • 避免在@Bean方法中调用其他@Bean方法(使用参数依赖注入)
  • 使用@Configuration(proxyBeanMethods = false)优化启动性能(SpringBoot 2.2+)
2.2.2 属性绑定注解:@ConfigurationProperties

@ConfigurationProperties 实现类型安全的属性绑定,将配置文件中的属性值注入到Bean中:

java 复制代码
@Configuration
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceConfig {
    private String url;
    private String username;
    private String password;
    private int maxPoolSize = 10;
    
    // 省略getter/setter
}

配合application.yml使用:

yaml 复制代码
app:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: securepass
    max-pool-size: 15
2.2.3 环境配置注解:@Profile

@Profile 实现环境隔离,根据当前激活的profile决定是否装配Bean:

java 复制代码
@Configuration
public class DatabaseConfig {
    
    @Bean
    @Profile("dev")
    public DataSource devDataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .build();
    }
    
    @Bean
    @Profile("prod")
    public DataSource prodDataSource() {
        return new HikariDataSource();
    }
}

2.3 条件装配注解体系

SpringBoot的条件装配注解是自动配置的基石,它们控制着Bean的创建条件:

注解 功能描述 使用示例
@ConditionalOnClass 类路径存在指定类时生效 @ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean 容器中不存在指定Bean时生效 @ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty 配置属性满足条件时生效 @ConditionalOnProperty(name="cache.enabled", havingValue="true")
@ConditionalOnWebApplication Web环境下生效 @ConditionalOnWebApplication(type=SERVLET)
@ConditionalOnExpression SpEL表达式为true时生效 @ConditionalOnExpression("${feature.enabled:false}")

自定义条件注解示例:

java 复制代码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Conditional(OnProductionEnvironmentCondition.class)
public @interface ConditionalOnProductionEnvironment {
}

public class OnProductionEnvironmentCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, 
                           AnnotatedTypeMetadata metadata) {
        String env = context.getEnvironment().getProperty("app.env");
        return "prod".equalsIgnoreCase(env);
    }
}

2.4 自动配置原理深度剖析

SpringBoot自动配置的核心机制:

graph TD A[启动类] --> B[@SpringBootApplication] B --> C[@EnableAutoConfiguration] C --> D[加载AutoConfigurationImportSelector] D --> E[读取spring.factories] E --> F[获取自动配置类列表] F --> G[应用条件注解过滤] G --> H[注册符合条件的配置类] H --> I[初始化自动配置的Bean]

关键流程解析:

  1. AutoConfigurationImportSelector 使用 SpringFactoriesLoader 加载配置
  2. 从 META-INF/spring.factories 读取 org.springframework.boot.autoconfigure.EnableAutoConfiguration 配置项
  3. 对候选配置类应用所有 @Conditional 条件
  4. 仅注册满足所有条件的配置类
  5. 配置类中定义的Bean被注册到Spring容器

三、SpringBoot 3.0 vs 2.0 全面对比

3.1 基础依赖与JDK要求

特性 Spring Boot 2.x Spring Boot 3.0 升级影响
JDK要求 JDK 8+ (推荐11) JDK 17+ 必须升级JDK
Spring Framework 5.x 6.0 重大变更
Jakarta EE Java EE 8 Jakarta EE 9+ 包名变更
最低Servlet版本 3.1 5.0 Tomcat 10+

3.2 Jakarta EE 9+ 迁移影响

Spring Boot 3.0 最大的变化是从Java EE转向Jakarta EE命名空间:

java 复制代码
// Spring Boot 2.x
import javax.servlet.http.HttpServletRequest;

// Spring Boot 3.0
import jakarta.servlet.http.HttpServletRequest;

迁移策略:

  1. 使用IDE的全局替换功能
  2. 添加兼容依赖(过渡期):
xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>${spring-boot.version}</version>
    <scope>provided</scope>
</dependency>
  1. 使用官方迁移工具:jakartaee-migration

3.3 自动配置机制增强

3.3.1 自动配置注册方式变更

Spring Boot 3.0 使用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 替代传统的 spring.factories:

text 复制代码
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.MyAutoConfiguration
com.example.AnotherAutoConfiguration

优势:

  • 简化配置
  • 支持多文件合并
  • 更好的IDE支持
3.3.2 条件注解增强

新增 @AutoConfiguration 注解,用于标记自动配置类:

java 复制代码
@AutoConfiguration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
    // ...
}

3.4 响应式编程全面增强

Spring Boot 3.0 对响应式编程的支持更加完善:

java 复制代码
// 响应式控制器
@RestController
public class ReactiveUserController {

    @GetMapping("/users")
    public Flux<User> getUsers() {
        return userRepository.findAll();
    }
    
    @GetMapping("/users/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userRepository.findById(id);
    }
}

// 响应式安全配置
@EnableWebFluxSecurity
public class SecurityConfig {
    
    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http
            .authorizeExchange(exchanges -> 
                exchanges.pathMatchers("/public/**").permitAll()
                         .anyExchange().authenticated())
            .formLogin()
            .build();
    }
}

3.5 全新的Problem Details支持

Spring Boot 3.0 引入 RFC 7807 标准的错误响应格式:

java 复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(UserNotFoundException.class)
    public ProblemDetail handleUserNotFound(UserNotFoundException ex) {
        ProblemDetail problemDetail = ProblemDetail.forStatus(HttpStatus.NOT_FOUND);
        problemDetail.setTitle("User Not Found");
        problemDetail.setDetail(ex.getMessage());
        problemDetail.setProperty("timestamp", Instant.now());
        problemDetail.setProperty("errorCode", "USER_404");
        return problemDetail;
    }
}

响应示例:

json 复制代码
{
  "type": "about:blank",
  "title": "User Not Found",
  "status": 404,
  "detail": "User with ID 123 not found",
  "timestamp": "2023-08-15T10:00:00Z",
  "errorCode": "USER_404"
}

3.6 GraalVM原生镜像支持

Spring Boot 3.0 提供开箱即用的GraalVM原生镜像支持:

构建步骤:

  1. 添加Native Build Tools插件:
xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.graalvm.buildtools</groupId>
            <artifactId>native-maven-plugin</artifactId>
            <version>0.9.19</version>
            <executions>
                <execution>
                    <id>build-native</id>
                    <goals>
                        <goal>compile-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  1. 添加AOT插件:
xml 复制代码
<dependency>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-aot</artifactId>
    <version>0.12.1</version>
</dependency>
  1. 构建原生镜像:
bash 复制代码
mvn -Pnative native:compile

性能对比:

指标 JVM模式 Native模式 提升
启动时间 2.5s 0.05s 50倍
内存占用 480MB 80MB 6倍
响应时间 45ms 15ms 3倍

3.7 数据访问层重大改进

3.7.1 JDBC增强
  1. 自动注册 JdbcClient(替代JdbcTemplate)
java 复制代码
@Repository
public class UserRepository {
    
    private final JdbcClient jdbcClient;
    
    public UserRepository(JdbcClient jdbcClient) {
        this.jdbcClient = jdbcClient;
    }
    
    public List<User> findAll() {
        return jdbcClient.sql("SELECT * FROM users")
                .query(User.class)
                .list();
    }
}
  1. 改进的批处理操作:
java 复制代码
jdbcClient.batchUpdate("INSERT INTO users (name, email) VALUES (?, ?)")
        .params(List.of(args1, args2, args3))
        .execute();
3.7.2 Spring Data 2023.0 新特性
  1. JDBC Repository增强:
java 复制代码
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    
    @Query("SELECT * FROM users WHERE age > :age")
    List<User> findByAgeGreaterThan(int age);
    
    @Modifying
    @Query("UPDATE users SET name = :name WHERE id = :id")
    int updateName(@Param("id") Long id, @Param("name") String name);
}
  1. 支持Projections的DTO映射:
java 复制代码
public interface UserSummary {
    String getName();
    String getEmail();
    
    @Value("#{target.name + ' (' + target.email + ')'}")
    String getDisplayName();
}

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    List<UserSummary> findAllProjectedBy();
}

3.8 安全体系升级

3.8.1 OAuth2资源服务器简化配置

Spring Boot 3.0 简化了OAuth2资源服务器的配置:

java 复制代码
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated())
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(Customizer.withDefaults()));
        return http.build();
    }
}
3.8.2 全新的安全事件体系

Spring Security 6.0 引入全新的事件模型:

java 复制代码
@Component
public class SecurityEventListener {
    
    @EventListener
    public void onAuthenticationSuccess(AuthenticationSuccessEvent event) {
        Authentication authentication = event.getAuthentication();
        // 记录登录成功日志
    }
    
    @EventListener
    public void onAuthorizationFailure(AuthorizationDeniedEvent event) {
        // 处理授权失败事件
    }
}

3.9 监控与可观测性

Spring Boot 3.0 集成Micrometer 1.10+和Micrometer Tracing,提供开箱即用的可观测性支持:

yaml 复制代码
management:
  tracing:
    sampling:
      probability: 1.0 # 100%采样
  metrics:
    export:
      prometheus:
        enabled: true
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus

集成OpenTelemetry:

java 复制代码
@Configuration
public class OpenTelemetryConfig {
    
    @Bean
    public OpenTelemetry openTelemetry() {
        return OpenTelemetrySdk.builder()
            .setTracerProvider(
                SdkTracerProvider.builder()
                    .addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().build()).build())
                    .build())
            .setMeterProvider(
                SdkMeterProvider.builder()
                    .registerMetricReader(
                        PeriodicMetricReader.builder(OtlpGrpcMetricExporter.builder().build()).build())
                    .build())
            .build();
    }
}

3.10 测试体系改进

3.10.1 增强的@SpringBootTest
java 复制代码
@SpringBootTest(
    webEnvironment = WebEnvironment.RANDOM_PORT,
    properties = {
        "spring.datasource.url=jdbc:h2:mem:testdb",
        "logging.level.root=WARN"
    }
)
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class UserControllerTests {
    
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    void shouldReturnUserWhenExists() throws Exception {
        mockMvc.perform(get("/users/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("John Doe"));
    }
}
3.10.2 测试切片注解增强

新增 @JdbcTest 用于纯JDBC测试:

java 复制代码
@JdbcTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
@Import(DataSourceConfig.class)
public class JdbcUserRepositoryTests {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Test
    void shouldSaveUser() {
        // 测试数据访问逻辑
    }
}

四、Spring Boot 3.0新特性全景图

4.1 核心新特性汇总

特性类别 关键特性 版本要求
基础架构 JDK 17基线支持 3.0+
依赖管理 Jakarta EE 9+ 3.0+
自动配置 新的自动配置注册机制 3.0+
数据访问 JDBC Client API 3.0+
响应式编程 响应式Security优化 3.0+
原生支持 GraalVM原生镜像 3.0+
可观测性 Micrometer Tracing集成 3.0+
问题处理 RFC 7807支持 3.0+

4.2 迁移路径指南

推荐迁移步骤:
评估兼容性 升级JDK 17 解决编译错误 Jakarta EE包名迁移 更新依赖版本 测试自动配置 验证安全配置 性能测试 部署验证

常见问题解决方案:

  1. 包名冲突问题:
xml 复制代码
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>
  1. 过时API替换:
java 复制代码
// 旧版
WebSecurityConfigurerAdapter

// 新版
@Bean
SecurityFilterChain
  1. Hibernate 6.x变化:
java 复制代码
// 旧版
@Column(name = "user_name")

// 新版
@Column(name = "\"userName\"") // 需要转义保留字

五、实战:从Spring Boot 2.7升级到3.1

5.1 升级准备

  1. 依赖管理调整:
xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.0</version>
</parent>
  1. Java版本设置:
xml 复制代码
<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

5.2 解决兼容性问题

步骤1:处理废弃API

java 复制代码
// 替换WebMvcConfigurerAdapter
@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 实现接口方法
}

// 替换SpringExtension
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
public class ServiceTest {
    // ...
}

步骤2:更新安全配置

java 复制代码
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .permitAll()
            )
            .logout(logout -> logout
                .logoutSuccessUrl("/")
            );
        return http.build();
    }
}

5.3 利用新特性重构

示例1:使用JdbcClient

java 复制代码
@Repository
public class UserRepository {
    
    private final JdbcClient jdbcClient;
    
    public UserRepository(JdbcClient jdbcClient) {
        this.jdbcClient = jdbcClient;
    }
    
    public Optional<User> findById(Long id) {
        return jdbcClient.sql("SELECT * FROM users WHERE id = :id")
                .param("id", id)
                .query(User.class)
                .optional();
    }
    
    public int updateEmail(Long id, String email) {
        return jdbcClient.sql("UPDATE users SET email = :email WHERE id = :id")
                .param("email", email)
                .param("id", id)
                .update();
    }
}

示例2:响应式安全配置

java 复制代码
@EnableWebFluxSecurity
public class ReactiveSecurityConfig {
    
    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http
            .authorizeExchange(exchanges -> exchanges
                .pathMatchers("/resources/**", "/login").permitAll()
                .pathMatchers("/admin/**").hasRole("ADMIN")
                .anyExchange().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")
            )
            .logout(logout -> logout
                .logoutUrl("/logout")
            )
            .csrf(csrf -> csrf.disable())
            .build();
    }
}

六、性能对比与调优建议

6.1 启动性能对比(相同硬件环境)

应用规模 Spring Boot 2.7 Spring Boot 3.1 提升幅度
小型应用(<50个Bean) 2.1s 1.4s 33%
中型应用(50-200个Bean) 4.5s 2.8s 38%
大型应用(>200个Bean) 8.9s 5.2s 42%

6.2 内存占用对比

运行阶段 Spring Boot 2.7 Spring Boot 3.1 优化效果
启动初始内存 180MB 120MB 33%↓
稳定运行内存 450MB 320MB 29%↓
高负载内存 780MB 550MB 30%↓

6.3 调优最佳实践

  1. 懒加载优化:
java 复制代码
@SpringBootApplication
@Lazy
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  1. 编译时优化:
bash 复制代码
# 开启AOT模式
mvn spring-boot:run -Dspring-boot.aot.enabled=true
  1. 原生镜像构建:
bash 复制代码
mvn -Pnative native:compile
  1. 配置优化:
yaml 复制代码
spring:
  main:
    lazy-initialization: true # 全局懒加载
  jmx:
    enabled: false # 禁用JMX
  autoconfigure:
    exclude: 
      - org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration

七、总结与展望

7.1 SpringBoot演进路线

SpringBoot从2.x到3.x的演进体现了几个关键趋势:

  1. 云原生优先:全面拥抱Kubernetes、Serverless等云原生架构
  2. 性能极致优化:通过AOT、GraalVM实现超快启动
  3. 开发体验提升:更简洁的API设计,更智能的自动配置
  4. 可观测性内置:深度集成Micrometer和OpenTelemetry
  5. 安全加固:符合现代安全标准的最佳实践

7.2 未来技术展望

根据Spring生态的演进趋势,未来可能的发展方向:

  1. 全面GraalVM支持:Spring 6.x将深度集成GraalVM原生编译
  2. Serverless优化:针对函数式计算模型的特殊优化
  3. AI集成:内置机器学习模型部署支持
  4. 区块链适配:提供区块链应用开发的starter
  5. 量子计算准备:为未来量子计算革命做准备的基础设施

7.3 升级决策建议

根据项目特点选择合适的升级策略:

项目类型 建议策略 说明
新建项目 直接使用3.1 充分利用最新特性
中小型项目 渐进式升级 分模块逐步迁移
大型遗留系统 评估后决策 权衡成本与收益
云原生应用 优先升级 原生支持优势明显
传统企业应用 规划升级 利用性能和安全改进

升级价值矩阵:
技术价值 性能提升 安全增强 新特性 业务价值 上市时间缩短 运维成本降低 系统稳定性提高

无论选择何种策略,Spring Boot 3.x都代表了Java应用开发的未来方向,值得每个Java开发者深入学习和掌握。

本次升级探索之旅至此结束,但技术创新的步伐永不停歇。Spring Boot 3.x带来的不仅是技术革新,更是一种开发范式的进化。让我们拥抱变化,共创未来!

相关推荐
光依旧4 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
用户847172102844 小时前
.shot 文件格式规范
前端·后端
MZ_ZXD0015 小时前
【关注可白嫖源码】--课程设计--毕业设计-- 29210 Vue.js 3+Springboot中药材基本信息与图片查询系统
javascript·spring boot·课程设计·毕设·大作业·程序开发·毕设代做
弹简特5 小时前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖5 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran5 小时前
Spring IoC和DI概念篇
java·后端·spring
Cheney Pan5 小时前
第4篇 Spring Boot 应用监控:Micrometer 与 JVM 指标
jvm·spring boot·后端·prometheus
阿钱真强道5 小时前
30 嵌入式操作系统 | 上位机界面:Flask 网页显示 + 控制闭环
后端·python·flask
小狼154545 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang55 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收