Spring AOP 原理详解(JDK 动态代理 & CGLIB)
Spring AOP 原理详解(JDK 动态代理 & CGLIB)什么是 AOP?AOP(Aspect-Oriented Programming) ➡️中文:面向切面编程它让我们可以在不修改业务代码的前提下,统一地为方法添加“横切逻辑”,比如: 日志记录 权限控制 性能监控 事务管理换句话说,AOP = 在方法执行的前后织入增强逻辑 Spring AOP 的本质Spring AOP 本质上是通过 动态代理(Dynamic Proxy) 实现的。 代理方式 触发条件 底层实现 特点 JDK 动态代理 目标类实现了接口 java.lang.reflect.Proxy 代理类只实现接口方法 CGLIB 动态代理 目标类没有实现接口 通过字节码生成子类 可代理所有非 final 方法 AOP 调用链示意图graph TD A["Client 调用代理对象方法"] --> B["AOP Proxy 拦截"] B --> C["AdvisedSupport (通知配置)&q...
Spring 事务管理源码分析
Spring 事务管理源码分析为什么要了解事务源码在实际项目中,我们经常会遇到这些问题: 为什么 @Transactional 不生效? 为什么在同一个类里调用自己的方法事务失效? Spring 是怎么控制事务的开启、提交和回滚的? rollbackFor、Propagation、Isolation 到底怎么生效的?这些问题的根源,都藏在 Spring 的 事务代理机制 和 事务拦截器源码 里。 Spring 事务核心架构graph TD A["@Transactional 方法调用"] B[TransactionInterceptor] C[PlatformTransactionManager] D[DataSourceTransactionManager] E[(数据库连接)] F[执行目标方法] G[回滚事务] H[提交事务] A --> B B --> C C --> D D --> E B --> F F...
Spring 事件机制
Spring 事件机制为什么要有事件机制?在一个系统中,不同模块经常需要“感知”某些行为发生,比如: 用户注册成功后,发送欢迎邮件 订单创建后,通知库存服务 Spring 容器刷新完毕后,执行一些初始化逻辑我们不希望模块之间直接耦合调用。Spring 提供了内置的 事件发布/监听模型 来优雅解决这个问题。 事件模型的三要素 组件 作用 常见实现类 事件(ApplicationEvent) 封装消息数据 自定义事件类 事件发布器(ApplicationEventPublisher) 负责发布事件 ApplicationContext 本身 事件监听器(ApplicationListener) 监听并处理事件 自定义监听类 核心类结构flowchart TD A[ApplicationEventPublisher] -->|publishEvent| B[ApplicationEventMulticaster] B -->|for each listener| C[ApplicationListener] C -...
Spring-AOP-实现原理
Spring-AOP-实现原理AOP 本质回顾AOP(Aspect Oriented Programming)面向切面编程:在不修改原始业务代码的情况下,对方法调用前后进行增强。常见例子: 12345678910111213@Aspect@Componentpublic class LogAspect { @Before("execution(* com.example.service.*.*(..))") public void before() { System.out.println("方法执行前"); } @After("execution(* com.example.service.*.*(..))") public void after() { System.out.println("方法执行后"); }} 当我们调用: 1userService.saveUser()...
Bean 生命周期与扩展点
回顾之前之前章节我们看到 Bean 创建的完整流程: 实例化(反射 new 出对象) 依赖注入(populateBean) 初始化(initializeBean) 放入 单例池 今天我们就专注在 第 3 步初始化 —— 这里 Spring 会调用大量扩展点。 Bean 生命周期完整顺序假设有一个 Bean: 1234567891011121314151617181920212223242526@Componentpublic class MyService implements InitializingBean, DisposableBean { @PostConstruct public void initByAnnotation() { System.out.println("initByAnnotation"); } @Override public void afterPropertiesSet() { System.out.println("...
Bean 实例化与依赖注入
回顾之前 refresh() 是容器启动的入口 XML 被解析成 BeanDefinition,注册进 beanDefinitionMap👉 现在我们要看 refresh() 的第 11 步:finishBeanFactoryInitialization(beanFactory)。这里会调用 DefaultListableBeanFactory#preInstantiateSingletons 来实例化单例 Bean。 preInstantiateSingletons()源码(简化): 12345public void preInstantiateSingletons() { for (String beanName : this.beanDefinitionNames) { getBean(beanName); }} 📌 关键点:Spring 会循环所有的 非懒加载的单例 Bean,调用 getBean() 来创建实例。 getBean() 调用链调用栈大致如下: AbstractBeanFactory...
BeanDefinition 的加载与注册
BeanDefinition 的加载与注册回顾之前我们看到 refresh() 方法的执行步骤,其中 第 2 步:obtainFreshBeanFactory() 很关键。它会: 创建 BeanFactory 加载并解析配置文件(比如 XML) 把解析结果放到 BeanFactory 里 关键类:XmlBeanDefinitionReader在 ClassPathXmlApplicationContext 里,加载配置的逻辑大致是: 12345protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) { XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); // 解析 application.xml beanDefinitionReader.loadBeanDefinitions(configResources);} ...
IOC 容器启动入口
IOC 容器启动入口建立测试环境12345678910public class SpringSourceTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); MyService myService = context.getBean(MyService.class); myService.sayHello(); }} application.xml: 123456789<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan...
Spring Boot 简介
Spring Boot Basics Tutorial for Beginners1. Spring Boot 简介1.1 什么是 Spring Boot? Spring Boot 是 Spring 框架的扩展,旨在简化新 Spring 应用程序的配置和开发。 它通过提供预配置的默认设置和嵌入式服务器(如 Tomcat)来简化开发过程。 目标是帮助开发者快速构建独立的、生产级的 Spring 应用程序。 1.2 核心特性 自动配置:根据项目的依赖关系自动配置 Spring 应用。 起步依赖:提供一系列常用的依赖集合,简化项目配置。 内嵌服务器:支持嵌入式 Tomcat、Jetty 等服务器,简化部署。 生产就绪功能:内置健康检查、指标监控等功能。 2. 环境准备与项目创建2.1 开发工具 JDK 8+ Maven 3.0+ 或 Gradle 2.2 使用 Spring Initializr 创建项目 访问 Spring Initializr 网站。 选择项目元数据: Project:选择 Maven 或 Gradle。 Language:选择 Java。 Spring Bo...