核心内容摘要
Mirage Flow大模型内网穿透部署方案详解
Spring Boot注解Spring Boot 注解是如何工作的理解 AOP 的前置知识
Spring 到底在干什么一句话版本
为什么 Service 的类不用 new1️⃣ 一个最简单的 Spring Boot 程序
Service / Component 是干嘛的本质效果等价于伪代码
Autowired 是怎么注入的
Spring 启动时的“对象生命周期”非常关键
AOP 的注解是从什么时候开始生效的
真相代理对象在「启动阶段」就创建好了
这也是为什么 AOP 不会对 this.xxx() 生效
Aspect 本质上是什么
Before / AfterReturning 是怎么用到的
十一、
总结一条完整因果链非常重要
所以 AOP “自动代理”并不神秘
给读者的最终认知模型建议放在文章结尾结语Spring Boot 注解是如何工作的理解 AOP 的前置知识很多初学者在学 Spring Boot 和 AOP 时都会有类似的疑惑ServicepublicclassUserService{}❓ 我没有 new它怎么就能用❓ 加个Aspect怎么方法就被“代理”了❓ Spring 到底在启动时做了什么这篇文章我们不讲源码细节而是用通俗 可运行的代码把 Spring 注解背后的机制讲清楚。
Spring 到底在干什么一句话版本Spring 的核心工作只有一件事扫描类 → 创建对象 → 管理对象 → 在合适的时机“加工”对象AOP、事务、依赖注入本质都是这条流水线上的不同“加工步骤”。
为什么 Service 的类不用 new1️⃣ 一个最简单的 Spring Boot 程序SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}当你运行这行代码时Spring 会启动容器ApplicationContext扫描 classpath找出“需要交给 Spring 管理的类”
Service / Component 是干嘛的ServicepublicclassUserService{publicvoidregister(){System.out.println(注册用户);}}这行Service的真实含义是“请 Spring 在启动时帮我创建这个类的对象并放进容器里。
”本质效果等价于伪代码UserServiceuserServicenewUserService();springContainer.put(userService,userService);你没 new但 Spring new 了
Autowired 是怎么注入的RestControllerpublicclassUserController{AutowiredprivateUserServiceuserService;}Spring 在启动时会创建UserController发现字段上有Autowired去容器里找UserService通过反射赋值userController.userServicespringContainer.get(UserService.class);这一步仍然是反射 容器
Spring 启动时的“对象生命周期”非常关键简化版流程如下扫描类 ↓ 解析注解Component、Service、Aspect… ↓ 创建 Bean 对象 ↓ Bean 后处理BeanPostProcessor ↓ 放入容器⚠️AOP 就是在“Bean 后处理”阶段介入的
AOP 的注解是从什么时候开始生效的我们先看一个切面AspectComponentpublicclassLoggingAspect{Before(execution(* com.example.UserService.*(..)))publicvoidbefore(){System.out.println(记录日志);}}很多人会误以为❌ Spring 在调用方法时“突然拦截了”这是错的。
真相代理对象在「启动阶段」就创建好了当 Spring 启动时发现UserService是一个 Bean发现有Aspect发现切点匹配UserServiceSpring 决定这个 Bean 需要被代理于是它不会直接放入原始对象而是UserService 原始对象 ↓ Spring AOP ↓ 代理对象JDK / CGLIB ↓ 放入容器容器里从一开始拿到的就是代理对象
这也是为什么 AOP 不会对 this.xxx() 生效ServicepublicclassUserService{publicvoida(){this.b();// ❌ 不走代理}publicvoidb(){System.out.println(b);}}原因很简单this指的是当前对象内部不是 Spring 容器里的代理对象AOP 是通过“代理对象”生效的不是魔法
Aspect 本质上是什么AspectComponentpublicclassLoggingAspect{}拆开看Component让 Spring 管理这个类Aspect告诉 Spring ——“这个 Bean 不普通它是用来生成代理规则的”Spring 会把它交给AOP 解析器处理。
Before / AfterReturning 是怎么用到的Before(execution(* com.example.UserService.*(..)))publicvoidbefore(){}Spring 会在启动时解析表达式建立「方法 → 增强逻辑」的映射关系生成代理类时把这些逻辑织入进去不是运行时临时判断而是提前准备好的
十一、