Java 框架面试题


Spring

概述

Java中的 ​Spring 框架 是一个开源的 ​企业级应用开发框架,广泛应用于构建模块化、松散耦合的 Java 应用程序

核心特性

控制反转(IOC)依赖注入(DI)

​概念:对象的创建和依赖关系的管理由 Spring 容器负责,而非开发者手动实例化。
​实现方式:通过 ​依赖注入(DI, Dependency Injection)​,将对象的依赖关系注入到容器中。
例:属性注入,setter注入,构造函数注入

面向切面编程(AOP)

概念:将横切关注点(如日志、事务管理)从业务逻辑中分离,通过切面(Aspect)统一处理。
例:日志切面,早期的事务切面
​示例:定义一个日志切面:

核心功能

Spring 框架由多个模块组成,开发者可按需选择组合:

​模块 ​功能描述
​Spring Core 提供 IoC 容器和 DI 功能,是其他模块的基础。
​Spring MVC 基于 MVC 模式的 Web 框架,用于构建 RESTful API 或传统 Web 应用。
​Spring Data 简化数据库访问(如 JPA、JDBC),支持多种数据源(MySQL、MongoDB 等)。
​Spring Security 提供身份认证、授权、攻击防护等安全功能。
​Spring Boot 快速构建独立运行的 Spring 应用,内置自动配置和嵌入式服务器(如 Tomcat)。
​Spring Cloud 微服务架构工具集,支持服务发现、配置管理、分布式事务等(如 Netflix OSS 集成)。

Bean 的作用域

​Singleton​(默认):全局唯一实例。
​Prototype:每次请求创建新实例。
​Request/Session:Web 应用中,每个请求或会话生成独立实例。

Bean的生命周期

实例化 → 属性填充 → 初始化 → 使用 → 销毁
Spring启动,查找并加载需要Spring管理的Bean,进行Bean的实例化放入Spring容器中,
通过@Autowired或@Resource注解注入实例化的Bean对象
有自定义初始化方法的(@Bean注解),调用初始化方法
调用该对象的属性或方法
调用后,若该对象不再使用,则调用该对象的destory进行销毁

Bean 作用域与生命周期

​作用域 ​生命周期特点
​singleton​(默认) 每个容器中唯一实例,初始化一次,容器关闭时销毁。
​prototype 每次请求创建新实例,生命周期由调用方管理(容器不负责销毁)。
​request Web 应用中,每个 HTTP 请求创建新实例,请求结束后销毁(需启用 ContextLoaderListener)。
​session Web 应用中,每个 Session 创建新实例,Session 结束后销毁。
​application Web 应用中,每个 ServletContext 生命周期内唯一实例。

Spring中的单例Bean怎么保证线程安全

使用ThreadLocal,将需要的可变成员变量放在ThreadLocal中

 @Service
public class RequestContext {
    private static final ThreadLocal<String> userThreadLocal = new ThreadLocal<>();

    public void setUser(String user) {
        userThreadLocal.set(user);
    }

    public String getUser() {
        return userThreadLocal.get();
    }

    public void clear() {
        userThreadLocal.remove(); // 避免内存泄漏
    }
}

Spring中的@Autowired和@Resource

在 Spring 框架中,@Autowired 和 @Resource 都是用于依赖注入的注解
核心区别

​特性 ​@Autowired ​@Resource
​来源 Spring 框架原生注解 JSR-250 标准注解(Java EE 规范)
​注入方式 默认按类型(ByType),可结合 @Qualifier 指定名称 默认按名称(ByName),若名称未匹配则回退到按类型(ByType)
​可选性 支持可选依赖(required = false) 不支持可选性,未找到 Bean 时抛出异常
​适用范围 支持构造函数、Setter 方法、字段、任意注解参数 支持字段、Setter 方法,不支持构造函数注入
​与 Spring 集成 深度集成 Spring 功能(如 @Primary、@Qualifier) 仅依赖 JSR-250 标准,与 Spring 无关
​代码可移植性 Spring 专属,脱离 Spring 无法使用 Java 标准,可移植性更强

Spring的注入方式

构造函数注入
Setter 方法注入
​方法注入
字段注入

Spring如何管理事务

Spring提供事务管理器的类DataSourceTransactionManager;配置了一些jdbc连接驱动
Spring提供​启用事务管理:通过注解(@EnableTransactionManagement)告诉Spring,启动事务管理
在要使用事务方法上配置Transactional注解

Spring中的事务传播特性

Spring 提供了 7 种传播行为,通过 @Transactional(propagation = …) 注解配置;常用的有两种
一种是required 如果当前存在事务,则加入该事务;如果当前没有事务,则新建一个事务
一种是supports 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行

SpringMVC

SpringMVC 是基于 ​MVC 设计模式 的 Web 框架,其核心组件包括 ​DispatcherServlet、处理器映射、处理器适配器、Controller、视图解析器 等

