Spring框架核心知识深度解析
最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆
今天将对spring常见问题做出解析
一、IOC与AOP核心原理
1. IOC(控制反转)详解
核心思想:将对象的创建、依赖注入的控制权从应用程序代码转移到Spring容器
实现机制:
BeanFactory
:基础容器接口ApplicationContext
:扩展容器(提供更多企业级功能)- 依赖注入方式:
// 构造器注入(推荐) @Autowired public UserService(UserRepository repo) {this.repo = repo; }// Setter注入 @Autowired public void setRepo(UserRepository repo) {this.repo = repo; }
IOC核心优势:
- 解耦:对象间依赖关系由容器管理
- 可测试性:便于单元测试(可轻松替换依赖)
- 集中管理:统一配置和生命周期管理
- 灵活性:通过配置即可改变组件行为
2. AOP(面向切面编程)深度剖析
典型应用场景:
- 日志记录(方法调用追踪)
- 事务管理(声明式事务)
- 安全控制(权限校验)
- 性能监控(方法执行时间统计)
- 异常处理(统一异常捕获)
底层实现原理:
// 代理模式示例(JDK动态代理)
public class JdkDynamicProxy implements InvocationHandler {private final Object target;public JdkDynamicProxy(Object target) {this.target = target;}public Object invoke(Object proxy, Method method, Object[] args) {// 前置增强System.out.println("Before method: " + method.getName());// 执行目标方法Object result = method.invoke(target, args);// 后置增强System.out.println("After method: " + method.getName());return result;}
}// 使用示例
Service proxy = (Service) Proxy.newProxyInstance(loader,new Class[]{Service.class},new JdkDynamicProxy(target)
);
二、Spring事务实现机制
1. 事务管理架构
核心组件:
PlatformTransactionManager
:事务管理抽象接口TransactionDefinition
:事务属性定义(隔离级别、传播行为等)TransactionStatus
:事务运行时状态
实现流程:
- 代理拦截带有
@Transactional
的方法 - 根据配置获取事务(新建或加入现有事务)
- 执行业务逻辑
- 根据执行结果提交或回滚
2. 事务传播行为
传播行为类型 | 说明 |
---|---|
REQUIRED(默认) | 当前有事务则加入,没有则新建 |
REQUIRES_NEW | 总是新建事务,挂起当前事务 |
NESTED | 嵌套事务(Savepoint机制) |
SUPPORTS | 有事务则加入,没有则以非事务方式执行 |
三、SpringBoot自动装配原理
1. 自动配置触发机制
@SpringBootApplication
↓ 包含
@EnableAutoConfiguration
↓ 触发
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
2. 条件装配注解
注解 | 作用 |
---|---|
@ConditionalOnClass | 类路径存在指定类时生效 |
@ConditionalOnMissingBean | 容器中不存在指定Bean时生效 |
@ConditionalOnProperty | 配置属性满足条件时生效 |
@ConditionalOnWebApplication | Web环境时生效 |
3. 自定义Starter步骤
- 创建
autoconfigure
模块 - 编写自动配置类:
@Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyProperties.class) public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new MyServiceImpl();} }
- 添加
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件
四、Spring核心注解大全
1. 常用注解分类
类别 | 注解示例 | 说明 |
---|---|---|
组件声明 | @Component, @Service | 声明Spring管理的Bean |
依赖注入 | @Autowired, @Resource | 自动装配依赖 |
配置类 | @Configuration | 声明配置类 |
AOP相关 | @Aspect, @Before, @After | 切面编程 |
事务管理 | @Transactional | 声明事务边界 |
测试支持 | @SpringBootTest | 集成测试 |
条件装配 | @Conditional | 条件化Bean创建 |
五、Bean作用域详解
1. 标准作用域类型
作用域 | 说明 | 配置方式 |
---|---|---|
singleton | 默认,单例模式 | @Scope(“singleton”) |
prototype | 每次获取新实例 | @Scope(“prototype”) |
request | 每个HTTP请求新实例 | @Scope(“request”) |
session | 每个会话一个实例 | @Scope(“session”) |
application | ServletContext生命周期 | @Scope(“application”) |
2. 自定义作用域实现
public class ThreadScope implements Scope {private final ThreadLocal<Map<String, Object>> threadLocal = ThreadLocal.withInitial(HashMap::new);@Overridepublic Object get(String name, ObjectFactory<?> objectFactory) {Map<String, Object> scope = threadLocal.get();return scope.computeIfAbsent(name, k -> objectFactory.getObject());}// 其他方法实现...
}// 注册自定义作用域
context.getBeanFactory().registerScope("thread", new ThreadScope());
六、SpringMVC执行流程
1. 请求处理全流程
1. DispatcherServlet接收请求
2. 调用HandlerMapping获取处理器
3. 通过HandlerAdapter执行处理器
4. 执行拦截器preHandle
5. 调用Controller方法
6. 处理返回结果(View或@ResponseBody)
7. 执行拦截器postHandle
8. 渲染视图(如需)
9. 完成请求处理(afterCompletion)
2. 核心组件职责
组件 | 职责 |
---|---|
HandlerMapping | 映射请求到处理器 |
HandlerAdapter | 执行处理器方法 |
ViewResolver | 解析逻辑视图名到具体视图 |
HandlerExceptionResolver | 处理控制器抛出的异常 |
MultipartResolver | 处理文件上传请求 |
七、SpringBoot启动过程
1.创建SpringApplication实例
2.运行run()方法
3.加载SpringApplicationRunListener监听器
4.准备环境Environment
5.创建应用上下文ApplicationContext
6.准备Bean工厂BeanFactory
7.执行refreshContext()刷新上下文
8.调用ApplicationRunner和CommandLineRunner
1. 启动阶段分解
public ConfigurableApplicationContext run(String... args) {// 1. 准备环境ConfigurableEnvironment environment = prepareEnvironment();// 2. 创建应用上下文context = createApplicationContext();// 3. 准备上下文prepareContext(context, environment);// 4. 刷新上下文(核心)refreshContext(context);// 5. 执行RunnercallRunners(context, applicationArguments);return context;
}
2. 自动装配触发点
refreshContext()
→ invokeBeanFactoryPostProcessors()
→ ConfigurationClassPostProcessor
处理自动配置类
八、Spring中的设计模式
1. 经典模式应用
设计模式 | 应用场景 | 实现示例 |
---|---|---|
工厂模式 | BeanFactory | getBean()方法 |
单例模式 | 默认Bean作用域 | @Scope(“singleton”) |
代理模式 | AOP实现 | JDK动态代理/CGLIB |
模板方法 | JdbcTemplate | execute()方法骨架 |
观察者模式 | 事件机制 | ApplicationEventPublisher |
适配器模式 | HandlerAdapter | 适配不同类型的Controller |
装饰器模式 | BeanDefinitionDecorator | 增强Bean定义 |
九、高频面试题精解
Q1:Spring如何解决循环依赖?
三级缓存机制:
- 一级缓存(singletonObjects):存放完整Bean
- 二级缓存(earlySingletonObjects):存放早期Bean引用
- 三级缓存(singletonFactories):存放Bean工厂
处理流程:
A创建 → 暴露工厂到三级缓存 → 依赖B →
B创建 → 依赖A → 从三级缓存获取A的早期引用 →
B完成 → A注入B → A完成
Q2:动态代理选择策略?
- 目标类实现接口:默认JDK动态代理
- 目标类无接口:CGLIB代理
- 强制CGLIB:
@EnableAspectJAutoProxy(proxyTargetClass=true)
Q3:Bean生命周期关键步骤?
- 实例化(构造函数)
- 属性填充(依赖注入)
- 初始化前(
@PostConstruct
) - 初始化(
InitializingBean
) - 初始化后(AOP代理)
- 销毁前(
@PreDestroy
) - 销毁(
DisposableBean
)