Java面试第八山!《Spring框架》
一、Spring框架概述
Spring是Java企业级应用开发的核心框架,通过控制反转(IoC)和 面向切面编程(AOP)实现模块解耦,简化开发流程。其核心优势包括依赖注入、声明式事务管理、集成主流ORM框架(如Hibernate、MyBatis)等。
Spring生态全景图:
-
核心模块:IoC容器、AOP、事务管理
-
扩展模块:Spring MVC(Web开发)、Spring Boot(快速开发)、Spring Cloud(微服务)
-
数据层支持:Spring Data(统一数据访问)、Spring Security(安全认证)
二、Spring核心机制
1. 控制反转(IoC)与依赖注入(DI)
-
IoC:将对象创建与管理的控制权交给Spring容器,而非硬编码。
-
DI实现方式:
注入方式 特点 示例代码 构造器注入 强制依赖初始化 new UserService(userRepository)
Setter注入 灵活设置可选依赖 userService.setRepo(repo)
注解注入 简化配置(如@Autowired) @Autowired private UserRepo repo
IoC容器工作流程:
-
加载配置文件(XML/注解)
-
解析Bean定义并注册到容器
-
实例化Bean并注入依赖
-
管理Bean生命周期(初始化/销毁)
2. 面向切面编程(AOP)
AOP核心概念:
-
切面(Aspect):封装横切关注点(如日志、事务)
-
通知(Advice):定义何时执行增强(@Before,@Around)
-
切点(Pointcut):指定哪些方法需要增强
AOP实现方式对比:
方式 | 原理 | 适用场景 |
---|---|---|
JDK动态代理 | 基于接口代理 | 目标类实现接口 |
CGLIB动态代理 | 生成子类代理 | 目标类无接口 |
示例:事务管理通过@Transactional注解实现方法级事务控制。
三、Bean管理与作用域
1. Bean生命周期
-
实例化:通过反射创建对象
-
属性注入:填充依赖(DI)
-
初始化:调用init-method或@PostConstruct
-
使用:通过容器获取Bean
-
销毁:调用destory-method
2. Bean作用域
作用域 | 描述 | 适用场景 |
---|---|---|
Singleton | 单例(默认) | 无状态服务(如工具类) |
Prototype | 每次请求创建新实例 | 有状态对象(如购物车) |
Request | 每个HTTP请求一个实例 | Web应用请求处理 |
Session | 每个用户会话一个实例 | 用户登录信息管理 |
四、Spring注解深度解析
1. 组件扫描与核心注解
Spring通过@Component及其衍生注解实现Bean的自动注册,无需XML配置即可完成对象管理:
-
@Component:通用组件标记,适用于任意层级类
-
分层专用注解:
-
@Controller
:Web层组件(如处理HTTP请求) -
@Service
:业务逻辑层组件 -
@Repository
:数据访问层组件(自动处理数据访问异常)
-
示例配置:
<context:component-scan base-package="com.example"/> <!-- 开启组件扫描 -->
2. 依赖注入注解
通过注解实现灵活依赖管理,无需set方法:
-
@Autowired
:按类型自动装配,配合@Qualifier("beanName")
可按名称注入 -
@Resource
:Java原生注解,直接按名称注入(等价于@Autowired + @Qualifier
) -
@Value
:注入配置文件属性(如@Value("${jdbc.url}")
)
代码示例:
@Service
public class UserService {@Autowired@Qualifier("userDao")private UserDao dao; // 按类型+名称精确注入@Resource(name = "cacheManager")private CacheManager cache; // 直接按名称注入
}
3. 作用域与生命周期控制
-
@Scope
:定义Bean作用范围(如@Scope("prototype")
多例模式) -
生命周期回调:
-
@PostConstruct
:初始化后执行(替代init-method
) -
@PreDestroy
:销毁前执行
-
五、Spring事务管理
1. 事务传播行为
传播类型 | 描述 |
---|---|
REQUIRED | 当前有事务则加入,否则新建(默认) |
REQUIRES_NEW | 新建事务,挂起当前事务 |
NESTED | 嵌套事务(子事务回滚不影响父事务) |
2. 声明式事务配置
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class
)
public void transferMoney() { ... }
六、Spring MVC与Spring Boot
1. Spring MVC工作流程
-
用户请求 → DispatcherServlet接收
-
HandlerMapping确定目标Controller
-
Controller执行业务逻辑 → 返回ModelAndView
-
ViewResolver解析视图 → 渲染响应
2. Spring Boot核心优势
-
自动配置:根据依赖自动配置组件(如spring-boot-starter-web集成Tomcat)
-
简化部署:内嵌服务器,打包为可执行JAR
-
监控支持:Actuator提供健康检查、性能指标
七、高频面试题精选
-
IoC与DI的区别:IoC是设计思想,DI是实现方式。
-
Bean线程安全吗:不安全的,单例Bean需避免成员变量,推荐使用ThreadLocal。
-
Spring事务失效场景:非public方法、自调用、异常未抛出等。
翻过这座山,他们就会听到你的故事!欢迎在评论区交流~
相关文章:
Java面试第八山!《Spring框架》
一、Spring框架概述 Spring是Java企业级应用开发的核心框架,通过控制反转(IoC)和 面向切面编程(AOP)实现模块解耦,简化开发流程。其核心优势包括依赖注入、声明式事务管理、集成主流ORM框架(如…...
LangChain教程 - Agent - 支持 9 种 ReAct 交互
引言 LangChain 总结了 9 种经典的复杂模型交互模式,每种都针对特定任务设计,兼具独特优势与适用场景,内容涵盖: ReAct、Function Call、知识库、搜索等,使用这些模式可以大大简化这些场景开发难度。这些模式可以使用…...

蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...

【大模型基础_毛玉仁】1.4 语言模型的采样方法
【大模型基础_毛玉仁】1.4 语言模型的采样方法 1.4 语言模型的采样方法1.4.1 概率最大化方法1)贪心搜索(GreedySearch)2)波束搜索(BeamSearch) 1.4.2 随机采样方法1)Top-K 采样2)Top…...