​MVC 设计模式

Model(模型)
封装应用程序的数据和业务逻辑。
与数据库、文件系统或其他持久化存储交互。
提供数据验证、状态管理和业务规则处理

View(视图)
负责数据的展示(UI 渲染)。
接收用户输入(如表单提交、按钮点击)。

Controller(控制器)​
接收用户请求(如 HTTP 请求)。
协调 Model 和 View 的交互:
调用 Model 处理业务逻辑或数据操作。
将处理结果传递给 View 进行渲染

MVC 是一种通过 ​职责分离 提升代码质量的经典设计模式,其核心思想是:
​Model:管理数据和业务逻辑。
​View:负责界面展示。
​Controller:协调 Model 和 View 的交互

SpringMVC的执行流程

用户请求 → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ModelAndView → → View渲染 → 响应返回

客户端发送请求到DispatcherServlet,
DispatcherServlet将请求映射到对应的(Controller)来调用业务层执行,
然后返回执行结果(ModelAndView)给DispatcherServlet
DispatcherServlet再将结果传给(ViewResolver)用来数据渲染;
ViewResolver再将渲染的数据返回给DispatcherServlet;
最后由DispatcherServlet将渲染的数据响应给客户端

SpringMVC与Spring是如何整合的

SpringMVC 与 Spring 的整合核心在于:
​依赖注入:通过 Spring 容器管理组件生命周期和依赖关系。
​分层架构:分离业务逻辑(Service)、数据访问(DAO)和 Web 控制(Controller)。
​配置统一:通过父子上下文和注解驱动简化配置。
​扩展性:支持 AOP、拦截器等增强功能。
这种整合使得开发者可以专注于业务逻辑,同时享受 Spring 生态的强大功能和灵活性

SpringBoot

Spring Boot 是 Spring 框架的扩展,通过自动化配置和约定优于配置的理念,开发者不必进行繁琐的配置,专注于业务实现。
其核心价值在于:
​快速启动:内嵌服务器、起步依赖简化项目搭建。
​自动配置:根据依赖自动完成 Spring 配置。
​生产就绪:内置监控、安全等企业级功能。

无论是单体应用还是微服务,Spring Boot 都是Java 开发的首选

SpringBoot核心注解

@SpringBootApplication 启动类入口,组合了自动配置、组件扫描等功能。
@Configuration 定义配置类,替代 XML 配置。
@Bean 手动注册 Bean 到 Spring 容器。
@RestController 构建 RESTful API 控制器。
@EnableAutoConfiguration 自动根据依赖配置 Spring Bean(隐式启用)。
@EnableScheduling 启用定时任务调度。
@EnableCaching 启用缓存功能。

​主启动类:
放在根包路径下,确保 @ComponentScan 能扫描到所有组件。
​按需启用功能:
仅在需要时添加 @Enable* 注解(如缓存、事务)。
​避免过度配置:
优先使用 Spring Boot 的自动配置,减少手动 @Bean 定义。

集群与分布式

集群(Cluster)​
​概念:一组通过高速网络互联的物理或虚拟服务器,协同工作以提升系统的性能、可靠性或扩展性。
​目标:通过资源聚合(如计算、存储、网络)实现高可用性或高性能。
​特点:
节点通常位于同一数据中心或相近网络环境。
节点间共享负载(如负载均衡集群)或共同完成任务(如高性能计算集群)。

​分布式系统(Distributed System)​
​概念:由多个独立计算机节点通过网络连接组成的系统,节点协同完成统一任务,对外表现为单一系统。
​目标:通过跨节点协作实现资源共享、容错性和地理分布支持。
​特点:
节点可分布在不同地理位置,甚至异构环境(不同硬件、操作系统)。
强调数据一致性(如分布式数据库)或任务协调(如区块链)。

微服务

什么是微服务

我理解的微服务就是将应用程序拆分成多个小型、独立的服务;每个服务专注于单一的业务功能
Java这块的微服务,我对SpringCloud和SpringCloudAlibaba比较了解

  • SpringCloud是基于SpringBoot专为分布式微服务架构而实现
    它的核心组件有
    ​Eureka 注册中心,服务注册与发现(AP协议,高可用)
    Gateway 网关
    Feign 它负责微服务间的 API 调用
    ​Ribbon 负载均衡(与RestTemplate结合使用)
    Resilience4j 熔断降级、线程隔离

  • SpringCloudAlibaba是由阿里专为云原生架构设计的一套微服务框架
    它的核心组件有
    nacos 注册中心;它的作用类似于​Eureka
    Dubbo 服务调用作用类似Feign
    Sentinel 负责流量控制、熔断降级、负载均衡
    RocketMQ 消息队列

负载均衡机制

我记得有好多种;常用的有两种
一种是轮询机制,就是1,2,3;这样一个一个调用,完了再次循环调用
还有就是随机的方式,这种就是随机选个服务调用

