当前位置: 首页 > news >正文

Java面试八股Spring篇(4500字)

Spring Boot、Spring MVC 和 Spring 有什么区别?
  • Spring:是核心框架,提供依赖注入(IoC)和面向切面编程(AOP)的基础功能,是其他模块的基石。

  • Spring MVC:是基于SpringWeb框架,专注于MVC模式(模型-视图-控制器),用于处理 HTTP请求和响应,支持URL路由、模板引擎等Web开发功能。

  • Spring Boot:是Spring的快速开发工具,通过自动配置(如内嵌 Tomcat)和 Starter 依赖简化了项目搭建

BeanFactoryApplicationContex有什么区别?
  • BeanFactorySpring的基础容器,提供基本的依赖注入功能,采用延迟加载。

  • ApplicationContextBeanFactory的子接口,是更高级的容器,如国际化支持、事件发布、AOP等,采用预加载策略。

SpringMVC 怎么样设定重定向和转发的?
  • 转发:返回视图名前加 forward:,如 return "forward:/path"

  • 重定向:返回视图名前加 redirect:,如 return "redirect:/path"

当一个方法向AJAX返回特殊对象,比如Object,List等,需要做什么处理?
  • 使用 @ResponseBody 注解将返回值序列化为 JSON/XML,并配合 @RestController 或配置消息转换器(如 Jackson)。示例:
SpringMvc 用什么对象从后台向前台传递数据的?
  • 可以使用 ModelModelMapModelAndView 对象来传递数据
AOP(面向切面编程)
  • 切入点:需要织入逻辑(增强功能)的方法。

  • 通知:织入的具体逻辑(增强的代码逻辑),如前置、后置、环绕通知。

  • 切面:绑定通知与切入点的关系。

  • 作用:统一处理日志、性能监控、事务管理,减少代码冗余,提升可维护性。

Spring AOP和IOC是什么?使用场景有哪些?Spring 事务,事务的属性,数据库隔离级别
  • AOP是面向切面编程,指在不影响原有代码的基础上对代码进行功能增强,使用场景有日志记录和权限控制,性能监控等

  • IOC是控制反转, 指的是对象创建、依赖管理的控制权程序本身转移到IOC容器

  • 容器的作用是创建 bean 实例并管理 bean 的生命周期,并实现依赖注入

  • DI 依赖注入是实现 IOC 的一种方式, 就是将依赖对象注入到目标对象中(给对象传递需要使用的其他对象),实现解耦合

  • DI的实现方式有setter注入,构造器注入,字段注入(使用@Autowired注解)

//Setter 注入
public class UserService {private UserRepository userRepository;public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}
//构造器注入
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
//字段注入
public class UserService {@Autowiredprivate UserRepository userRepository;
}
  • DI的使用场景有 : 控制对象生命周期,自动注入依赖对象(如 @Autowired), 配置管理(如使用 application.yml@Value 等)
Spring事务管理
  • Spring 事务保证一组数据库操作要么全部成功,要么全部失败(原子性),避免数据不一致,分为声明式事务和编程式事务,声明式事务通过注解,如 @Transactional 实现。编程式事务通过 TransactionTemplatePlatformTransactionManager 手动控制。

  • 事务的属性:
    propagation(传播行为):如 REQUIREDREQUIRES_NEW
    isolation(隔离级别):见下文
    timeout:超时时间
    readOnly:只读事务(可优化性能)
    rollbackFor:哪些异常触发回滚

  • 数据库隔离级别:

隔离级别说明可避免问题
READ UNCOMMITTED读未提交无法避免任何问题
READ COMMITTED读已提交(Oracle 默认)避免脏读
REPEATABLE READ可重复读(MySQL 默认)避免脏读、不可重复读
SERIALIZABLE串行化(最高级别)避免所有并发问题
什么是Spring的bean?

SpringBean,简单来说就是由Spring容器“产生”并“管理”的Java对象,bean的创建、配置以及生命周期都由容器负责

Bean 的生命周期
  1. bean实例化:通过反射或工厂方法创建Bean实例。

  2. 属性赋值:为Bean设置相关属性和依赖

  3. 初始化:完成Bean的初始化。

  4. 使用:Bean处于活动状态,可以在应用程序中使用。

  5. 销毁:容器关闭时调用销毁方法释放资源

Spring Bean 的配置方式主要有三种:
  1. XML配置:通过 <beans><bean> 标签声明Bean定义。

  2. 基于注解的配置:利用类级别或成员级别注解(如 @Component@Service@Controller@Repository)自动扫描并注册Bean

  3. 使用 @Configuration 配置类结合 @Bean 注解注册Bean

IoC接口

![[Pasted image 20250513142459.png]]

延迟加载: 真正需要bean时才创建bean实例

Spring 如何解决循环依赖?

Spring通过三级缓存来解决循环依赖问题.

Spring创建Bean的流程:

  1. 先去一级缓存中获取,存在就返回。

  2. 如果不存在或者对象正在创建中,于是去二级缓存中获取。

  3. 如果还没有获取到,就去三级缓存中获取,通过执行 ObjectFactorygetObject() 就可以获取该对象,获取成功之后,从三级缓存移除,并将该对象加入到二级缓存中。

