Bean 的一生:从实例化到销毁的 12 个关键节点与扩展点
欢迎来到“Spring 妇产医院”兼“职业介绍所”。很多开发者对 Bean 的理解停留在:“哦,加个@Component,然后@Autowired就能用了。”哈哈 还是太天真了!Bean 在 Spring 容器里的一生,比人类的成长史还要跌宕起伏。它要经历受孕、出生、认亲、培训、上岗、甚至退休。如果你不知道这些节点,你就会遇到这些灵异事件:灵异事件一:@PostConstruct里想注入某个 Bean,结果报NullPointerException(因为它还没被注入呢!)。灵异事件二:想给所有 Bean 加个性能监控,结果改了 100 个类,累得半死(其实一个 BPP 就能搞定)。灵异事件三:Prototype 模式的 Bean,为什么@PreDestroy从来不执行?(容器:我只管生,不管养,更不管送终!)今天,我们要拿着“生命监控仪”,全程跟踪一个 Bean 从new出来到被垃圾回收的12 个关键节点。准备好,我们要开始“接生”了!👶🏥核心全景图:Bean 的“人生十二时辰” 这 12 个节点,每一个都是你“搞事情”(插入自定义逻辑)的绝佳机会!一切的核心入口都在AbstractAutowireCapableBeanFactory类的doCreateBean方法中。让我们一段段拆开看深度解析:关键节点的“内幕交易”第一阶段:受孕与出生(实例化 属性填充)1. 实例化 (Instantiation)动作:调用构造函数new User()。状态:此时对象是个“空壳”,属性全是null。如果检测到循环依赖,Spring 会立刻把一个ObjectFactory放入三级缓存,以便其他 Bean 急需时能拿到这个“半成品”。扩展点:通常不干预。除非你用InstantiationAwareBeanPostProcessor搞一些黑科技(比如返回一个代理对象代替真实对象,AOP 的雏形就在这)。源码位置:doCreateBean-createBeanInstance// AbstractAutowireCapableBeanFactory.java protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // ... 前置检查 ... // 1. 【实例化】调用构造函数 new Bean() // 如果是循环依赖,这里会提前暴露一个"早期引用" (Early Bean Reference) BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { // 清理工厂缓存 removeSingletonBeanDefinition(beanName); } // 核心:创建实例 (可能通过构造器推断,也可能通过工厂方法) instanceWrapper = createBeanInstance(beanName, mbd, args); // 获取刚new出来的原始对象 Object exposedObject = instanceWrapper.getWrappedInstance(); Class? exposedType = exposedObject.getClass(); // ... 合并 BeanDefinition ... // 【关键伏笔】如果是单例且允许循环依赖,提前暴露对象工厂 // 这就是解决循环依赖的第一步! boolean earlySingletonExposure = (mbd.isSingleton() this.allowCircularReferences isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { // 将对象工厂放入三级缓存 singletonFactories addSingletonFactory(beanName, () - getEarlyBeanReference(beanName, mbd, exposedObject)); } // 继续后续流程... }2. 属性填充 (Populating Bean Properties)动作:Spring 拿着@Autowired、@Value的清单,把依赖塞进去。状态:对象有了依赖,但还没“觉醒”。源码位置:doCreateBean-populateBean// AbstractAutowireCapableBeanFactory.java protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { // ... 获取 PropertyValues ... // 【扩展点】InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation // 如果返回 false,将跳过属性填充 if (!mbd.isSynthetic() hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { return; // 终止填充 } } } } PropertyValues pvs = mbd.getPropertyValues(); // 【核心】处理 @Autowired, @Value 注解 // 这里的处理器 AutowiredAnnotationBeanPostProcessor 实现了 InstantiationAwareBeanPostProcessor if (hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; // 关键:在这里解析注解并注入属性 PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName); if (pvsToUse == null) { /* 兼容旧版本 */ } pvs = pvsToUse; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2428707.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!