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

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容器工作流程

  1. 加载配置文件(XML/注解)

  2. 解析Bean定义并注册到容器

  3. 实例化Bean并注入依赖

  4. 管理Bean生命周期(初始化/销毁)


2. 面向切面编程(AOP)

AOP核心概念

  • 切面(Aspect):封装横切关注点(如日志、事务)

  • 通知(Advice):定义何时执行增强(@Before,@Around)

  • 切点(Pointcut):指定哪些方法需要增强

AOP实现方式对比

方式原理适用场景
JDK动态代理基于接口代理目标类实现接口
CGLIB动态代理生成子类代理目标类无接口

示例:事务管理通过@Transactional注解实现方法级事务控制。


三、Bean管理与作用域

1. Bean生命周期

  1. 实例化:通过反射创建对象

  2. 属性注入:填充依赖(DI)

  3. 初始化:调用init-method或@PostConstruct

  4. 使用:通过容器获取Bean

  5. 销毁:调用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工作流程

  1. 用户请求 → DispatcherServlet接收

  2. HandlerMapping确定目标Controller

  3. Controller执行业务逻辑 → 返回ModelAndView

  4. ViewResolver解析视图 → 渲染响应

2. Spring Boot核心优势

  • 自动配置:根据依赖自动配置组件(如spring-boot-starter-web集成Tomcat)

  • 简化部署:内嵌服务器,打包为可执行JAR

  • 监控支持:Actuator提供健康检查、性能指标


七、高频面试题精选

  1. IoC与DI的区别:IoC是设计思想,DI是实现方式。

  2. Bean线程安全吗:不安全的,单例Bean需避免成员变量,推荐使用ThreadLocal。

  3. Spring事务失效场景:非public方法、自调用、异常未抛出等。

翻过这座山,他们就会听到你的故事!欢迎在评论区交流~


http://www.mrgr.cn/news/93474.html

相关文章:

  • BUUCTF逆向刷题笔记(1-12)
  • 【零基础C语言】第五节 函数
  • Android实现漂亮的波纹动画
  • 【OMCI实践】wireshark解析脚本omci.lua文件(独家分享)
  • 前端实现版本更新自动检测✅
  • DeepSeek V3 源码:从入门到放弃!
  • 现代密码学体系架构设计原则与实践:基于Python的实现与GPU加速GUI演示
  • 【docker】安装mysql,修改端口号并重启,root改密
  • Anolis服务器Arm64架构服务器配置(其他版本服务器解决方式思路一质)
  • JDK ZOOKEEPER KAFKA安装
  • Vue 系列之:组件通讯
  • 在线教育网站项目第二步 :学习roncoo-education,服务器为ubuntu22.04.05
  • react中的fiber和初次渲染
  • 树莓派3B+的初步使用
  • 【VBA】WPS/PPT设置标题字体
  • Java本地缓存深度实践:框架选型与一致性保障(下)
  • 【星云 Orbit•STM32F4】13. 探索定时器:基本定时器
  • 数据库的安装(mysql)
  • Flink深入浅出之02:编程模型、数据源、算子、connector
  • 【人工智能】数据挖掘与应用题库(501-600)