青岛网站建设哪个平台好中国建设招标网 官方网站下载

张小明 2025/12/31 16:39:10
青岛网站建设哪个平台好,中国建设招标网 官方网站下载,长沙网站制作案例,定制wordpressSpring Boot 4.0 整合 MyBatis-Plus 完整教程注#xff1a;Spring Boot 4.0 #xff0c;本教程基于 Spring Boot 4.0 的预览版和新特性预期进行构建。实际发布时可能会有调整。一、Spring Boot 4.0 新特性概述 1.1 主要新特性 Java 21 支持#xff1a;基于虚拟线程的响应式编…Spring Boot 4.0 整合 MyBatis-Plus 完整教程注Spring Boot 4.0 本教程基于 Spring Boot 4.0 的预览版和新特性预期进行构建。实际发布时可能会有调整。一、Spring Boot 4.0 新特性概述1.1 主要新特性Java 21 支持基于虚拟线程的响应式编程增强GraalVM 原生镜像优化更完善的 AOT 编译支持响应式编程增强更好的响应式 MyBatis 支持模块化改进更好的 Java Module 支持AI/机器学习集成内置 AI 功能支持1.2 构建工具要求JDK 21Maven 3.9 或 Gradle 8.5GraalVM 23.0可选用于原生编译二、项目初始化2.1 使用 Spring Initializr# 使用官方 Initializrcurlhttps://start.spring.io/starter.zip\-dtypemaven-project\-dlanguagejava\-dbootVersion4.0.0-M1\-dbaseDirspring-boot4-mybatisplus\-dgroupIdcom.example\-dartifactIddemo\-dnamedemo\-ddescriptionDemoprojectforSpringBoot4.0withMyBatis-Plus\-dpackageNamecom.example.demo\-dpackagingjar\-djavaVersion21\-ddependenciesweb,data-jpa\-o demo.zip2.2 手动创建 pom.xml?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion4.0.0-M1/versionrelativePath//parentgroupIdcom.example/groupIdartifactIdspringboot4-mybatisplus/artifactIdversion1.0.0/versionnamespringboot4-mybatisplus/namedescriptionSpring Boot 4.0 with MyBatis-Plus/descriptionpropertiesjava.version21/java.versionmybatis-plus.version3.5.5/mybatis-plus.versiongraalvm.version23.0.0/graalvm.version/propertiesdependencies!-- Spring Boot 4.0 核心依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 响应式 Web 支持新特性 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId/dependency!-- MyBatis-Plus --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion${mybatis-plus.version}/version/dependency!-- 数据库驱动 --dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependency!-- 响应式 MySQL 驱动新特性 --dependencygroupIdio.asyncer/groupIdartifactIdr2dbc-mysql/artifactIdscoperuntime/scope/dependency!-- 响应式 R2DBC --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-r2dbc/artifactId/dependency!-- Lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- GraalVM 原生镜像支持新特性 --dependencygroupIdorg.graalvm.buildtools/groupIdartifactIdnative-maven-plugin/artifactId/dependency!-- 测试依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency!-- 响应式测试支持 --dependencygroupIdio.projectreactor/groupIdartifactIdreactor-test/artifactIdscopetest/scope/dependency/dependenciesbuildplugins!-- Spring Boot Maven 插件支持 AOT --plugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationimagebuilderpaketobuildpacks/builder-jammy-tiny:latest/builderenvBP_NATIVE_IMAGEtrue/BP_NATIVE_IMAGE/env/image/configuration/plugin!-- GraalVM Native Image 插件 --plugingroupIdorg.graalvm.buildtools/groupIdartifactIdnative-maven-plugin/artifactIdversion${graalvm.version}/versionextensionstrue/extensionsexecutionsexecutionidbuild-native/idgoalsgoalcompile-no-fork/goal/goalsphasepackage/phase/execution/executions/plugin/plugins/build!-- Spring Milestone 仓库 --repositoriesrepositoryidspring-milestones/idnameSpring Milestones/nameurlhttps://repo.spring.io/milestone/urlsnapshotsenabledfalse/enabled/snapshots/repository/repositories/project三、配置 MyBatis-Plus3.1 应用配置application.yml# Spring Boot 4.0 新配置格式spring:application:name:springboot4-mybatisplus# 数据源配置虚拟线程优化datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrueusername:rootpassword:123456hikari:# 虚拟线程池配置Spring Boot 4.0 新特性thread-factory:org.springframework.boot.jdbc.VirtualThreadExecutor# 响应式数据源新特性r2dbc:url:r2dbc:mysql://localhost:3306/mybatis_plus_demousername:rootpassword:123456# AOT 编译配置aot:enabled:truegenerate-code:true# GraalVM 原生镜像配置native:mode:nativedebug:true# MyBatis-Plus 配置mybatis-plus:configuration:# 自动映射行为auto-mapping-behavior:full# 驼峰命名转换map-underscore-to-camel-case:true# 日志实现log-impl:org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 逻辑删除字段名logic-delete-field:deleted# 逻辑删除值logic-delete-value:1# 逻辑未删除值logic-not-delete-value:0# 主键类型id-type:auto# 分页插件配置pagehelper:helper-dialect:mysqlreasonable:truesupport-methods-arguments:true# 日志配置logging:level:com.example.demo.mapper:debugorg.springframework.r2dbc:debugpattern:console:%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n# 虚拟线程配置Spring Boot 4.0 新特性server:tomcat:threads:# 使用虚拟线程use-virtual-threads:true# 响应式服务器配置netty:connection-timeout:2m3.2 MyBatis-Plus 配置类packagecom.example.demo.config;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler;importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;importorg.apache.ibatis.reflection.MetaObject;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.transaction.annotation.EnableTransactionManagement;importjava.time.LocalDateTime;/** * MyBatis-Plus 配置类 * 使用 Spring Boot 4.0 新特性虚拟线程兼容性配置 */ConfigurationEnableTransactionManagementMapperScan(com.example.demo.mapper)publicclassMyBatisPlusConfig{/** * MyBatis-Plus 拦截器配置 * 支持分页、乐观锁、防全表更新与删除 */BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));// 乐观锁插件interceptor.addInnerInterceptor(newOptimisticLockerInnerInterceptor());// 防止全表更新与删除interceptor.addInnerInterceptor(newBlockAttackInnerInterceptor());returninterceptor;}/** * 元数据处理器 - 自动填充字段 */BeanpublicMetaObjectHandlermetaObjectHandler(){returnnewMetaObjectHandler(){OverridepublicvoidinsertFill(MetaObjectmetaObject){// 使用虚拟线程安全的日期时间this.strictInsertFill(metaObject,createTime,LocalDateTime.class,LocalDateTime.now());this.strictInsertFill(metaObject,updateTime,LocalDateTime.class,LocalDateTime.now());this.strictInsertFill(metaObject,version,Integer.class,1);}OverridepublicvoidupdateFill(MetaObjectmetaObject){this.strictUpdateFill(metaObject,updateTime,LocalDateTime.class,LocalDateTime.now());}};}}四、实体类与 Mapper4.1 基础实体类packagecom.example.demo.entity;importcom.baomidou.mybatisplus.annotation.*;importlombok.Data;importlombok.experimental.Accessors;importjava.io.Serializable;importjava.time.LocalDateTime;/** * 基础实体类 * 使用 Java 21 Record 模式预览特性 */DataAccessors(chaintrue)publicclassBaseEntityimplementsSerializable{/** * 主键ID - 使用虚拟线程安全的ID生成策略 */TableId(typeIdType.ASSIGN_ID)privateLongid;/** * 创建时间 */TableField(fillFieldFill.INSERT)privateLocalDateTimecreateTime;/** * 更新时间 */TableField(fillFieldFill.INSERT_UPDATE)privateLocalDateTimeupdateTime;/** * 创建人 */TableField(fillFieldFill.INSERT)privateStringcreateBy;/** * 更新人 */TableField(fillFieldFill.INSERT_UPDATE)privateStringupdateBy;/** * 乐观锁版本号 */VersionTableField(fillFieldFill.INSERT)privateIntegerversion;/** * 逻辑删除标志 */TableLogicTableField(fillFieldFill.INSERT)privateIntegerdeleted;}4.2 用户实体类packagecom.example.demo.entity;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.annotation.TableName;importlombok.Data;importlombok.EqualsAndHashCode;importlombok.experimental.Accessors;/** * 用户实体类 * 使用 Spring Boot 4.0 新特性虚拟线程安全的序列化 */DataEqualsAndHashCode(callSupertrue)Accessors(chaintrue)TableName(sys_user)publicclassUserextendsBaseEntity{/** * 用户名 */privateStringusername;/** * 密码 */privateStringpassword;/** * 邮箱 */privateStringemail;/** * 手机号 */privateStringphone;/** * 状态0-禁用1-启用 */privateIntegerstatus;/** * 虚拟线程安全的额外字段 * 使用 transient 避免序列化问题 */TableField(existfalse)privatetransientStringvirtualThreadInfo;}4.3 Mapper 接口packagecom.example.demo.mapper;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.demo.entity.User;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Select;importorg.springframework.data.repository.query.Param;importorg.springframework.r2dbc.core.DatabaseClient;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;/** * 用户 Mapper * 支持响应式查询Spring Boot 4.0 新特性 */MapperpublicinterfaceUserMapperextendsBaseMapperUser{/** * 传统阻塞式查询 */Select(SELECT * FROM sys_user WHERE username #{username})UserselectByUsername(Param(username)Stringusername);/** * 响应式查询 - 返回单个结果 * 使用虚拟线程安全的方式 */Select(SELECT * FROM sys_user WHERE id #{id})defaultMonoUserselectReactiveById(Longid,DatabaseClientdatabaseClient){returndatabaseClient.sql(SELECT * FROM sys_user WHERE id :id).bind(id,id).map((row,metadata)-{UserusernewUser();user.setId(row.get(id,Long.class));user.setUsername(row.get(username,String.class));user.setEmail(row.get(email,String.class));user.setStatus(row.get(status,Integer.class));returnuser;}).one();}/** * 响应式查询 - 返回多个结果 */Select(SELECT * FROM sys_user WHERE status #{status})defaultFluxUserselectReactiveByStatus(Integerstatus,DatabaseClientdatabaseClient){returndatabaseClient.sql(SELECT * FROM sys_user WHERE status :status).bind(status,status).map((row,metadata)-{UserusernewUser();user.setId(row.get(id,Long.class));user.setUsername(row.get(username,String.class));user.setEmail(row.get(email,String.class));user.setStatus(row.get(status,Integer.class));returnuser;}).all();}}五、Service 层实现5.1 接口定义packagecom.example.demo.service;importcom.baomidou.mybatisplus.extension.service.IService;importcom.example.demo.entity.User;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;importjava.util.concurrent.CompletableFuture;/** * 用户服务接口 * 支持响应式和虚拟线程 */publicinterfaceUserServiceextendsIServiceUser{/** * 虚拟线程方式查询用户 * Spring Boot 4.0 新特性 */CompletableFutureUserfindUserByUsernameVirtualThread(Stringusername);/** * 响应式查询用户 */MonoUserfindUserByIdReactive(Longid);/** * 响应式查询用户列表 */FluxUserfindUsersByStatusReactive(Integerstatus);/** * 使用结构化并发Java 21 新特性 */UserfindUserWithStructuredConcurrency(Longid);}5.2 服务实现packagecom.example.demo.service.impl;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.example.demo.entity.User;importcom.example.demo.mapper.UserMapper;importcom.example.demo.service.UserService;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.r2dbc.core.DatabaseClient;importorg.springframework.stereotype.Service;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.StructuredTaskScope;importjava.util.concurrent.TimeUnit;/** * 用户服务实现 * 使用 Spring Boot 4.0 新特性虚拟线程和响应式编程 */Slf4jServiceRequiredArgsConstructorpublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsUserService{privatefinalUserMapperuserMapper;privatefinalDatabaseClientdatabaseClient;OverridepublicCompletableFutureUserfindUserByUsernameVirtualThread(Stringusername){returnCompletableFuture.supplyAsync(()-{// 在虚拟线程中执行try{// 模拟耗时操作Thread.sleep(100);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}returnuserMapper.selectOne(newLambdaQueryWrapperUser().eq(User::getUsername,username));},Thread.ofVirtual().factory());}OverridepublicMonoUserfindUserByIdReactive(Longid){returnuserMapper.selectReactiveById(id,databaseClient).doOnNext(user-log.info(Found user reactively: {},user.getUsername()));}OverridepublicFluxUserfindUsersByStatusReactive(Integerstatus){returnuserMapper.selectReactiveByStatus(status,databaseClient).doOnNext(user-log.info(Streaming user: {},user.getUsername()));}OverridepublicUserfindUserWithStructuredConcurrency(Longid){// Java 21 结构化并发try(varscopenewStructuredTaskScope.ShutdownOnFailure()){varuserFuturescope.fork(()-userMapper.selectById(id));varuserDetailsFuturescope.fork(()-// 模拟获取用户详情User Details for ID: id);scope.join();scope.throwIfFailed();UseruseruserFuture.get();if(user!null){user.setVirtualThreadInfo(userDetailsFuture.get());}returnuser;}catch(InterruptedExceptione){Thread.currentThread().interrupt();thrownewRuntimeException(Task interrupted,e);}catch(Exceptione){thrownewRuntimeException(Failed to fetch user,e);}}/** * 批量保存用户 - 使用虚拟线程优化 */publicvoidsaveUsersWithVirtualThreads(ListUserusers){try(varscopenewStructuredTaskScope.ShutdownOnFailure()){ListStructuredTaskScope.SubtaskUsertasksusers.stream().map(user-scope.fork(()-{// 每个用户保存操作在独立的虚拟线程中执行save(user);returnuser;})).toList();scope.join();scope.throwIfFailed();// 处理结果tasks.forEach(task-log.info(Saved user: {},task.get().getUsername()));}catch(InterruptedExceptione){Thread.currentThread().interrupt();thrownewRuntimeException(Save interrupted,e);}catch(Exceptione){thrownewRuntimeException(Failed to save users,e);}}}六、Controller 层6.1 传统 REST Controllerpackagecom.example.demo.controller;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importcom.example.demo.entity.User;importcom.example.demo.service.UserService;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.*;importjava.util.List;importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;/** * 用户控制器 * 支持虚拟线程和传统阻塞模式 */Slf4jRestControllerRequestMapping(/api/v1/users)RequiredArgsConstructorpublicclassUserController{privatefinalUserServiceuserService;/** * 创建用户 */PostMappingpublicResponseEntityUsercreate(RequestBodyUseruser){booleansaveduserService.save(user);returnsaved?ResponseEntity.ok(user):ResponseEntity.badRequest().build();}/** * 分页查询用户 * 使用虚拟线程优化 */GetMapping(/page)publicResponseEntityIPageUserpage(RequestParam(defaultValue1)Integercurrent,RequestParam(defaultValue10)Integersize){PageUserpagenewPage(current,size);IPageUserresultuserService.page(page);returnResponseEntity.ok(result);}/** * 使用虚拟线程查询用户 * Spring Boot 4.0 新特性 */GetMapping(/virtual/{username})publicResponseEntityUserfindByUsernameVirtual(PathVariableStringusername)throwsExecutionException,InterruptedException{CompletableFutureUserfutureuserService.findUserByUsernameVirtualThread(username);returnResponseEntity.ok(future.get());}/** * 使用结构化并发查询用户 * Java 21 新特性 */GetMapping(/structured/{id})publicResponseEntityUserfindWithStructuredConcurrency(PathVariableLongid){UseruseruserService.findUserWithStructuredConcurrency(id);returnResponseEntity.ok(user);}/** * 批量创建用户 - 使用虚拟线程 */PostMapping(/batch/virtual)publicResponseEntityVoidcreateBatchVirtual(RequestBodyListUserusers){// 在新线程中执行批量操作Thread.ofVirtual().start(()-{userService.saveUsersWithVirtualThreads(users);});returnResponseEntity.accepted().build();}}6.2 响应式 Controllerpackagecom.example.demo.controller;importcom.example.demo.entity.User;importcom.example.demo.service.UserService;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.http.MediaType;importorg.springframework.web.bind.annotation.*;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;importjava.time.Duration;/** * 响应式用户控制器 * Spring Boot 4.0 响应式增强 */Slf4jRestControllerRequestMapping(/api/v2/users)RequiredArgsConstructorpublicclassUserReactiveController{privatefinalUserServiceuserService;/** * 响应式查询单个用户 */GetMapping(/reactive/{id})publicMonoResponseEntityUserfindByIdReactive(PathVariableLongid){returnuserService.findUserByIdReactive(id).map(ResponseEntity::ok).defaultIfEmpty(ResponseEntity.notFound().build());}/** * 响应式查询用户列表 */GetMapping(value/reactive/stream,producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxUserstreamByStatus(RequestParamIntegerstatus){returnuserService.findUsersByStatusReactive(status).delayElements(Duration.ofMillis(100))// 模拟流式处理.doOnNext(user-log.info(Streaming user: {},user.getUsername()));}/** * SSE 流式传输 */GetMapping(value/sse,producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxStringuserEvents(){returnFlux.interval(Duration.ofSeconds(1)).map(sequence-String.format(User Event %d at %s,sequence,java.time.LocalTime.now()));}}七、响应式 Repositorypackagecom.example.demo.repository;importcom.example.demo.entity.User;importorg.springframework.data.r2dbc.repository.R2dbcRepository;importorg.springframework.data.r2dbc.repository.Query;importorg.springframework.stereotype.Repository;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;/** * 响应式用户仓库 * Spring Boot 4.0 响应式数据访问 */RepositorypublicinterfaceUserReactiveRepositoryextendsR2dbcRepositoryUser,Long{/** * 根据用户名查询 */Query(SELECT * FROM sys_user WHERE username :username)MonoUserfindByUsername(Stringusername);/** * 根据状态查询 */Query(SELECT * FROM sys_user WHERE status :status)FluxUserfindByStatus(Integerstatus);/** * 分页查询 */Query(SELECT * FROM sys_user ORDER BY create_time DESC LIMIT :limit OFFSET :offset)FluxUserfindAllWithPagination(intlimit,intoffset);}八、全局异常处理packagecom.example.demo.handler;importcom.baomidou.mybatisplus.core.exceptions.MybatisPlusException;importlombok.extern.slf4j.Slf4j;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.bind.support.WebExchangeBindException;importreactor.core.publisher.Mono;importjava.util.HashMap;importjava.util.Map;/** * 全局异常处理器 * 支持响应式异常处理 */Slf4jRestControllerAdvicepublicclassGlobalExceptionHandler{/** * 处理 MyBatis-Plus 异常 */ExceptionHandler(MybatisPlusException.class)publicResponseEntityMapString,ObjecthandleMybatisPlusException(MybatisPlusExceptione){log.error(MyBatis-Plus Exception: {},e.getMessage(),e);MapString,ObjectresponsenewHashMap();response.put(code,HttpStatus.INTERNAL_SERVER_ERROR.value());response.put(message,数据库操作失败);response.put(detail,e.getMessage());response.put(timestamp,System.currentTimeMillis());returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);}/** * 处理虚拟线程中断异常 */ExceptionHandler(InterruptedException.class)publicResponseEntityMapString,ObjecthandleInterruptedException(InterruptedExceptione){log.warn(Virtual thread interrupted: {},e.getMessage());MapString,ObjectresponsenewHashMap();response.put(code,HttpStatus.SERVICE_UNAVAILABLE.value());response.put(message,请求被中断);response.put(timestamp,System.currentTimeMillis());Thread.currentThread().interrupt();// 恢复中断状态returnResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(response);}/** * 响应式异常处理 */ExceptionHandler(WebExchangeBindException.class)publicMonoResponseEntityMapString,ObjecthandleBindException(WebExchangeBindExceptione){returnMono.fromCallable(()-{MapString,ObjectresponsenewHashMap();response.put(code,HttpStatus.BAD_REQUEST.value());response.put(message,参数验证失败);MapString,StringerrorsnewHashMap();e.getFieldErrors().forEach(error-errors.put(error.getField(),error.getDefaultMessage()));response.put(errors,errors);response.put(timestamp,System.currentTimeMillis());returnResponseEntity.badRequest().body(response);});}}九、虚拟线程配置packagecom.example.demo.config;importorg.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;importorg.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.task.AsyncTaskExecutor;importorg.springframework.core.task.support.TaskExecutorAdapter;importorg.springframework.scheduling.annotation.EnableAsync;importjava.util.concurrent.Executors;/** * 虚拟线程配置 * Spring Boot 4.0 核心新特性 */ConfigurationEnableAsyncpublicclassVirtualThreadConfig{/** * 配置 Tomcat 使用虚拟线程 */BeanpublicTomcatProtocolHandlerCustomizer?protocolHandlerVirtualThreadExecutorCustomizer(){returnprotocolHandler-protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());}/** * 配置 Spring 异步任务执行器使用虚拟线程 */Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)publicAsyncTaskExecutorasyncTaskExecutor(){returnnewTaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());}/** * 配置虚拟线程池用于数据库操作 */Beanpublicjava.util.concurrent.ExecutorServicedatabaseExecutor(){returnExecutors.newThreadPerTaskExecutor(Thread.ofVirtual().name(db-virtual-thread-,0).factory());}}十、AOT 和原生镜像支持10.1 创建 AOT 处理类packagecom.example.demo.aot;importorg.springframework.aot.hint.RuntimeHints;importorg.springframework.aot.hint.RuntimeHintsRegistrar;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.ImportRuntimeHints;/** * AOT 运行时提示注册 * Spring Boot 4.0 原生镜像支持 */ConfigurationImportRuntimeHints(AotRuntimeHints.MybatisPlusRuntimeHints.class)publicclassAotRuntimeHints{staticclassMybatisPlusRuntimeHintsimplementsRuntimeHintsRegistrar{OverridepublicvoidregisterHints(RuntimeHintshints,ClassLoaderclassLoader){// 注册反射hints.reflection().registerType(com.baomidou.mybatisplus.core.mapper.BaseMapper.class,hint-hint.withMembers(org.springframework.aot.hint.MemberCategory.INVOKE_PUBLIC_METHODS));// 注册资源hints.resources().registerPattern(mapper/*.xml);hints.resources().registerPattern(mybatis-config.xml);// 注册序列化hints.serialization().registerType(com.example.demo.entity.User.class);// 注册代理hints.proxies().registerJdkProxy(org.apache.ibatis.binding.MapperProxy.class);}}}10.2 native-image.propertiesArgs --enable-url-protocolshttp,https \ -H:ReportExceptionStackTraces \ -H:ReportUnsupportedElementsAtRuntime \ --initialize-at-build-timecom.mysql.cj \ --initialize-at-run-timeio.netty.handler.codec.http.HttpObjectEncoder \ -H:IncludeResourceBundlescom.mysql.cj.LocalizedErrorMessages十一、测试类packagecom.example.demo;importcom.example.demo.entity.User;importcom.example.demo.service.UserService;importlombok.extern.slf4j.Slf4j;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importreactor.core.publisher.Mono;importreactor.test.StepVerifier;importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.TimeoutException;importstaticorg.assertj.core.api.Assertions.assertThat;/** * 集成测试 * 测试虚拟线程和响应式功能 */Slf4jSpringBootTestclassSpringBoot4MybatisPlusApplicationTests{AutowiredprivateUserServiceuserService;/** * 测试虚拟线程查询 */TestvoidtestVirtualThreadQuery()throwsExecutionException,InterruptedException,TimeoutException{// 准备测试数据UserusernewUser().setUsername(test_virtual).setEmail(testexample.com).setStatus(1);userService.save(user);// 使用虚拟线程查询CompletableFutureUserfutureuserService.findUserByUsernameVirtualThread(test_virtual);Userresultfuture.get(5,TimeUnit.SECONDS);assertThat(result).isNotNull();assertThat(result.getUsername()).isEqualTo(test_virtual);log.info(Virtual thread test passed, user ID: {},result.getId());}/** * 测试响应式查询 */TestvoidtestReactiveQuery(){// 准备测试数据UserusernewUser().setUsername(test_reactive).setEmail(reactiveexample.com).setStatus(1);userService.save(user);// 使用响应式查询MonoUseruserMonouserService.findUserByIdReactive(user.getId());StepVerifier.create(userMono).assertNext(foundUser-{assertThat(foundUser).isNotNull();assertThat(foundUser.getUsername()).isEqualTo(test_reactive);}).verifyComplete();log.info(Reactive query test passed);}/** * 测试结构化并发 */TestvoidtestStructuredConcurrency(){// 准备测试数据UserusernewUser().setUsername(test_structured).setEmail(structuredexample.com).setStatus(1);userService.save(user);// 使用结构化并发查询UserresultuserService.findUserWithStructuredConcurrency(user.getId());assertThat(result).isNotNull();assertThat(result.getUsername()).isEqualTo(test_structured);assertThat(result.getVirtualThreadInfo()).contains(User Details);log.info(Structured concurrency test passed);}/** * 测试批量虚拟线程操作 */TestvoidtestBatchVirtualThreads(){// 准备测试数据ListUserusersnewArrayList();for(inti0;i10;i){users.add(newUser().setUsername(batch_user_i).setEmail(batchiexample.com).setStatus(1));}// 使用虚拟线程批量保存userService.saveUsersWithVirtualThreads(users);// 验证保存结果ListUsersavedUsersuserService.list(newLambdaQueryWrapperUser().likeRight(User::getUsername,batch_user_));assertThat(savedUsers).hasSize(10);log.info(Batch virtual threads test passed, saved {} users,savedUsers.size());}}十二、性能监控packagecom.example.demo.monitor;importio.micrometer.core.instrument.MeterRegistry;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.springframework.stereotype.Component;importorg.springframework.util.StopWatch;importjava.util.concurrent.atomic.AtomicInteger;/** * 虚拟线程性能监控 * Spring Boot 4.0 监控增强 */Slf4jAspectComponentRequiredArgsConstructorpublicclassVirtualThreadMonitor{privatefinalMeterRegistrymeterRegistry;privatefinalAtomicIntegeractiveVirtualThreadsnewAtomicInteger(0);/** * 监控虚拟线程使用 */Around(annotation(com.example.demo.annotation.VirtualThreadMonitor))publicObjectmonitorVirtualThread(ProceedingJoinPointjoinPoint)throwsThrowable{StopWatchstopWatchnewStopWatch();intcurrentThreadsactiveVirtualThreads.incrementAndGet();try{stopWatch.start();ObjectresultjoinPoint.proceed();stopWatch.stop();// 记录指标meterRegistry.timer(virtual.thread.execution.time).record(stopWatch.getTotalTimeNanos(),java.util.concurrent.TimeUnit.NANOSECONDS);meterRegistry.gauge(virtual.thread.active.count,activeVirtualThreads);log.info(Virtual thread executed: method{}, time{}ms, activeThreads{},joinPoint.getSignature().getName(),stopWatch.getTotalTimeMillis(),currentThreads);returnresult;}finally{activeVirtualThreads.decrementAndGet();}}}十三、启动类packagecom.example.demo;importlombok.extern.slf4j.Slf4j;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.context.event.ApplicationReadyEvent;importorg.springframework.context.event.EventListener;Slf4jSpringBootApplicationpublicclassSpringBoot4MybatisPlusApplication{publicstaticvoidmain(String[]args){// 启用 AOT 优化System.setProperty(spring.aot.enabled,true);SpringApplication.run(SpringBoot4MybatisPlusApplication.class,args);}EventListener(ApplicationReadyEvent.class)publicvoidonApplicationReady(){log.info();log.info(Spring Boot 4.0 with MyBatis-Plus Started);log.info(Java Version: {},System.getProperty(java.version));log.info(Virtual Threads Available: {},Thread.ofVirtual()!null?Yes:No);log.info(Available Processors: {},Runtime.getRuntime().availableProcessors());log.info();}}十四、部署和优化14.1 Dockerfile支持原生镜像# 构建阶段 FROM ghcr.io/graalvm/native-image:java21 AS builder WORKDIR /app COPY target/*.jar app.jar RUN native-image -jar app.jar --no-fallback -H:Nameapp-native # 运行阶段 FROM alpine:latest RUN apk add --no-cache libstdc WORKDIR /app COPY --frombuilder /app/app-native /app/app EXPOSE 8080 ENTRYPOINT [/app/app]14.2 Docker Composeversion:3.8services:app:build:.ports:-8080:8080environment:-SPRING_PROFILES_ACTIVEprod-JAVA_OPTS-XX:UseZGC-Xmx512mdepends_on:-mysqldeploy:resources:limits:memory:512Mmysql:image:mysql:8.0environment:MYSQL_ROOT_PASSWORD:123456MYSQL_DATABASE:mybatis_plus_demoports:-3306:3306volumes:-mysql_data:/var/lib/mysqlcommand:---default-authentication-pluginmysql_native_password---character-set-serverutf8mb4---collation-serverutf8mb4_unicode_civolumes:mysql_data:十五、总结15.1 关键特性使用虚拟线程通过Thread.ofVirtual()和虚拟线程池优化并发性能响应式编程结合 MyBatis-Plus 和 R2DBC 实现非阻塞数据访问结构化并发使用 Java 21 的结构化并发 APIAOT 编译支持 GraalVM 原生镜像提升启动速度模块化更好的 Java Module 支持15.2 性能优化建议对于 I/O 密集型操作使用虚拟线程对于高并发场景使用响应式编程使用 GraalVM 原生镜像减少内存占用和启动时间合理配置连接池和线程池参数15.3 整合事项Spring Boot 4.0 目前是预览版API 可能会有变化虚拟线程对阻塞操作敏感避免在虚拟线程中执行长时间 CPU 操作原生镜像编译需要处理反射和动态代理的注册生产环境建议充分测试响应式和虚拟线程的稳定性我的这个教程展示了如何利用 Spring Boot 4.0 的新特性虚拟线程、响应式编程、AOT 编译等来整合 MyBatis-Plus构建高性能的现代 Java 应用程序。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

