版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年后端Java框架基础试题(附答案)一、单项选择题(本大题共30小题,每小题1分,共30分。在每小题给出的四个选项中,只有一项是符合题目要求的)1.在SpringFramework6.x中,关于IoC容器的初始化过程,下列说法正确的是()A.BeanFactoryPostProcessor的执行时机在Bean实例化之后、属性注入之前B.BeanPostProcessor的postProcessBeforeInitialization方法会在构造方法调用之后、初始化方法(如@PostConstruct)调用之前执行C.@PostConstruct注解标注的方法会在InitializingBean的afterPropertiesSet方法之后执行D.DisposableBean的destroy方法会在@PreDestroy注解标注的方法之前执行2.SpringBoot3.x自动装配机制中,`@SpringBootApplication`注解默认通过哪个核心注解开启自动装配功能,并且自动装配的加载文件路径发生了变化,现在位于哪个目录下?()A.@EnableAutoConfiguration,META-INF/spring.factoriesB.@EnableAutoConfiguration,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsC.@ComponentScan,META-INF/spring.factoriesD.@Configuration,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports3.在SpringAOP中,以下几种通知类型执行顺序配置正确的是(假设均正常执行且无异常)()A.@Around(前半部分)->@Before->目标方法->@AfterReturning->@After->@Around(后半部分)B.@Before->@Around(前半部分)->目标方法->@Around(后半部分)->@AfterReturning->@AfterC.@Around(前半部分)->@Before->目标方法->@After->@AfterReturning->@Around(后半部分)D.@Before->@Around(前半部分)->目标方法->@After->@AfterReturning->@Around(后半部分)4.关于Spring事务传播行为,以下场景描述错误的是()A.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。B.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。C.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则等同于PROPAGATION_REQUIRED。D.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则将其挂起。5.MyBatis在执行SQL时,关于`#{}`和`${}`的区别,下列描述最准确的是()A.`#{}`是预编译参数,会将参数替换为`?`,能有效防止SQL注入;`${}`是字符串拼接,存在SQL注入风险。B.`${}`是预编译参数,会将参数替换为`?`;`#{}`是字符串拼接,存在SQL注入风险。C.两者都可以防止SQL注入,但`#{}`只能用于传递基本数据类型。D.两者在底层实现上完全一致,只是语法糖不同。6.在SpringBoot中,如果需要自定义一个Starter,下列规范要求错误的是()A.推荐使用`xxx-spring-boot-starter`的命名方式。B.配置类需要使用`@Configuration`和`@Conditional`系列注解进行控制。C.必须在`resources/META-INF/spring.factories`中配置自动装配类(针对SpringBoot3.x以前版本)或在`AutoConfiguration.imports`中配置(针对SpringBoot3.x)。D.自定义Starter中必须包含`spring-boot-starter-web`依赖以保证Web环境可用。7.SpringCloudOpenFeign默认集成了哪个组件作为底层的HTTP客户端?(在未显式引入其他HTTP客户端依赖的情况下)()A.OkHttpB.ApacheHttpClientC..HttpURLConnection(JDK自带)D.Netty8.在SpringCloudAlibaba微服务架构中,Nacos作为注册中心,其默认的临时实例与持久化实例的区别在于()A.临时实例在服务端主动发送心跳检测,持久化实例由客户端主动发送心跳。B.临时实例在客户端停止发送心跳后,Nacos会主动将其从列表中剔除;持久化实例在客户端停止发送心跳后,只会标记为不健康,不会被剔除。C.临时实例只能通过API动态注册,不能通过配置文件注册。D.持久化实例不支持Raft协议一致性。9.关于SpringBean的作用域,默认的`singleton`与`prototype`在Web应用环境下的描述,正确的是()A.singleton作用域的Bean在每个Spring容器中只有一个实例,且在容器启动时一定会被实例化。B.prototype作用域的Bean在每个请求获取时都会创建一个新实例,Spring容器只负责创建,不管理其销毁生命周期。C.singleton作用域的Bean如果注入了prototype作用域的Bean,在不使用`@Lookup`注解或AOP代理的情况下,prototypeBean在singletonBean中只会被实例化一次。D.在SpringMVC中,Controller默认是prototype作用域。10.SpringBoot3.x应用中,如果要配置虚拟线程,以下配置项正确的是()A.`spring.threads.virtual.enabled=true`B.`spring.task.execution.virtual-threads.enabled=true`C.`spring.threads.virtual.enabled=true`(注:SpringBoot3.2+支持此简便配置,作用于Tomcat和TaskExecutor)D.`spring.mvc.threads.virtual=true`11.在SpringDataJPA中,`@Entity`注解的实体类默认采用哪种主键生成策略(未显式配置`@GeneratedValue`时)?()A.AUTOB.IDENTITYC.SEQUENCED.TABLE12.下列关于MyBatis的一级缓存和二级缓存描述,错误的是()A.一级缓存默认开启,作用域为SqlSession级别。B.二级缓存默认关闭,需要在Mapper配置文件中显式开启,作用域为Mapper级别(即namespace级别)。C.在执行insert、update、delete操作时,MyBatis会自动清空一级缓存和二级缓存。D.二级缓存的数据不以对象实例的形式存储,而是将查询结果数据的副本存入缓存。13.在SpringMVC中,`DispatcherServlet`处理请求的流程,以下排序正确的是()1.HandlerExecutionChain执行拦截器的前置处理2.DispatcherServlet调用HandlerAdapter执行Handler3.HandlerExecutionChain返回ModelAndView给DispatcherServlet4.HandlerMapping根据请求URL找到对应的HandlerExecutionChain5.DispatcherServlet将ModelAndView交给ViewResolver解析A.4-1-2-3-5B.1-4-2-3-5C.4-2-1-3-5D.1-2-4-3-514.SpringCloudGateway中,如果要在请求路由到下游微服务之前修改请求体,应该使用哪种类型的Filter?()A.PreFilter(通过自定义GatewayFilter)B.PostFilterC.GlobalFilterD.ForwardedHeadersFilter15.在Spring事务管理中,如果发生自调用(即类A的方法method1调用本类的method2,method2上标注了@Transactional),默认情况下事务会失效,主要原因是()A.事务传播行为配置错误。B.AOP代理对象无法拦截到内部的方法调用,因为内部调用使用的是目标对象本身而非代理对象。C.数据库不支持当前的事务隔离级别。D.事务管理器没有正确配置。16.SpringBoot配置文件加载优先级,从高到低排列正确的是()1.jar包外部的perties2.jar包内部的perties3.命令行参数4.操作系统环境变量A.3-4-1-2B.3-1-4-2C.4-3-1-2D.1-3-4-217.在MyBatis-Plus中,关于`@TableLogic`注解的作用,描述正确的是()A.用于实现乐观锁机制。B.用于标注逻辑删除字段,使得执行delete操作时实际上是执行update操作,并且查询时自动过滤已删除记录。C.用于自动填充创建时间和更新时间。D.用于指定主键生成策略。18.Hibernate的持久化对象有三种状态,关于这三种状态的转换,下列描述错误的是()A.瞬时态对象通过Session的save或persist方法可以转变为持久化态。B.持久化态对象在Session关闭后转变为脱管态。C.脱管态对象可以通过Session的update或merge方法重新转变为持久化态。D.持久化态对象直接调用对象的set方法修改属性,不会触发数据库的更新操作,需要显式调用update方法。19.在SpringSecurity6.x中,配置SecurityFilterChain的方式发生了较大变化,以下哪种是推荐的配置方式?()A.继承WebSecurityConfigurerAdapter并重写configure方法。B.声明一个@Bean类型为SecurityFilterChain,并使用LambdaDSL配置HttpSecurity。C.通过XML配置文件配置`<http>`标签。D.使用@WebSecurity注解配置。20.SpringBootActuator提供了一个生产就绪特性,如果只想暴露`/health`端点,应如何配置?()A.`management.endpoints.web.exposure.include=health`B.`management.endpoints.web.exposure.exclude=*`C.`management.endpoint.health.enabled=true`D.`management.endpoints.enabled-by-default=false`21.在SpringCloudAlibaba中,Sentinel的流控规则里,"流控效果"如果选择"预热",底层使用的是什么算法来控制流量?()A.令牌桶算法B.漏桶算法C.匀速排队D.滑动时间窗口算法22.Spring框架中,循环依赖问题在哪些场景下无法被自动解决(即会报错)?()A.单例Bean通过setter方法注入产生的循环依赖。B.单例Bean通过构造方法注入产生的循环依赖。C.多例Bean通过setter方法注入产生的循环依赖。D.单例Bean通过属性自动注入产生的循环依赖。23.关于SpringBoot3.x应用打包与启动,以下说法正确的是()A.默认将应用打包为WAR包部署到外部Tomcat。B.默认使用spring-boot-maven-plugin打包为可执行JAR,内嵌Tomcat。C.可执行JAR中的类文件位于`/BOOT-INF/classes`目录下,第三方依赖位于`/BOOT-INF/lib`目录下,启动类位于`/Main-Class`。D.启动可执行JAR时,不能通过`java-jar`传递系统属性参数。24.在使用RabbitMQ与SpringAMQP集成时,如果需要保证消息的可靠投递,可以在生产者端开启确认机制,下列哪个配置是开启PublisherConfirms(发布确认)的?()A.`spring.rabbitmq.publisher-returns=true`B.`spring.rabbitmq.publisher-confirm-type=correlated`C.`spring.rabbitmq.template.mandatory=true`D.`spring.rabbitmq.listener.direct.acknowledge-mode=manual`25.在MyBatis中,如果查询结果集列名与Java实体类属性名不一致,以下解决方式不正确的是()A.在SQL中使用别名,如`SELECTuser_nameASuserNameFROMusers`。B.在Mapper配置文件中使用`<resultMap>`进行显式映射。C.在MyBatis全局配置中开启驼峰命名转换,如`mapUnderscoreToCamelCase=true`。D.在Java实体类属性上使用`@Column`注解指定列名。26.SpringAOP的实现原理中,如果目标类实现了接口,默认使用的代理方式是()A.CGLIB字节码提升B.JDK动态代理C.AspectJ静态织入D.Javassist动态代理27.在Spring事务中,如果要捕获异常并手动处理,但仍希望事务回滚,应该怎么做?()A.抛出RuntimeException异常或其子类。B.调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()。C.抛出Exception异常。D.不需要做任何处理,只要发生异常就会回滚。28.关于Dubbo框架在SpringCloudAlibaba体系中的角色,下列说法不正确的是()A.Dubbo可以作为RPC框架替代Feign进行微服务间的通信。B.Dubbo支持多种序列化协议,默认推荐使用Hessian2。C.Dubbo的服务发现可以对接Nacos作为注册中心。D.Dubbo的通信底层默认基于HTTP协议,穿透防火墙能力极强。29.SpringBoot引入外部配置文件时,使用`@PropertySource`注解加载.properties文件,如果配合`@Value`无法注入属性值,最可能的原因是()A.`@PropertySource`不支持加载properties文件。B.`@PropertySource`默认不支持YAML格式,如果是YAML文件需要自定义PropertySourceFactory。C.`@Value`注解只能在Controller层使用。D.类上缺少`@Component`注解导致Bean未被Spring容器管理(假设确实未加该注解)。30.在使用SpringDataRedis时,如果要修改存储在Redis中的对象的某个字段,但又不希望覆盖整个对象,最有效的做法是()A.先查询出整个对象,修改字段后再使用`RedisTemplate.opsForValue().set()`覆盖。B.使用`RedisTemplate.opsForHash().put()`操作Hash结构,直接修改单个字段。C.使用`@CachePut`注解更新整个缓存。D.删除缓存后重新让查询接口重建缓存。二、多项选择题(本大题共15小题,每小题2分,共30分。在每小题给出的五个选项中,至少有两个是符合题目要求的,多选、漏选均不得分)31.在SpringCloudGateway中,关于路由断言的描述,以下属于内置断言的有()A.PathRoutePredicateFactoryB.HostRoutePredicateFactoryC.MethodRoutePredicateFactoryD.HeaderRoutePredicateFactoryE.QueryRoutePredicateFactory32.下列关于Spring框架中`@Async`注解的描述,正确的有()A.`@Async`标注的方法返回值只能是`void`或`Future`及其实现类(如`CompletableFuture`)。B.默认情况下,`@Async`使用的是`SimpleAsyncTaskExecutor`,它不会复用线程,每次执行都会创建新线程。C.在同一个类中,非异步方法调用本类的`@Async`方法,异步会生效。D.要使`@Async`生效,必须在配置类上添加`@EnableAsync`注解。E.`@Async`方法内部抛出的异常会直接抛出到调用者线程。33.在MyBatis中,关于动态SQL标签的使用,下列说法正确的有()A.`<if>`标签常用于条件判断,test属性用于编写OGNL表达式。B.`<where>`标签会自动去除首个多余的`AND`或`OR`前缀。C.`<foreach>`标签常用于批量操作,`collection`属性表示集合参数名,`item`表示迭代变量。D.`<set>`标签常用于UPDATE操作,会自动去除末尾多余的逗号。E.`<choose>`标签类似于Java中的switch-case,配合`<when>`和`<otherwise>`使用。34.在SpringBoot应用启动过程中,可以通过哪些方式自定义初始化逻辑(在Bean完全加载完成后执行)?()A.实现ApplicationRunner接口B.实现CommandLineRunner接口C.在Bean上使用@PostConstruct注解D.实现InitializingBean接口并重写afterPropertiesSet方法E.实现BeanFactoryPostProcessor接口35.在微服务架构中,关于分布式事务解决方案Seata的AT模式,以下描述正确的有()A.AT模式是无侵入式的分布式事务解决方案,业务层不需要编写补偿逻辑。B.AT模式需要一个全局事务协调器。C.AT模式在第一阶段就会提交本地事务并释放本地锁,但会生成回滚日志。D.AT模式在第二阶段如果是回滚,会根据一阶段生成的回滚日志进行反向补偿。E.AT模式要求每个微服务的数据库必须支持ACID特性,且需要包含`undo_log`表。36.关于SpringMVC中的拦截器与过滤器,以下区别描述正确的有()A.拦截器是SpringMVC特有的,过滤器是Servlet规范定义的。B.拦截器只能拦截进入Controller的请求,过滤器可以拦截几乎所有请求(包括静态资源)。C.拦截器可以通过`@Autowired`注入SpringBean,而过滤器由于由Web容器管理,默认无法直接注入SpringBean(需额外处理)。D.过滤器的执行时机在Servlet容器将请求派发给DispatcherServlet之前。E.拦截器的执行顺序可以通过`@Order`注解或实现`Ordered`接口控制,过滤器同理。37.在SpringDataJPA中,关于`@OneToMany`和`@ManyToOne`关联映射,以下配置或说法正确的有()A.`@ManyToOne`默认采用EAGER加载策略。B.`@OneToMany`默认采用LAZY加载策略。C.为了避免N+1问题,可以使用`@EntityGraph`或JOINFETCH进行关联查询。D.在双向关联中,如果双方都配置了`@JoinColumn`,可能会产生多余的更新SQL语句。E.`mappedBy`属性应当标注在维护关系的一方(即有外键的一方)。38.在SpringCloudAlibabaNacos配置中心中,关于动态配置刷新机制,以下说法正确的有()A.添加`@RefreshScope`注解的Bean,在配置变更时会被重新创建。B.使用`@Value`注入的属性,在不添加`@RefreshScope`的情况下也能动态刷新。C.Nacos客户端通过长轮询机制监听配置变化。D.`@ConfigurationProperties`注解的类默认支持动态刷新。E.Nacos配置修改后,控制台会自动触发对应微服务的重启以加载新配置。39.在SpringBoot整合Redis开发时,关于缓存穿透、缓存击穿、缓存雪崩的解决方案,正确的有()A.缓存穿透:可以使用布隆过滤器或缓存空对象来解决。B.缓存击穿:可以设置热点数据永不过期,或使用互斥锁(如Redisson的分布式锁)重建缓存。C.缓存雪崩:可以给缓存过期时间加上一个随机值,避免大量缓存同时失效。D.缓存穿透的根本原因是数据库中存在大量数据但缓存未命中。E.发生缓存雪崩时,系统可以提供降级策略,直接返回默认页面或错误提示。40.关于Spring框架中的事件机制,下列说法正确的有()A.自定义事件需要继承`ApplicationEvent`类。B.事件发布者可以通过注入`ApplicationEventPublisher`来发布事件。C.事件监听器可以通过实现`ApplicationListener`接口或使用`@EventListener`注解来创建。D.默认情况下,事件监听器是同步执行的,会阻塞发布事件的线程。E.可以通过`@Async`注解与`@EventListener`结合使用,实现异步事件处理。41.在MyBatis-Plus中,关于条件构造器`QueryWrapper`和`LambdaQueryWrapper`,以下描述正确的有()A.`LambdaQueryWrapper`通过方法引用的方式获取字段名,避免了硬编码字段名导致的拼写错误。B.`QueryWrapper`支持使用字符串形式的字段名拼接条件。C.两者都可以进行链式编程,如`wrapper.eq(...).like(...)`。D.`QueryWrapper`支持链式调用生成SQL片段,但无法直接用于BaseMapper的selectList方法。E.`LambdaQueryWrapper`底层依赖于MyBatis-Plus的反射工具类获取列名。42.在SpringBoot中,下列哪些注解可以用来声明一个Bean被Spring容器管理?()A.@ComponentB.@ServiceC.@RepositoryD.@ControllerE.@Configuration(配合@Bean)43.关于SpringCloudOpenFeign的配置与使用,以下说法正确的有()A.可以通过`@FeignClient`注解的`url`属性直接指定请求地址,绕过注册中心。B.默认情况下,Feign不整合Hystrix或Sentinel,请求失败直接抛出异常。C.可以通过实现`RequestInterceptor`接口来统一添加Feign请求的Header信息。D.Feign不支持文件上传,需要额外依赖和配置。E.Feign的日志级别配置`FULL`会打印请求和响应的Headers、Body以及元数据。44.在处理高并发请求时,为了保护系统稳定性,可以采取的限流算法或组件包括()A.令牌桶算法B.漏桶算法C.滑动窗口算法D.SentinelE.GuavaRateLimiter45.关于Java后端开发中对象拷贝与映射框架MapStruct,以下描述正确的有()A.MapStruct在运行时通过反射进行属性拷贝,性能远高于手动get/set。B.MapStruct在编译期生成对应的转换代码,运行时无反射开销。C.相比于BeanUtils,MapStruct能够更好地处理类型转换和嵌套对象映射。D.如果源对象属性为null,MapStruct默认会将其赋给目标对象。E.MapStruct通过`@Mapper`注解标记转换接口,可以通过`componentModel="spring"`将其注册为SpringBean。三、填空题(本大题共10小题,每小题2分,共20分。请将答案填写在题中的横线上)46.SpringAOP中,切入点表达式通常使用________关键字来匹配方法执行,例如匹配Service包下所有类的所有方法通常写作`execution(*com.example.service..(..))`。47.在MyBatis的全局配置文件中,如果要开启驼峰命名自动转换,需要在`<settings>`标签下配置`<settingname="________"value="true"/>`。48.SpringBoot应用在启动时,如果指定的端口被占用,程序会抛出异常并退出。若希望在一个内置Tomcat端口被占用时,自动尝试下一个可用端口,可以引入`spring-boot-starter-________`模块(注:填写该starter的ArtifactId,不包含GroupID)。49.在SpringSecurity中,密码编码器通常使用________接口的实现类,默认推荐使用BCryptPasswordEncoder,它采用哈希算法加密并加入随机盐。50.RabbitMQ中,为了保证消息从队列可靠传递到消费者,可以通过手动确认机制实现。在SpringAMQP中,需要将`spring.rabbitmq.listener.simple.acknowledge-mode`属性设置为`________`。51.在Spring事务管理中,如果需要指定事务的隔离级别,可以通过`@Transactional`注解的`________`属性来设置,例如设置为`Isolation.READ_COMMITTED`。52.SpringCloudGateway包含两个核心组件:Route和________。其中前者由ID、目标URI、断言和过滤器组成;后者允许在请求路由前后修改请求和响应。53.在JPA/Hibernate中,为了解决N+1查询问题,可以在JPQL中使用`________JOIN`语法,在一条SQL中一次性查出主实体及其关联实体数据。54.在分布式系统中,CAP理论指出,一个分布式系统不可能同时满足一致性、可用性和________。Base理论是对CAP的妥协,主张基本可用、软状态和最终一致性。55.SpringBoot3.x全面要求最低Java版本为Java17,并且将底层包路径从`javax.`全面迁移到了`________.`。四、简答题(本大题共5小题,每小题8分,共40分)56.请详细描述SpringBean的完整生命周期,从实例化到销毁的全过程,并指出BeanPostProcessor在其中介入的两个关键阶段。57.在SpringBoot自动装配原理中,`@Conditional`系列注解起到了至关重要的作用。请列举至少四种常用的条件注解,并简述SpringBoot如何利用这些注解完成第三方组件的自动装配逻辑。58.请简述数据库事务的四大特性(ACID),并结合Spring事务管理中的传播行为,解释`PROPAGATION_REQUIRES_NEW`与`PROPAGATION_NESTED`的区别及底层实现原理。59.在MyBatis框架中,接口绑定(MapperInterfaceBinding)是如何实现的?请从动态代理的角度,详细说明Mapper接口方法是如何映射到对应的XMLSQL语句并最终执行的。60.在微服务架构中,缓存穿透和缓存击穿是两个常见的高并发问题。请简述两者的概念与区别,并给出业界通用的解决方案(针对各自问题分别作答)。五、应用题(本大题共3小题,第1题20分,第2题20分,第3题20分,共60分)61.【计算与架构设计题】某电商系统在“双十一”零点抢购活动期间,由于瞬时流量激增,导致原有单体架构下的订单服务数据库连接池被打满,服务雪崩。系统当前状态如下:峰值QPS(每秒查询率)达到5000次/秒。订单服务平均每个请求处理耗时200毫秒。数据库单机最大并发连接数限制为500。现计划采用线程池进行异步削峰填谷,并引入Redis缓存。已知利特尔法则:系统平均并发数L=λ×W,其中请回答以下问题:(1)根据利特尔法则,计算在不做任何拦截和缓存的情况下,系统当前的平均并发请求数是多少?该数值是否超出了数据库连接池限制?如果超限,会发生什么问题?(5分)(2)如果在服务层引入Redis缓存,假设缓存命中率为80%,且缓存查询响应时间为10毫秒,未命中走数据库耗时仍为200毫秒。请计算引入缓存后系统的平均响应时间,并重新计算系统平均并发数(保留两位小数)。(6分)(3)为了进一步保护数据库,开发团队决定使用SpringBoot配置线程池进行隔离。假设线程池核心线程数为50,最大线程数为100,队列容量为1000。请给出在SpringBoot中如何使用`ThreadPoolTaskExecutor`配置该线程池的Java代码示例,并说明当并发请求达到1500时,线程池的拒绝策略及任务执行情况。(9分)62.【分析与代码实现题】在基于SpringBoot的后端应用中,经常需要实现数据的导出功能。假设现有一个用户实体类`User`,包含字段:`id`(Long)、`username`(String)、`email`(String)。在执行批量插入时,MyBatis原生的`insert`方法由于是单条循环插入,效率极低。请回答以下问题:(1)请使用MyBatis的动态SQL标签编写一段支持批量插入的XML映射代码,要求能够一次性插入`List<User>`集合中的所有数据。假设表名为`t_user`。(8分)(2)如果使用MyBatis-Plus,如何通过框架自带的API实现更高效的批量插入?请写出Service层或Mapper层的核心代码片段,并说明MyBatis-Plus在2.x版本之后批量插入方法底层优化了什么?(6分)(3)在高并发写入场景下,如果数据库主键生成策略采用的是MySQL的自增主键(`AUTO_INCREMENT`),可能会遇到什么瓶颈?请提出一种基于分布式环境的主键生成方案,并简述其原理。(6分)63.【综合应用题】某在线教育平台的课程订单服务采用SpringCloudAlibaba微服务架构。订单服务在下单成功后,需要调用积分服务为用户增加积分,同时调用消息服务发送通知。由于网络波动,偶尔会出现积分增加失败的情况。系统要求:订单创建必须成功(主流程)。积分增加和消息发送允许一定的延迟,但必须最终一致性。积分服务和消息服务存在冗余,不能因为它们的短暂不可用导致订单服务阻塞。请根据以上需求,设计并回答:(1)针对积分增加失败且允许延迟最终一致性的场景,请设计一种基于消息队列(如RabbitMQ或RocketMQ)的分布式事务解决方案。画出或用文字详细描述该方案的执行流程,并说明如何保证消息的可靠投递(生产者端不丢消息)。(8分)(2)在SpringBoot中,使用`@RabbitListener`注解监听队列消息。如果消费者在处理消息时抛出了异常,默认情况下消息会被重新入队或丢弃。为了避免消息丢失且支持重试,应如何配置SpringAMQP的重试机制?请写出`application.yml`中的关键配置项,并说明重试次数耗尽后的死信队列处理方案。(7分)(3)为了防止积分服务在消费消息时出现消息重复消费(幂等性问题),请给出一种基于Redis的幂等性校验实现思路,并给出核心的Java代码片段(利用SpringDataRedis)。(5分)参考答案及解析一、单项选择题1.B解析:BeanFactoryPostProcessor在Bean实例化之前执行;BeanPostProcessor的postProcessBeforeInitialization在构造方法之后、初始化方法之前执行;@PostConstruct在afterPropertiesSet之前执行;@PreDestroy在destroy方法之前执行。2.B解析:SpringBoot3.x开始,自动装配文件从`META-INF/spring.factories`迁移到了`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`,由`@EnableAutoConfiguration`触发。3.C解析:SpringAOP正常情况下的顺序是:环绕前->前置->目标方法->后置->返回->环绕后。4.D解析:PROPAGATION_NEVER表示以非事务方式运行,如果当前存在事务,则抛出异常,而不是挂起。挂起的是NOT_SUPPORTED。5.A解析:`#{}`是预编译,防SQL注入;`${}`是直接拼接。6.D解析:自定义Starter不应该依赖Web环境,除非明确需要Web支持,否则应保持纯净。7.C解析:OpenFeign在未显式引入OkHttp或HttpClient时,默认使用JDK自带的`HttpURLConnection`。8.B解析:Nacos中,临时实例由客户端发送心跳,服务端不主动剔除持久化实例。持久化实例由服务端主动探测,挂了只标记不健康不剔除。9.C解析:singleton注入prototype时,由于singleton只初始化一次,prototype也会在注入时只初始化一次,后续不会更新,除非使用`@Lookup`。10.C解析:SpringBoot3.2引入了简便配置`spring.threads.virtual.enabled=true`来开启虚拟线程。11.A解析:JPA未配置时默认为AUTO,由JPA提供商决定。12.D解析:二级缓存存储的是对象的属性数据,而不是对象实例本身。13.A解析:DispatcherServlet流程为:HandlerMapping找HandlerExecutionChain->执行Interceptor前置->HandlerAdapter执行Handler->返回ModelAndView->ViewResolver解析。14.A解析:修改请求体属于前置处理,可以使用GatewayFilter的Pre类型或GlobalFilter在请求转发前修改。15.B解析:Spring事务基于AOP代理,自调用不经过代理对象,因此`@Transactional`不生效。16.A解析:优先级:命令行参数>环境变量>外部配置>内部配置。17.B解析:`@TableLogic`用于逻辑删除。18.D解析:持久化态对象的set方法修改属性,会在flush时自动触发update,无需显式调用。19.B解析:SpringSecurity6废弃了WebSecurityConfigurerAdapter,推荐使用SecurityFilterChainBean。20.A解析:通过`management.endpoints.web.exposure.include`控制暴露的端点。21.D解析:Sentinel流控效果中,匀速排队使用漏桶算法,而预热WarmUp使用的是令牌桶算法的变种,通过控制令牌发放速率逐渐增加来实现预热。(注:此处原理解析需根据Sentinel最新文档,Sentinel预热基于令牌桶)。22.B解析:Spring只能解决基于setter或字段注入的单例循环依赖,构造器注入由于必须先创建对象,无法解决。23.C解析:SpringBoot默认打JAR包,类在`BOOT-INF/classes`下,依赖在`BOOT-INF/lib`下。24.B解析:`spring.rabbitmq.publisher-confirm-type=correlated`开启发布确认机制。25.D解析:`@Column`是JPA注解,MyBatis不识别。26.B解析:SpringAOP默认有接口使用JDK动态代理,无接口使用CGLIB。27.B解析:手动处理异常后,如果想回滚,可以抛出RuntimeException,或者调用`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()`标记为回滚。28.D解析:Dubbo底层默认基于TCP长连接(如Netty实现Dubbo协议),不是HTTP。29.D解析:`@PropertySource`支持properties文件;若要注入`@Value`,该类必须被Spring容器管理,即必须有`@Component`等注解。30.B解析:操作Hash结构可以直接修改单个字段,无需反序列化整个对象,效率最高。二、多项选择题31.ABCDE解析:以上均为SpringCloudGateway内置的断言工厂。32.ABD解析:`@Async`同方法调用不生效;异步方法的异常不会抛给调用者线程(除非使用Future.get())。33.ABCDE解析:以上均为MyBatis动态SQL标签的正确描述。34.ABCD解析:ApplicationRunner、CommandLineRunner、@PostConstruct、InitializingBean均在Bean初始化完成或应用启动后执行;BeanFactoryPostProcessor在Bean定义加载后、实例化前执行。35.ABCD解析:AT模式无侵入,依赖TC,一阶段提交本地事务并记录undo_log,二阶段根据情况提交或补偿。E选项错误,AT模式并不要求强制每个微服务都有独立数据库,只要是关系型数据库且支持基本事务即可。36.ABCDE解析:以上均为拦截器与过滤器的正确区别。37.ABCD解析:`mappedBy`应标注在被维护方(没有外键的一方),有外键的一方是维护方。38.ACD解析:`@Value`默认不支持动态刷新,需要加`@RefreshScope`;Nacos配置修改不需要重启服务。39.ABCE解析:缓存穿透是指查询不存在的数据;缓存雪崩是大量缓存同时失效。D选项描述的是雪崩的特征。ABCE均为正确解决方案。40.ABCDE解析:以上均为Spring事件机制的正确描述。41.ABCE解析:`QueryWrapper`可以直接传给BaseMapper的selectList方法执行,D选项错误。42.ABCDE解析:以上注解均可声明Bean。43.ACDE解析:Feign可以配置url绕过注册中心;可以通过RequestInterceptor添加Header;默认不支持文件上传需扩展;日志FULL会打印所有信息。B选项错误,在SpringCloudOpenFeign中,默认整合了Sentinel/Hystrix的相关配置开关,但默认行为是不触发降级,除非显式配置。但在新版本中,如果不引入熔断器依赖,请求失败直接抛异常,B选项描述“默认不整合”不准确,应改为“Feign在引入熔断器后,默认不开启熔断降级,需配置`feign.circuitbreaker.enabled=true`”,故B不选。44.ABCDE解析:均为常见的限流算法或工具。45.BCE解析:MapStruct在编译期生成代码,运行时无反射;如果属性为null,默认不赋值,但可通过策略配置。三、填空题46.execution47.mapUnderscoreToCamelCase48.spring-boot-starter-actuator(注:实际上通过Actuator可以进行端口检测,但自动重试端口通常需要自定义或引入特定组件。标准SpringBoot无此原生功能,但最接近的内置可观测组件是Actuator。或者填spring-boot-starter,但此题考查特定场景,更准确的答案可能是开发者常用的DevTools即spring-boot-devtools,它支持端口占用时的自动重启,但不符合“自动尝试下一个可用端口”。严格来说SpringBoot原生不支持,但若填spring-boot-devtools可得部分分。标准答案定为:spring-boot-devtools,因为它用于开发期的自动重启,虽不能自动换端口,但常用于端口冲突解决后的快速恢复。为严谨,若考查端口自动重试,可能需填`spring-boot-starter-actuator`配合自定义。此处按常规开发习惯,填写`spring-boot-devtools`)49.PasswordEncoder50.manual51.isolation52.Filter53.FETCH(或JOINFETCH)54.PartitionTolerance(分区容错性)55.jakarta四、简答题56.答:SpringBean的生命周期主要分为四个核心阶段:实例化、属性赋值、初始化、销毁。1.实例化:Spring通过构造方法或工厂方法创建Bean的实例对象。2.属性赋值:根据配置或注解,将依赖的Bean或基本数据类型注入到实例的属性中(如`@Autowired`、`@Value`)。3.初始化:调用`BeanNameAware`、`BeanFactoryAware`等Aware接口的方法,注入容器底层组件。BeanPostProcessor介入第一阶段:调用`postProcessBeforeInitialization`方法,允许在此对Bean进行修改(如`@PostConstruct`在此被解析并执行)。执行自定义初始化方法:如果实现了`InitializingBean`接口,调用`afterPropertiesSet`方法;如果配置了`init-method`,执行指定方法。BeanPostProcessor介入第二阶段:调用`postProcessAfterInitialization`方法(AOP代理通常在此阶段生成)。4.销毁:当容器关闭时,如果Bean实现了`DisposableBean`接口,调用`destroy`方法;如果配置了`destroy-method`,执行指定方法。57.答:常用的条件注解包括:`@ConditionalOnClass`:当类路径下存在指定的类时,配置才生效。`@ConditionalOnMissingBean`:当容器中不存在指定类型的Bean时,配置才生效。`@ConditionalOnProperty`:当配置文件中存在指定的属性且满足特定值时,配置才生效。`@ConditionalOnWebApplication`:当应用是一个Web应用时,配置才生效。自动装配逻辑:SpringBoot在启动时,会扫描`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`文件中列出的自动配置类。每个配置类上通常标注了`@Conditional`系列注解。Spring容器在注册这些配置类中的Bean时,会先进行条件评估,只有满足条件(如相关依赖Jar包存在、用户未自定义相关Bean等),对应的配置类或Bean才会被实例化并注入容器,从而实现“按需装配”。58.答:ACID指:原子性:事务中的操作要么全部成功,要么全部失败回滚。一致性:事务执行前后,数据库从一个一致性状态转变到另一个一致性状态。隔离性:多事务并发执行时,相互之间不产生干扰。持久性:事务一旦提交,对数据的修改是永久的。区别与原理:`PROPAGATION_REQUIRES_NEW`:总是开启一个新的事务。如果当前存在事务,则将当前事务挂起。底层实现是创建两个独立的物理数据库连接,外层事务的回滚不会影响内层事务(REQUIRES_NEW)的提交。`PROPAGATION_NESTED`:嵌套事务。如果当前存在事务,则在这个事务内部开启一个子事务(保存点Savepoint机制)。如果子事务异常回滚,只会回滚到子事务开始前的保存点,不影响外层事务;但如果外层事务回滚,子事务也会跟着回滚。底层实现是复用同一个数据库连接,通过JDBC的`setSavepoint`和`releaseSavepoint`实现。59.答:MyBatis接口绑定的实现基于JDK动态代理。1.当Spring扫描到`@MapperScan`或MyBatis配置扫描到Mapper接口时,会使用`MapperProxyFactory`为每个接口生成一个代理对象(`MapperProxy`实现了`InvocationHandler`)。2.当调用接口的某个方法时,触发`MapperProxy.invoke()`。3.MyBatis根据方法的全限定名(接口全名+方法名)作为键,去已加载的配置中查找对应的`MappedStatement`(即解析XML或注解生成的SQL语句对象)。4.找到后,将方法参数和`MappedStatement`交给`SqlSession`执行(如`selectList`、`insert`等)。5.`SqlSession`再委托给`Executor`执行SQL预处理、参数绑定、结果集映射,最终返回数据。60.答:缓存穿透:指查询一个数据库和缓存中都不存在的数据。由于缓存不命中,每次请求都会打到数据库,可能被恶意利用导致数据库崩溃。解决方案:1.缓存空值/缺省值,设置较短的过期时间;2.使用布隆过滤器,在查询前先判断数据是否存在。缓存击穿:指某个热点数据在过期的瞬间,同时有大量并发请求查询该数据,由于缓存刚失效,请求全部打到数据库导致压力激增。解决方案:1.互斥锁(分布式锁),缓存未命中时只允许一个线程查询数据库并重建缓存,其他线程等待;2.热点数据设置逻辑永不过期,通过后台异步线程定时更新缓存。五、应用题61.(1)根据利特尔法则:L=平均并发请求数为1000。超出了数据库单机最大并发连接数限制(500)。如果超限,数据库连接池会耗尽,后续请求需等待连接,导致响应时间急剧增加,进而引发系统级联雪崩。(2)引入缓存后,80%走缓存,20%走数据库。平均响应时间=0.8重新计算平均并发数=5000240未超出数据库连接池500的限制,系统稳定性大幅提升。(3)SpringBoot线程池配置代码示例:```javaimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;importjava.util.concurrent.ThreadPoolExecutor;@ConfigurationpublicclassThreadPoolConfig{@Bean("orderThreadPool")publicThreadPoolTaskExecutororderThreadPool(){ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();executor.setCorePoolSize(50);executor.setMaxPoolSize(100);executor.setQueueCapacity(1000);executor.setThreadNamePrefix("order-async-");//拒绝策略:由调用线程处理executor.setRejectedExecutionHandler(newThreadPoolExecutor.CallerRunsPolicy());executor.initialize();returnexecutor;}}```并发请求达到1500时的执行情况:核心线程50个立即执行50个任务。剩余1450个任务放入队列,但队列容量为1000,队列放满后还剩450个任务。线程池会尝试扩容线程数到最大线程数100,即再启动50个线程处理50个任务。此时还剩400个任务(1500-50核心-1000队列-50扩展=400)。由于线程池已达最大容量且队列满,这400个任务将触发拒绝策略。配置的`CallerRunsPolicy`会由提交任务的线程(如Tomcat工作线程)直接执行该任务,从而起到背压限流作用,防止任务丢失,同时降低提交速度。62.(1)MyBatis动态SQL批量插入XML映射代码:```xml<insertid="batchInsertUsers"parameterType="java.util.List">INSERTINTOt_user(id,username,email)VALUES<foreachcollection="list"item="user"separator=",">(#{user.id},#{user.username},#{user.email})</foreach></insert>```(2)MyBatis-Plus批量插入代码片段:```java//Service层继承IService<User>publicinterfaceUserServiceextendsIService<User>{}//实现类@ServicepublicclassUserServiceImplextendsServiceImpl<UserMapper,User>implementsUserService{//直接调用saveBatch方法publicvoidbatchInsert(List<User>users){this.saveBatch(users);}}```优化原理:MyBatis-Plus2.x之后,`saveBatch`方法底层默认采用了JDBC的`addBatch`和`exec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年摄像师职业技能等级认定理论知识考前冲刺试题
- 2026年自贡市检察院检察官入额遴选笔试试题及答案解析
- 2026年国考外交部综合能力测试试题及答案
- 2026年商丘市柘城县招聘警务辅助人员考试试题及答案
- AI玩具怎么从一次性销售变成持续增长 可豆陪陪一个AI儿童玩具的增长复盘
- 统计专业技术中级资格考试(统计工作实务)备考题库及答案(2026年青海海东地区)
- 动画运动规律与时间掌握(第2版)课件 姚桂萍 第4、5章 禽类、鱼类、昆虫、爬行类;自然现象中的运动规律+中间画
- 26秋四上语文第1-8单元巩固练习(含答案)
- 2025年初级护师《专业知识》题库附答案
- 2026年安全生产培训考试题与答案
- 第6课 古代罗马(课件)-(共50张+视频)统编版(2024)九年级历史上册2
- DB34∕T 3079-2026 河道堤防减压井及测压管管理规程
- 2026统考专升本英语:作文模版20篇
- 2026年成人高考全科试题及答案
- 2026年高级养老护理员职业技能考试练习题附答案
- 2026年高考语文真题全国一卷文言文逐句注解+翻译(含课内拓展+文言现象)
- 2026年设计院工作总结(2篇)
- 2026年硫酸软骨素原料药行业分析报告及未来发展趋势报告
- 企业微信使用教程
- 2025-2030中国香料烟行业市场发展运行及发展趋势与投资前景研究报告
- JJG 1189.1-2026 测量用互感器检定规程 第1部分:标准电流互感器
评论
0/150
提交评论