熔断机制

它是微服务架构中用于防止系统雪崩的机制
熔断的工作流程分为三个状态

  • 闭合状态(Closed)​
    正常情况,请求正常调用下游服务。
    若失败次数超过阈值(如连续5次失败),触发熔断,进入打开状态。

  • 打开状态(Open)​
    直接拒绝所有请求,返回错误或降级结果。
    经过一段时间后(如5秒),进入半开状态。

  • ​半开状态(Half-Open)​
    允许少量请求尝试调用下游服务。
    若请求成功,则关闭熔断,恢复正常;若失败,则重新打开熔断

技术选型建议

​选择 Spring Cloud 的情况:

  • 团队熟悉 Spring 生态,需高度定制化。
  • 项目需兼容多平台(如非阿里云环境)。
  • 希望使用成熟稳定的组件(如 Eureka、Resilience4j)。
    ​选择 Spring Cloud Alibaba 的情况:
  • 已使用阿里云或计划上云。
  • 需要开箱即用的分布式事务、流量治理。
  • 追求高性能和高可用性(如 Nacos 动态配置)。

​总结
​Spring Cloud 是微服务领域的“通用标准”,适合需要灵活性和广泛生态支持的项目。
​Spring Cloud Alibaba 是“云原生专家”,适合阿里云用户或需要一站式高可用解决方案的场景

​Spring、SpringMVC、Spring Boot、Spring Cloud 的关系

​技术 ​是否必需 ​核心目标
​Spring 提供基础依赖注入、AOP 等核心功能。
​Spring MVC 可选 构建 Web 应用,处理 HTTP 请求(可被 Spring Boot 替代)。
​Spring Boot 推荐 简化 Spring 应用的配置与部署(Web 或非 Web)。
​Spring Cloud 可选 解决分布式系统中的服务治理问题(需基于 Spring Boot)。

总结
​Spring 是地基,提供基础能力。
​Spring MVC 是 Web 开发的专用工具,可被 Spring Boot 自动化替代。
​Spring Boot 是加速器,简化 Spring 应用的开发和部署。
​Spring Cloud 是扩展包,专为分布式微服务架构设计,依赖 Spring Boot 的自动化能力。
协作逻辑:
Spring → Spring Boot → Spring Cloud,层层递进,最终支撑从单体应用到分布式系统的演进。

Mybatis

MyBatis 是一个​持久层框架,专注于 SQL 映射和数据库操作,通过简单的 XML 或注解配置即可实现高效的数据访问

Mybatis中#{}与${}区别

​**#{}:安全、高效,适用于常规参数绑定。在SQL动态解析之后,编译将#{}替换为占位符?去替换参数,可以防止sql注入
${}**:灵活但危险,仅用于动态结构(如表名、列名),需严格校验参数。是进行字符串拼接,直接取出参数值,放到sql语句中
​能用 #{} 就不用 ${},除非必须动态拼接 SQL 结构

Mybatis缓存策略

一级缓存
同一个 SqlSession 中有效。默认开启
​生命周期:
当执行 insert、update、delete 操作时,一级缓存会被清空。
SqlSession 关闭时,缓存自动清除。
​适用场景:
同一会话内多次查询相同数据

二级缓存(Second Level Cache)​
Mapper 级别,跨 SqlSession 共享。
​生命周期:
需手动启用,配置在 Mapper XML 或注解中。
默认使用 LRU(最近最少使用)淘汰策略。
支持多种缓存实现(如 Ehcache、Redis)。
​适用场景:
跨会话的频繁查询(如热点数据)。
数据变动不频繁的静态数据(如字典表)

Mybatis执行流程

  1. 加载配置文件
    解析 mybatis-config.xml,初始化数据源、事务管理器、类型别名等。
  2. 创建 SqlSessionFactory
    通过 SqlSessionFactoryBuilder 构建工厂对象,用于生成 SqlSession。
  3. 开启 SqlSession
    通过 SqlSessionFactory.openSession() 获取会话,开启事务。
  4. ​执行 SQL 操作
    调用 Mapper 接口方法或直接执行 SQL 语句。
  5. ​处理动态 SQL
    解析 XML 中的动态标签(如 ),生成最终 SQL。
  6. ​参数绑定与执行
    将参数绑定到预处理语句,执行 SQL 并获取结果集。
  7. ​结果映射
    将结果集转换为 Java 对象,支持自动或手动映射。
  8. ​事务提交与资源释放
    提交事务或回滚,关闭 SqlSession。

Mybatis中resultMap和resultType区别

resultType:
适用于列名与属性名一致的场景,优先选择 resultType,简化配置。
resultMap:
​复杂场景使用 列名不一致、需要关联查询或嵌套映射时,使用 resultMap。

​能用 resultType 就不用 resultMap,除非必须自定义映射逻辑

MybatisPlus


文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录