Spring 为什么如此依赖反射?因为它根本不知道你会写什么
上一篇我们拆了:
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 为什么不用继承?》
更多推荐



所有评论(0)