当前位置: 首页 > news >正文

11. Spring源码篇之实例化前的后置处理器

简介

spring在创建Bean的过程中,提供了很多个生命周期,实例化前就是比较早的一个生命周期,顾名思义就是在Bean被实例化之前的处理,这个时候还没实例化,只能拿到该Bean的Class对象,如果在这个时候直接返回一个对象,那么就不用spring给我们创建了

简单使用

实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation方法

@Component
public class UserBean {public UserBean() {System.out.println("实例化UserBean");}
}@Component
public class BeforeInstantiation implements InstantiationAwareBeanPostProcessor {@Overridepublic Object postProcessBeforeInstantiation(@NotNull Class<?> beanClass, String beanName) throws BeansException {if (beanName.equals("userBean")) {return "1";}return null;}
}public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println(context.getBean("userBean"));
}

输出结果 1

从上面的逻辑可以看出,如果beanName是userBean,那么直接返回一个
1,这个返回值是个object,任意类型都可以,如果直接返回有结果,那么这个结果就是该bean的结果,spring不会再给我们去实例化bean

源码分析

createBean源码

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);// 如果拿到Bean直接返回,也就是不会再有后面的逻辑,后面的一些扩展点会不生效
if (bean != null) {return bean;
}

进入 resolveBeforeInstantiation

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {// 有没有 InstantiationAwareBeanPostProcessors 后置处理器if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {Class<?> targetType = determineTargetType(beanName, mbd);if (targetType != null) {// 如果有后置处理去执行初始化前逻辑,可能获得了一个Beanbean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);if (bean != null) {// 如果获得了Bean,由于外面是直接返回,但是Aop逻辑应该还是要有,而aop就是通过初始化后的后置处理实现的,所以需要执行bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved = (bean != null);}return bean;
}protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {// 遍历执行postProcessBeforeInstantiation方法,可能可以直接获得到Beanfor (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);if (result != null) {return result;}}return null;
}public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {Object result = existingBean;// 遍历执行初始化后的逻辑postProcessAfterInitializationfor (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;
}

从上面的源码逻辑得知,每个bean都会进行实例化前的操作,通过找出所有的InstantiationAwareBeanPostProcessor执行postProcessAfterInitialization方法进行扩展。

以上就是实例化前的扩展点。


欢迎关注,学习不迷路!

http://www.lryc.cn/news/235493.html

相关文章:

  • Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求
  • P1304 哥德巴赫猜想
  • CSDN每日一题学习训练——Python版(搜索插入位置、最大子序和)
  • Java在物联网中的重要性
  • 动态规划解背包问题
  • PCL内置点云类型
  • clickhouse数据结构和常用数据操作
  • upload-labs关卡9(基于win特性data流绕过)通关思路
  • C++过河卒问题
  • 【机器学习12】集成学习
  • nodeJs基础笔记
  • Skywalking流程分析_9(JDK类库中增强流程)
  • 矩阵的QR分解
  • STL总结
  • 资深测试总结,现在软件测试有未来吗?“你“的底气在哪里?
  • Scalable Exact Inference in Multi-Output Gaussian Processes
  • sqli-labs(Less-3)
  • 集合框架面试题
  • 【LeetCode刷题日志】225.用队列实现栈
  • 【JavaScript】fetch 处理流式数据,实现类 chatgpt 对话
  • 收发电子邮件
  • sql13(Leetcode570至少有5名直接下属的经理)
  • 15分钟,不,用模板做数据可视化只需5分钟
  • C 语言字符串函数
  • nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)
  • 详细步骤记录:持续集成Jenkins自动化部署一个Maven项目
  • Python学习(一)基础语法
  • 【C刷题】day7
  • 数据挖掘复盘——apriori
  • Windows10下Maven3.9.5安装教程