百度官方下载安装seo怎么做优化排名

一、3步极速接入GPT-5.2,零门槛上手专家级AI OpenAI最新发布的GPT-5.2模型,凭借在专业知识工作、多模态处理、代码开发等领域的突破性表现,成为当前最受开发者青睐的AI模型之一。本文将提供GPT-5.2模型的完整接入流程,包含API Key…

张小明 2025/12/31 6:35:18 网站建设

网站建设的知识网站建设网站模版

目录已开发项目效果实现截图开发技术介绍系统开发工具:核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式&…

张小明 2025/12/30 5:59:31 网站建设

天台县低价网站建设连云港做网站推广

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个网页加载性能优化工具,能够分析用户提供的网页URL,检测当前加载速度问题(如图片未压缩、JS/CSS未合并等),并自动…

张小明 2025/12/31 11:23:13 网站建设

昆明网站制作专业如何去推广一个网站

如何让多线程排序真正“快”起来?——并行归并的实战优化之道你有没有遇到过这样的场景:手握百万级数据,调用std::sort后程序卡得像在“思考人生”?明明是8核CPU,却只有一两个核心在拼命工作,其余都在“摸鱼…

张小明 2025/12/31 22:01:46 网站建设

网站建设平台选用分析抖音代运营费用明细

WPF文档与导航应用开发详解 1. 固定文档保存 在开发过程中,若要将固定文档保存为XPS文件,可以按以下步骤操作: 1. 创建一个 XpsDocument 对象,用于写入想要创建的文件。 2. 创建一个与文档对象相关联的 XpsDocumentWriter ,并使用其 Write 方法将 FixedDocumen…

张小明 2025/12/31 20:58:49 网站建设