上一篇我们拆了:

BeanPostProcessor 为什么这么重要?Spring 几乎所有黑科技都靠它

看到最后会发现:@Autowired、AOP、@Resource@PostConstruct……

几乎所有功能最后都绕不开:

postProcessBeforeInitialization()

postProcessAfterInitialization()

但新的问题来了:BeanPostProcessor 只是一个扩展点。它怎么知道:

处理哪个 Bean
找哪个字段
执行哪个方法
识别哪个注解

比如:

@Service
public class UserService {

    @Autowired
    private OrderService orderService;

}

Spring 怎么知道:orderService 这个字段需要注入?

总不能写死:if(bean instanceof UserService)

因为 Spring 根本不知道你以后会写什么类,所以答案只有一个:反射

Spring 发布时,你的代码还没出生,平时写代码:

UserService userService = new UserService();

没问题,因为你知道:类名、字段、方法,但 Spring 不一样

Spring 发布:2003

你的业务:2026

Spring 写出来的时候:

UserService
OrderService
PayService

这些类压根不存在。

Spring 不可能提前写:new UserService(),因为它不知道以后会有什么

所以 Spring 必须:运行时动态分析。
而动态分析的核心能力:就是反射。

Spring 拿到的,其实只有 Class

启动时扫描:

@Component
@Service
@Controller

最终拿到:

class com.demo.UserService

也就是:Class,Spring 世界里:很多时候拿着的不是对象,而是:Class

接下来问题来了:

只有 Class:怎么创建对象?怎么找字段?怎么调用方法?

继续靠反射

Bean 创建,本质就是反射创建

Spring 调用链:

createBean()doCreateBean()createBeanInstance()

# 最后:

constructor.newInstance()

本质:反射创建对象,只是 Spring 套了很多层。

扒开源码还是:newInstance()

@Autowired 本质也是反射

例如:

@Service
public class UserService{

    @Autowired
    private OrderService orderService;

}

处理逻辑在:

AutowiredAnnotationBeanPostProcessor

流程:找到字段Field field 暴力访问:field.setAccessible(true)

赋值:field.set(bean,value) 结束。所以:@Autowired 并不神秘

本质:反射 + Bean容器

上一篇说的 BPP,其实也离不开反射

还记得:postProcessBeforeInitialization() 吗?

Spring 会把 Bean 一个个交给:BeanPostProcessor 处理

但处理之前,要先知道:Bean 上有哪些字段、有哪些方法、有哪些注解

怎么办?还是:

clazz.getDeclaredFields()

clazz.getDeclaredMethods()

继续反射。所以很多人以为:BPP 是黑科技,实际上真正干活的是:反射

BPP 只是提供了:什么时候处理?

反射决定:处理什么,那反射不是很慢吗?

学 Java 时都听过:反射性能差,但 Spring 不慌

因为:大部分反射,都发生在启动阶段

比如:

扫描 Bean、创建对象、注入依赖、分析注解

真正运行时:很多结果已经缓存。甚至换成:MethodHandle、CGLIB、ASM

避免频繁反射。所以:反射慢是真的,一直反射是假象

最后总结

上一篇我们说:Spring 大量黑科技来自:BeanPostProcessor

这一篇继续往下拆:BPP 能工作

本质因为Spring 拿到了:Class

然后利用反射:创建 Bean、注入字段、调用方法、分析注解

所以源码看久了你会发现:Spring 像一个大框架

但底层真正干活的:其实是一个疯狂操作反射的工具人

老潘持续拆 Spring 源码

上一篇:

《BeanPostProcessor 为什么这么重要?Spring 几乎所有黑科技都靠它》

下一篇:

《Spring 为什么疯狂使用动态代理?AOP 为什么不用继承?》

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