[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:SAM 文件 & Windows 本地认证流程 0x0101:SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候&am…...

基于SNR估计的自适应码率LDPC编译码算法matlab性能仿真,对比固定码率LDPC的系统传输性能
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 基于序列的SNR估计 2.2 基于SNR估计值进行码率切换 2.3 根据数据量进行码率切换 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印)&…...
opencv 模板匹配方法汇总
在OpenCV中,模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法,通过cv2.matchTemplate函数实现,该函数支持的匹配方式主要有以下6种,下面详细介绍每种方法的原理、特点和适用场景。 1. cv2.T…...

Embedding技术:DeepWalkNode2vec
引言 在推荐系统中,Graph Embedding技术已经成为一种强大的工具,用于捕捉用户和物品之间的复杂关系。本文将介绍Graph Embedding的基本概念、原理及其在推荐系统中的应用。 什么是Graph Embedding? Graph Embedding是一种将图中的节点映射…...
微信小程序注册组件
在微信小程序中注册组件分为自定义组件的创建和全局/局部注册,下面为你详细介绍具体步骤和示例。 自定义组件的创建 自定义组件由四个文件组成,分别是 .js(脚本文件)、.json(配置文件)、.wxml(…...

【docker】安装mysql,修改端口号并重启,root改密
我的docker笔记 【centOS】安装docker环境,替换国内镜像 1. 配置镜像源 使用阿里云镜像加速器,编辑/etc/docker/daemon.json sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https:/…...
自定义wordpress三级导航菜单代码
首先,在你的主题functions.php文件中,添加以下代码以注册一个新的菜单位置: function mytheme_register_menus() {register_nav_menus(array(primary-menu > __(Primary Menu, mytheme))); } add_action(init, mytheme_register_menus); …...

洛谷 P1480 A/B Problem(高精度详解)c++
题目链接:P1480 A/B Problem - 洛谷 1.题目分析 1:说明这里是高精度除以低精度的形式,为什么不是高精度除以高精度的形式,是因为它很少见,它的模拟方式是用高精度减法来做的,并不能用小学列竖式的方法模拟…...
JAVA入门——网络编程简介
自己学习时的笔记,可能有点水( 以后可能还会补充(大概率不会) 一、基本概念 网络编程三要素: IP 设备在网络中的唯一标识 端口号 应用软件在设备中的唯一标识两个字节表示的整数,0~1023用于知名的网络…...

Ubuntu 合上屏幕 不待机 设置
有时候需要Ubuntu的机器合上屏幕的时候也能正常工作,而不是处于待机状态。 需要进行配置文件的设置,并重启即可。 1. 修改配置文件 /etc/systemd/logind.conf sudo vi /etc/systemd/logind.conf 然后输入i,进入插入状态,修改如…...

捣鼓180天,我写了一个相册小程序
🙋为什么要做土著相册这样一个产品? ➡️在高压工作之余,我喜欢浏览B站上的熊猫幼崽视频来放松心情。有天在家族群里看到了大嫂分享的侄女卖萌照片,同样感到非常解压。于是开始翻阅过去的聊天记录,却发现部分图片和视…...

短分享-Flink图构建
一、背景 通过简单的书写map、union、keyby等代码,Flink便能构建起一个庞大的分布式计算任务,Flink如何实现的这个酷炫功能呢?我们本次分享Flink做的第一步,将代码解析构建成图 源码基于Flink 2.10,书籍参考《Flink核…...

【监督学习】支持向量机步骤及matlab实现
支持向量机 (四)支持向量机1.算法步骤2. MATLAB 实现参考资料 (四)支持向量机 支持向量机(Support Vector Machine, SVM)是一种用于分类、回归分析以及异常检测的监督学习模型。SVM特别擅长处理高维空间的…...
机器学习-随机森林解析
目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 **(1) 减少过拟合** **(2) 高效并行化** **(3) 特征重要性评估** **(4) 耐抗噪声** 四. 随机森林的优缺点 优点 缺点 五.…...

Javaweb后端spring事务管理 事务四大特性ACID
2步操作,只能同时成功,同时失败,要放在一个事务中,最后提交事务或者回滚事务 事务控制 事务管理进阶 事务的注解 这是所有异常都会回滚 事务注解 事务的传播行为 四大特性...
在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案
问题背景 在实际业务中,我们常会遇到数据冗余问题。例如,一个公司表(sys_company)中存在多条相同公司名的记录,但只有一条有效(del_flag0),其余需要删除。删除前需将关联表…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...