Java框架高频面试题及详细答案(真实面试版)_第1页
Java框架高频面试题及详细答案(真实面试版)_第2页
Java框架高频面试题及详细答案(真实面试版)_第3页
Java框架高频面试题及详细答案(真实面试版)_第4页
Java框架高频面试题及详细答案(真实面试版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java框架高频面试题及详细答案(真实面试版)一、Spring核心面试题1.说说你对SpringIOC的理解,底层原理是什么?IOC就是控制反转,说白了就是把对象的创建、管理、依赖赋值的权利,从代码手里交给Spring容器,这就是控制反转。以前我们开发都是new对象、手动赋值依赖,现在直接用注解或配置声明,容器自动帮我们装配。底层核心原理就三点:1.资源加载解析:启动时Spring扫描XML配置、JavaConfig类、包路径下的注解,收集所有需要托管的Bean信息;2.反射实例化:根据收集到的Bean定义信息,通过Java反射机制创建对象实例,不会直接执行new关键字;3.依赖注入:自动解析对象之间的依赖关系,通过构造器、set方法、字段注解给对象赋值,最后把完整对象存入单例池。另外IOC还有个核心思想:依赖倒置,面向接口编程,不依赖具体实现,方便后续解耦和替换功能。2.SpringBean的生命周期详细流程我按实际启动顺序说,全程是单例Bean的完整生命周期,日常开发最常用:1.实例化:容器根据Bean定义,反射创建Bean空对象;2.属性填充(依赖注入):自动装配@Autowired、@Resource等依赖,给字段赋值;3.前置处理(BeanPostProcessor前置):执行后置处理器的前置方法,Spring内部用来做代理、属性修改;4.初始化方法执行:先执行InitializingBean的afterPropertiesSet,再执行自定义init-method、@PostConstruct注解方法;5.后置处理(BeanPostProcessor后置):这一步是SpringAOP代理的关键,普通Bean直接返回原对象,需要代理的Bean在这里生成代理对象;6.就绪使用:Bean完成初始化,存入单例池,供业务调用;7.销毁:容器关闭时,执行DisposableBean销毁方法、自定义destroy-method、@PreDestroy方法。重点:AOP代理发生在初始化后置处理阶段,这也是为什么初始化方法里能拿到完整代理对象。3.Bean的作用域有哪些?日常用的最多的是哪个?Spring一共6种作用域,实际开发常用的就两个:1.singleton(单例):默认作用域,整个容器中只创建一个Bean实例,容器启动时初始化(非懒加载),所有请求共享同一个对象,日常90%的Bean都是这个,比如Service、Dao、Controller;2.prototype(多例):每次从容器获取Bean都会新建一个实例,容器只负责创建,不负责销毁;剩下四种是web专属:request、session、application、websocket,普通业务开发基本不用。面试常问坑:单例Bean不是线程安全的,因为多线程共享同一个对象,所以Bean里尽量不要定义成员变量,避免并发问题。4.SpringAOP原理、应用场景,以及动态代理区别AOP就是面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,统一处理公共逻辑,解耦非核心业务。常见应用场景:日志记录、权限校验、事务控制、接口限流、缓存处理、异常统一捕获。底层基于两种动态代理实现:1.JDK动态代理:只能代理实现了接口的类,基于接口生成代理类,是Spring默认优先使用的;2.CGLIB动态代理:基于子类继承实现,不用接口,直接代理普通类,通过字节码增强实现。Spring选择规则:目标类有接口用JDK代理,无接口用CGLIB。SpringBoot2.0之后默认强制使用CGLIB。重点注意:AOP无法拦截内部方法调用,比如同一个类中A方法调用B方法,B的切面不会生效,因为是原生对象调用,不是代理对象调用。5.Spring事务传播机制有哪些?常用的是哪几个?一共7种传播机制,我只说工作中常用、面试必考的:1.REQUIRED(默认):最常用。当前有事务就加入,没有就新建一个事务;2.REQUIRES_NEW:新建一个独立事务,挂起当前事务,互不影响,内层事务回滚不影响外层;3.SUPPORTS:有事务就跟着走,没事务就非事务执行;4.NESTED:嵌套事务,依赖外层事务,有保存点,内层回滚不影响外层,但外层回滚内层必须回滚;剩下三个:MANDATORY、NOT_SUPPORTED、NEVER基本很少用。高频坑点:Spring事务基于AOP代理生效,同类内部调用、方法非public、try-catch捕获异常,都会导致事务失效。二、SpringMVC核心面试题1.SpringMVC完整执行流程我按一次请求的真实执行顺序来讲,清晰好记:1.用户发起请求,前端请求到达服务器;2.DispatcherServlet拦截请求:它是MVC核心总调度,所有请求统一经过它;3.HandlerMapping映射路径:根据请求URL匹配对应的Controller方法,找到处理器;4.HandlerAdapter执行方法:适配对应的处理器,调用Controller业务方法;5.业务逻辑执行:Controller调用Service、Dao处理业务,返回数据或视图;6.视图解析/数据返回:如果是页面请求,ViewResolver解析视图;现在前后端分离,直接返回JSON数据;7.响应返回前端:封装结果、异常处理,最终响应给客户端。2.@RequestMapping、@GetMapping、@PostMapping区别,以及请求方式区别1.@RequestMapping:通用注解,不指定method时支持所有请求方式(GET、POST、PUT、DELETE),安全性差一点;2.@GetMapping:只接收GET请求,参数拼接在URL上,明文传输,适合查询、无参数或少量参数请求;3.@PostMapping:只接收POST请求,参数在请求体,相对安全,适合新增、修改、大批量参数提交。工作规范:查询用GET,新增/修改用POST,严格区分,避免接口乱传请求导致异常。3.@RequestParam和@PathVariable区别1.@RequestParam:获取URL后面的问号参数,比如/user/get?name=张三,适用于普通查询参数;2.@PathVariable:获取URL路径变量,比如/user/get/1001,1001是路径参数,适用于RESTful风格接口。简单总结:带问号的参数用RequestParam,路径占位的参数用PathVariable。4.SpringMVC全局异常处理怎么做?工作中统一用@RestControllerAdvice+@ExceptionHandler实现全局异常处理,非常通用。1.@RestControllerAdvice:标记全局异常处理类,拦截所有Controller的异常;2.@ExceptionHandler:指定捕获的异常类型,比如全局Exception、自定义业务异常、空指针异常;好处:统一返回结果格式,不用每个接口都写try-catch,代码整洁、统一报错样式,方便前端统一处理。三、SpringBoot核心面试题1.SpringBoot自动配置原理(核心必考)SpringBoot核心就是自动配置、简化开发、约定大于配置,底层核心是@EnableAutoConfiguration注解。底层流程:1.项目启动时,@SpringBootApplication包含自动配置开启注解;2.启动时加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件;3.文件中定义了所有场景的自动配置类,比如WebMvcAutoConfiguration、DataSourceAutoConfiguration;4.自动配置类通过@Conditional系列注解做条件判断:有对应依赖、缺少对应Bean时,才自动创建Bean、自动配置参数;5.我们在application.yml/perties配置的参数,会覆盖默认自动配置的参数。通俗说:只要你引入依赖,SpringBoot就帮你自动配好环境,不用写一堆XML和配置类。2.SpringBoot启动流程1.执行main方法,调用SpringApplication.run();2.初始化SpringApplication对象,加载资源、设置监听器、推断应用类型;3.启动监听器,触发启动事件;4.准备环境,加载配置文件(yml、properties);5.创建IOC容器(AnnotationConfigApplicationContext);6.容器刷新:扫描Bean、实例化、依赖注入、初始化、完成自动配置;7.启动内嵌Tomcat容器,对外提供接口服务;8.启动完成,触发结束事件,项目启动成功。3.application.yml和bootstrap.yml区别1.加载顺序不同:bootstrap先加载,application后加载;2.作用不同:bootstrap是系统级配置,优先级更高,一般用来配置Nacos、SpringCloud、注册中心、配置中心;application是业务级配置,配置端口、数据库、自定义业务参数;3.优先级:bootstrap配置会覆盖application同名配置。普通单体项目只用application.yml就行,微服务项目必须用bootstrap。4.SpringBoot常用注解有哪些?1.@SpringBootApplication:启动类核心注解,整合了扫描、自动配置、配置类功能;2.@Configuration、@Bean:手动注册Bean,替代XML配置;3.@Value、@ConfigurationProperties:读取配置文件参数;4.@ConditionalOnXXX:条件注解,按需加载Bean;5.@Slf4j:简化日志打印,不用手动创建日志对象。四、MyBatis核心面试题1.MyBatis工作原理、执行流程1.加载配置文件:启动加载mybatis核心配置、MapperXML文件;2.构建SqlSessionFactory:通过配置信息创建会话工厂,全局唯一;3.获取SqlSession:每次数据库操作创建一个会话,包含数据库连接、事务信息;4.获取Mapper代理对象:通过JDK动态代理生成Mapper接口代理类;5.执行SQL:代理对象匹配XML中的SQL语句,封装参数,执行数据库操作;6.结果映射:将数据库查询结果自动封装为Java对象返回;7.关闭会话:释放数据库连接资源。2.#{}和${}的区别(高频必问)1.#{}:预编译占位符会生成?占位符,通过JDBC预编译赋值,可以防止SQL注入,自动处理字符串引号、转义,日常99%的参数查询都用这个。2.${}:字符串直接拼接直接把参数拼接到SQL语句中,无法防止SQL注入,有安全风险。唯一使用场景:动态排序、动态分表,比如orderby${column}、表名动态替换,这种必须用${}。总结:能使用#{}就绝对不用${},杜绝SQL注入漏洞。3.MyBatis一级缓存、二级缓存区别1.一级缓存(默认开启)级别:SqlSession级别,同一个会话内,相同SQL查询会缓存结果,不用重复查库;失效场景:会话关闭、执行增删改操作、手动清空缓存,一级缓存就会失效。2.二级缓存(手动开启)级别:Mapper映射文件级别,跨SqlSession有效,多个会话可以共享缓存数据;使用要求:实体类实现序列化接口、开启全局缓存、Mapper标签开启缓存;适用场景:查询多、修改少的静态数据,比如字典、配置信息。4.MyBatis分页原理,为什么不推荐自己写limit分页?日常开发统一用PageHelper分页插件,不用手写limit。原理:PageHelper基于MyBatis拦截器,在SQL执行前拦截,自动拼接count统计语句和limit分页语句,自动封装分页结果。手写limit问题:代码冗余、复用性差,而且容易出现分页参数传递错误、总数统计不一致的问题,插件更稳定高效。五、框架综合高频面试题1.说说Spring循环依赖问题,怎么解决的?循环依赖就是A依赖B,B又依赖A,导致Bean无法正常初始化。Spring只能解决单例Bean的set方法、字段注入循环依赖,无法解决构造器注入的循环依赖。核心解决原理:三级缓存1.一级缓存:存放完整初始化好的单例Bean;2.二级缓存:存放原始Bean对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论