Spring MVC 的核心组件有哪些?
  • DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。
  • HandlerMapping:处理器映射器,根据 URL 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
  • HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler
  • Handler:请求处理器,处理实际请求的处理器。
  • ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端
单点登录
  • 身份提供者:集中式认证中心,用户首次登录后颁发 JWT Token

  • 服务提供者:各应用接收并校验 Token,有效则允许访问。

  • Token 传递:可通过HTTP HeaderCookie或重定向参数传递

cookie和session的区别
  • 存储位置:Cookie在客户端(浏览器),Session在服务器端。
  • Cookie占用内存更小,容易暴露,Session存储容量更大,更安全。
get和post请求的区别
  • get请求参数写在url后面,暴露在地址栏,而且url有长度限制
  • post请求的参数写在请求体中,没有长度限制
  • 传输敏感数据时推荐使用post
HTTP请求状态码
  • 200 OK:请求已成功。

  • 301 Moved Permanently:资源已被永久移动到新 URI,以后应使用新的 URI。

  • 302 Found:资源临时位于不同 URI,应继续使用原 URI 发起请求。

  • 400 Bad Request:请求格式错误。

  • 401 Unauthorized:请求需要身份验证。

  • 403 Forbidden:认证成功但权限不足。

  • 404 Not Found:请求的资源不存在。

  • 405 Method Not Allowed:请求方法不允许。

  • 500 Internal Server Error:服务器内部错误

  • 502 Bad Gateway:网关/代理错误,上游服务器无响应

过滤器和拦截器的区别
  • Filter(过滤器)属于Servlet层, Interceptor(拦截器)属于Spring MVC
  • Filter可以拦截所有请求,包括静态资源。Interceptor只能拦截DispatcherServlet处理的请求(即控制器 Controller 相关请求)。
HTTP方法
请求类型描述
GET获取资源
POST创建新资源
PUT更新现有资源
DELETE删除资源
PATCH部分更新现有资源
@Component 和 @Bean 的区别是什么?
  • @Component 于类,@Bean用于方法。

  • @Component标注的类不用编写配置,@Bean定义的Bean需要在配置类中定义方法来返回对象实例。

  • @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

@Autowired和@Resource注解的区别
对比维度@Autowired@Resource(JSR - 250)
自动装配机制基于基于类型进行自动装配。如果多个匹配,需结合 @Qualifier按名称选择。优先按名称装配(指定 name 属性),若找不到对应名称的Bean,则按类型装配。
注入位置可用于字段、构造函数、方法参数等多种场景。常用于字段和方法参数的注入。
灵活性配合@Qualifier可灵活指定注入的 Bean,适合复杂场景。主要通过名称查找,灵活性稍逊于 @Autowired 和 @Qualifier 的组合。
@Controller和@RestController注解的区别
  • @Controller 返回的是视图名称,需要结合模型和视图解析器进行页面渲染。

  • @RestController 将方法返回值直接填入 HTTP 响应体中,返回的通常是JSON

将一个类声明为 Bean 的注解有哪些?
  • @Component:通用注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,可以使用@Component 注解标注。
  • @Repository : 对应持久层即Dao层,主要用于数据库相关操作。
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层。
  • @Controller : 对应Spring MVC控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面

相关文章:

  • Python如何解决中文乱码
  • Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本
  • # 深度剖析LLM的“大脑”:单层Transformer的思考模式探索
  • 【数据库复习】SQL语言
  • 联邦+反射器 基础实验
  • Android学习总结之Glide自定义三级缓存(实战篇)
  • Android Activity之间跳转的原理
  • 【更新】全国省市县-公开手机基站数据集(2006-2025.3)
  • HarmonyOS NEXT~React Native在鸿蒙系统(HarmonyOS)上的适配现状与技术展望
  • 人工智能外呼系统:重构智能交互的全维度进化
  • 观成科技:加密C2框架Vshell流量分析
  • Flink SQL 将kafka topic的数据写到另外一个topic里面
  • PyQt5基本窗口控件(QComboBox(下拉列表框))
  • Webpack其他插件
  • 【计算机网络】TLS中的对称加密和非对称加密的应用,应对第三方抓包的双向https认证
  • 数据库系统概论|第七章:数据库设计—课程笔记
  • 计算机网络-MPLS VPN基础概念
  • 如何设置FFmpeg实现对高分辨率视频进行转码
  • 高速数字测试利器,新款是德科技UXR0504B示波器
  • 多模态和多智能体系统与理性的结合综述研究
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议
  • 多条跨境铁路加速推进,谁是下一个“超级枢纽”?
  • 深圳中院回应“退休夫妻月入1.2万负债1.2亿”:其自述因经营不善负债
  • 法治课|争议中的“行人安全距离”于法无据,考量“注意义务”才更合理
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 外国游客“在华扫货”热:“带空箱子到中国!”