版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频spring的面试题及答案Spring框架中Bean的生命周期包含哪些关键阶段?Bean的生命周期从实例化开始,经历依赖注入、初始化前处理、初始化、初始化后处理,最终到销毁阶段。具体步骤为:1.实例化:通过构造器或工厂方法创建Bean的原始对象(未填充属性)。2.属性注入:根据@Autowired、@Resource等注解或XML配置,完成依赖注入。3.Aware接口回调:若Bean实现了BeanNameAware、BeanFactoryAware等接口,会回调设置对应属性(如获取Bean名称或所属工厂)。4.BeanPostProcessor前置处理:调用BeanPostProcessor的postProcessBeforeInitialization方法,可在此阶段修改Bean的状态(如动态代理前的增强)。5.初始化方法执行:若配置了init-method(XML)或@PostConstruct注解,执行初始化逻辑(如资源初始化、配置校验)。6.BeanPostProcessor后置处理:调用BeanPostProcessor的postProcessAfterInitialization方法,典型场景是AOP在此阶段为Bean提供代理对象。7.销毁阶段:容器关闭时,若配置了destroy-method(XML)或@PreDestroy注解,执行资源释放(如关闭连接、停止线程)。需注意,Bean的作用域会影响生命周期:单例Bean由容器管理完整生命周期;原型Bean实例化后由调用者管理,容器不负责销毁。Spring如何解决循环依赖?Spring通过三级缓存(singletonFactories)解决单例Bean的循环依赖,仅支持setter注入或字段注入,构造器注入无法解决。三级缓存的具体作用如下:一级缓存(singletonObjects):存储已完成初始化的单例Bean(成品Bean)。二级缓存(earlySingletonObjects):存储已实例化但未完成初始化的早期Bean(半成品Bean),用于避免重复创建代理对象。三级缓存(singletonFactories):存储ObjectFactory工厂,用于提供早期Bean的代理对象(若需要AOP)。解决流程示例:A依赖B,B依赖A。1.创建A时,实例化A(原始对象),将A的ObjectFactory(λ表达式:()->getEarlyBeanReference(beanName,mbd,bean))存入三级缓存。2.A需要注入B,触发B的创建流程:实例化B,将B的ObjectFactory存入三级缓存。3.B需要注入A,从三级缓存获取A的ObjectFactory,调用getObject()提供A的早期引用(可能是代理对象),将A从三级缓存移至二级缓存。4.B完成属性注入和初始化,存入一级缓存。5.A获取到B(一级缓存中的成品),完成属性注入和初始化,从二级缓存移至一级缓存。若仅用二级缓存,当Bean需要AOP时,会提前提供代理对象,导致同一Bean的不同阶段代理对象不一致(如初始化前后的增强逻辑差异)。三级缓存通过延迟提供代理(仅在需要时调用ObjectFactory),保证了代理对象的一致性。@Transactional注解的事务失效场景有哪些?@Transactional失效通常由以下原因导致:1.方法非public修饰:Spring通过动态代理实现事务,默认仅对public方法生效(JDK代理限制,CGLIB可支持protected但官方不推荐)。2.自调用问题:同一类中未被代理的方法调用@Transactional方法(如this.xxx()),因未通过代理对象,事务拦截器未生效。解决方案:通过@Autowired注入自身(代理对象)或使用AopContext.currentProxy()获取代理。3.异常类型不匹配:默认仅回滚RuntimeException和Error,若抛出检查型异常(如IOException)且未配置rollbackFor=Exception.class,事务不会回滚。4.事务传播行为配置错误:若内层方法配置propagation=NOT_SUPPORTED(不支持事务),外层事务调用时内层方法不会参与事务。5.数据源未配置事务管理器:未在配置类中通过@Bean声明PlatformTransactionManager(如DataSourceTransactionManager),导致事务机制未启用。6.Bean未被Spring管理:若类未被@Component、@Service等注解标记,或未在XML中配置,Spring无法为其提供事务代理。例如,业务方法中捕获异常并记录日志但未重新抛出,导致事务管理器未检测到异常,最终提交事务(即使业务逻辑失败)。SpringBoot3.x相比2.x的核心变化有哪些?SpringBoot3.x基于Java17+,兼容JakartaEE9+(原javax包替换为jakarta),主要变化包括:1.JakartaEE迁移:所有JSR标准接口(如Servlet、JPA、Validation)从javax.迁移至jakarta.,需升级依赖(如Hibernate6.x、Servlet5.0)。2.GraalVM原生镜像支持:通过spring-boot-maven-plugin的native:compile目标,可构建原生可执行文件(减少启动时间和内存占用),需使用@NativeHint等注解处理反射、资源访问等场景。3.虚拟线程(ProjectLoom)支持:SpringBoot3.2+集成虚拟线程,通过配置spring.threads.virtual.enabled=true启用,适用于I/O密集型应用(如HTTP客户端调用、数据库查询),减少线程上下文切换开销。4.MicrometerTracing集成:替代SpringCloudSleuth,提供开放遥测(OpenTelemetry)支持,简化链路追踪配置(自动提供Span、关联日志)。5.Security默认配置强化:SpringSecurity6.x默认启用基于路径的授权(需显式配置permitAll()),并支持OAuth2.1标准(如授权码模式的PKCE强制开启)。6.响应式编程优化:SpringWebFlux支持HTTP/3(基于QUIC协议),提升高延迟网络下的性能;Reactor3.5+增强了背压控制和调试工具。例如,原生镜像构建时需处理动态代理类(如使用@ProxyHint),否则可能因GraalVM的静态分析遗漏导致运行时错误。SpringMVC中DispatcherServlet的请求处理流程是怎样的?DispatcherServlet作为前端控制器,核心流程分为9步:1.接收请求:客户端发送HTTP请求,被DispatcherServlet拦截(通过web.xml或@WebServlet配置)。2.获取HandlerMapping:根据请求URL,通过HandlerMapping(如BeanNameUrlHandlerMapping、RequestMappingHandlerMapping)查找对应的Handler(控制器方法)。3.获取HandlerAdapter:根据Handler类型(如@Controller标注的方法),选择匹配的HandlerAdapter(如RequestMappingHandlerAdapter)。4.执行Handler:调用HandlerAdapter的handle()方法,执行控制器方法(可能涉及参数解析@RequestParam、@RequestBody,返回ModelAndView或@ResponseBody的返回值)。5.处理异常:若执行过程中抛出异常,由HandlerExceptionResolver(如ExceptionHandlerExceptionResolver)处理,返回错误视图或JSON。6.视图解析:若返回ModelAndView,通过ViewResolver(如InternalResourceViewResolver、ThymeleafViewResolver)解析视图名称为具体View对象。7.视图渲染:View对象结合Model数据,提供响应内容(如JSP填充数据、Thymeleaf模板渲染)。8.响应输出:将渲染后的内容写入HTTP响应流,返回客户端。9.清理资源:完成请求处理后,清理线程局部变量(如RequestContextHolder中的请求上下文)。关键扩展点:可通过自定义HandlerMapping、HandlerAdapter或ViewResolver,实现个性化的请求处理逻辑(如多版本API路由、自定义模板引擎)。SpringAOP的实现原理是什么?如何选择JDK动态代理和CGLIB?SpringAOP基于动态代理模式,通过BeanPostProcessor在Bean初始化后提供代理对象。核心实现方式有两种:JDK动态代理:基于java.lang.reflect.Proxy,仅能代理接口(目标类必须实现至少一个接口)。代理类实现接口方法,调用时通过InvocationHandler拦截,执行切面逻辑。CGLIB代理:基于ASM字节码增强库,通过继承目标类提供子类。代理类重写父类方法(final方法无法被代理),调用时通过MethodInterceptor拦截,执行切面逻辑。选择策略:若目标类实现了接口,默认使用JDK动态代理(减少依赖,提升性能)。若目标类未实现接口或需要代理类中的非接口方法(如protected方法),强制使用CGLIB(可通过配置xy-target-class=true全局启用)。注意:SpringBoot2.0+默认优先使用CGLIB(因现代应用中纯接口编程场景减少),但仍可通过@EnableAspectJAutoProxy(proxyTargetClass=false)切换。例如,对@Service标注的类(通常不实现接口),Spring会使用CGLIB提供代理;对@Repository标注的DAO接口(实现JpaRepository),使用JDK动态代理。Spring中如何实现Bean的条件装配?@Conditional注解的常用扩展有哪些?Spring通过条件装配(ConditionalBean)实现根据环境动态注册Bean,核心注解是@Conditional,可自定义条件或使用内置扩展:1.@ConditionalOnClass:当类路径中存在指定类时装配(如存在DataSource.class时注册JdbcTemplate)。2.@ConditionalOnMissingClass:当类路径中不存在指定类时装配(用于兼容不同版本依赖)。3.@ConditionalOnBean:当容器中存在指定Bean时装配(如存在UserService时注册UserController)。4.@ConditionalOnMissingBean:当容器中不存在指定Bean时装配(用于提供默认实现,如SpringBoot的默认数据源配置)。5.@ConditionalOnProperty:当配置属性满足条件时装配(如spring.cache.type=redis时注册RedisCacheManager)。6.@ConditionalOnResource:当类路径中存在指定资源时装配(如存在schema.sql时执行数据初始化)。7.@ConditionalOnWebApplication:当前应用是Web应用时装配(区分Servlet环境和Reactive环境)。实现自定义条件需实现Condition接口,重写matches()方法(如根据服务器IP决定是否注册Bean)。例如,SpringBoot的自动配置类(如DataSourceAutoConfiguration)大量使用@Conditional注解,根据类路径和配置动态激活配置。Spring事务的隔离级别和传播行为分别有哪些?隔离级别(Isolation):定义事务间可见性,解决脏读、不可重复读、幻读问题。DEFAULT:使用数据库默认隔离级别(如MySQL默认REPEATABLE_READ,Oracle默认READ_COMMITTED)。READ_UNCOMMITTED:允许读取未提交的修改(脏读)。READ_COMMITTED:仅读取已提交的修改(解决脏读,可能不可重复读)。REPEATABLE_READ:同一事务内多次读取结果一致(解决不可重复读,可能幻读)。SERIALIZABLE:最高隔离级别,事务串行执行(解决所有问题,性能最差)。传播行为(Propagation):定义事务方法被另一个事务方法调用时的行为。REQUIRED(默认):若当前有事务则加入,无则创建新事务(最常用)。REQUIRES_NEW:无论当前是否有事务,都创建新事务(原事务挂起,用于需要独立回滚的场景,如日志记录)。NESTED:在当前事务嵌套执行(通过保存点实现,回滚仅影响嵌套部分,需数据库支持保存点)。SUPPORTS:若当前有事务则加入,无则以非事务执行。NOT_SUPPORTED:以非事务执行,若当前有事务则挂起。MANDATORY:必须在现有事务中执行,无事务则抛异常(强制事务上下文)。NEVER:必须以非事务执行,有事务则抛异常。例如,用户下单时,主事务(订单创建)调用嵌套事务(库存扣减),若库存扣减失败,仅回滚库存部分(NESTED),而订单创建可能继续(需业务判断)。SpringBoot如何实现自动配置?关键组件有哪些?SpringBoot自动配置通过@SpringBootApplication注解(包含@EnableAutoConfiguration)触发,核心流程如下:1.加载META-INF/spring.factories:扫描所有依赖Jar包中的spring.factories文件,获取EnableAutoConfiguration对应的配置类列表(如DataSourceAutoConfiguration、WebMvcAutoConfiguration)。2.条件过滤:对每个自动配置类应用@Conditional注解(如@ConditionalOnClass、@ConditionalOnProperty),仅满足条件的配置类会被激活。3.Bean注册:激活的配置类通过@Bean方法注册组件(如DispatcherServlet、RequestMappingHandlerAdapter),并处理用户自定义配置(用户@Bean优先于自动配置的@Bean)。关键组件:AutoConfigurationImportSelector:@EnableAutoConfiguration的底层实现类,负责加载和过滤自动配置类。SpringFactoriesLoader:读取spring.factories文件,解析配置类全限定名。ConditionEvaluator:评估@Conditional条件是否满足(如类路径检查、配置属性检查)。@ConfigurationProperties:将perties中的配置绑定到Java对象(如ServerProperties对应server.port等配置)。例如,当引入spring-boot-starter-web依赖时,WebMvcAutoConfiguration会检测到DispatcherServlet存在,并注册MVC相关Bean;若用户自定义了@BeanViewResolver,则自动配置的ViewResolver会被覆盖。SpringWebFlux与SpringMVC的区别有哪些?适用场景是什么?核心区别:1.编程模型:MVC基于ServletAPI(同步阻塞),依赖Tomcat、Jetty等Servlet容器;WebFlux基于Reactor(响应式编程),支持异步非阻塞,可运行在Netty、Undertow等非Servlet容器。2.处理方式:MVC的每个请求由一个线程处理(线程池大小限制吞吐量);WebFlux通过少量线程(如EventLoop)处理多个请求(利用回调、发布-订阅模式),适合I/O密集型场景。3.返回类型:MVC返回ModelAndView、@ResponseBody(同步数据);WebFlux支持Mono(0/1个元素)和Flux(0到N个元素),可处理流式数据(如Server-SentEvents、WebSocket)。4.注解支持:WebFlux支持@Controller、@RequestMapping(与MVC兼容),但新增@ServerWebSocket等响应式注解,且@RequestBody、@ResponseBody支持异步反序列化。适用场景:WebFlux:高并发I/O场景(如微服务网关、实时数据推送、第三方接口调用),需较少线程处理大量请求(降低资源消耗)。MVC:传统业务逻辑(如CRUD)、同步数据库操作(如JPA的findById),或需要Servlet特性(如Filter、Listener)的场景。例如,电商大促时,商品详情页的接口(需调用多个下游服务)使用WebFlux,通过Mono.zip()合并异步调用结果,提升吞吐量;而用户信息修改接口(单数据库操作)使用MVC更简单。SpringSecurity如何实现权限控制?常见扩展点有哪些?SpringSecurity通过FilterChainProxy管理多个SecurityFilter,核心流程为:1.认证(Authentication):通过UsernamePasswordAuthenticationFilter、BasicAuthenticationFilter等获取用户凭证(如用户名密码、JWT令牌),调用AuthenticationManager验证(如查询数据库、调用OAuth2授权服务器)。2.授权(Authorization):通过FilterSecurityInterceptor检查请求是否有权限访问(如基于角色的访问控制@PreAuthorize("hasRole('ADMIN')")、路径匹配antMatchers("/admin").hasRole("ADMIN"))。3.会话管理:通过SessionManagementFilter管理会话(如限制同一用户多端登录、Session超时处理)。4.安全增强:通过CsrfFilter防止跨站请求伪造,通过CorsFilter处理跨域请求,通过HeaderWriterFilter添加安全响应头(如X-Content-Type-Options)。常见扩展点:自定义UserDetailsService:实现loadUserByUsername()方法,从数据库或外部系统加载用户信息(如LDAP、OAuth2用户)。自定义AuthenticationProvider:实现authenticate()方法,支持自定义认证方式(如手机验证码登录)。自定义AccessDecisionManager:实现decide()方法,自定义授权逻辑(如基于数据权限的行级控制)。JWT令牌处理:通过JwtAuthenticationConverter解析令牌,提取用户权限(如从token的authorities声明中获取角色)。表达式控制:使用@PreAuthorize、@PostAuthorize注解结合SpEL(如@PreAuthorize("userId==principal.id"))实现细粒度权限控制。例如,在微服务中,资源服务器(ResourceServer)通过BearerTokenAuthenticationFilter解析JWT令牌,调用RemoteTokenServices验证令牌有效性,然后根据令牌中的scope属性控制接口访问。SpringCloud2023.x的核心组件有哪些?相比旧版本有何改进?SpringCloud2023.x(代号Pajaro)基于SpringBoot3.x,核心组件及改进如下:1.SpringCloudNetflix:Eureka2.x不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 发电机企业管理方案
- 2026年中考英语填空题库及答案详解
- 工程承包合同模板
- 2026义务教育语文新课标课程标准题库附含答案
- 2026年吉林白山中小学教师招聘考试卷附答案
- 2026年保密考试简答题真题卷
- 2026年安徽铜陵市中小学教师招聘考试试卷含答案
- 高中英语北师大版 (2019)必修 第二册Lesson 2 Professional Rescue Team教案及反思
- 第四节 光的干涉教学设计高中物理粤教版2019选择性必修 第一册-粤教版2019
- 贵州省惠水民族中学高中地理《环境保护》第7-8课时教学设计 新人教版选修6
- “让欺凌归零为成长护航”防校园欺凌主题班会教案
- 办公室职能人员安全培训课件
- 如何提高执行力方案
- 儿童验光规范化流程与要点
- 2025年10月自考《思想道德修养与法律基础》模拟试题和答案
- 医院培训课件:《婴儿艾滋病早期诊断滤纸片干血斑样本的采集、处理运输、保存及实验室检测》
- 2025秋期版国开电大本科《心理学》一平台形成性考核练习1至6在线形考试题及答案
- 初级注安考试试题及答案(2025年北京市)
- 制药厂机修考试题及答案
- 出境人员行前安全培训课件
- 国家电投集团陆上光伏发电工程典型设计
评论
0/150
提交评论