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注解)

java 复制代码
//Setter 注入
public class UserService {
    private UserRepository userRepository;

    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
java 复制代码
//构造器注入
public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
java 复制代码
//字段注入
public class UserService {
    @Autowired
    private 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 层返回数据给前端页面
相关推荐
小薛博客29 分钟前
4、前后端联调文生文、文生图事件
java·ai
蓝婷儿29 分钟前
前端面试每日三题 - Day 34
前端·面试·职场和发展
uyeonashi30 分钟前
【Boost搜索引擎】构建Boost站内搜索引擎实践
开发语言·c++·搜索引擎
再睡一夏就好33 分钟前
从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区
linux·服务器·c语言·开发语言·学习笔记
愛~杦辷个訾2 小时前
芋道项目,商城模块数据表结构
java·sql·芋道·yudao-cloud·芋道商城
Volunteer Technology2 小时前
SpringCloud Gateway知识点整理和全局过滤器实现
spring·spring cloud·gateway
TIF星空2 小时前
【使用 C# 获取 USB 设备信息及进行通信】
开发语言·经验分享·笔记·学习·microsoft·c#
想太多会累i2 小时前
Spring Boot 使用Itext绘制并导出PDF
spring boot·pdf
Smile丶凉轩4 小时前
Qt 界面优化(绘图)
开发语言·数据库·c++·qt
reasonsummer4 小时前
【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最大化、最小化Vs界面
开发语言·python