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

Spring Aware接口执行时机

一. 介绍

Spring Aware 接口的执行时机有两处,都在 getBean() 中的 initializeBean() 中;

下面我们分析这两处时机;

// ----------------------- AbstractAutowireCapableBeanFactory ---------------------
protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {// 1. 时机一,invokeAwareMethods()invokeAwareMethods(beanName, bean);Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {// 2. 时机二,BeanPostProcessor 的 postProcessBeforeInitialization()// 处理 aware bean 的是 ApplicationContextAwareProcessorwrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {// 执行 bean 的 init-methodinvokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null), beanName, ex.getMessage(), ex);}if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
}

二. invokeAwareMethods()

时机一,我们看下这个方法会处理几种 Aware bean 对象;

会处理三种 Aware bean,分别是:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware;

// ----------------------- AbstractAutowireCapableBeanFactory ---------------------
private void invokeAwareMethods(String beanName, Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware beanNameAware) {beanNameAware.setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware beanClassLoaderAware) {ClassLoader bcl = getBeanClassLoader();if (bcl != null) {beanClassLoaderAware.setBeanClassLoader(bcl);}}if (bean instanceof BeanFactoryAware beanFactoryAware) {beanFactoryAware.setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}
}

三. ApplicationContextAwareProcessor

ApplicationContextAwareProcessor 是一个处理 Aware 接口的 BeanPostProcessor,我们直接看它的 postProcessBeforeInitialization();

// --------------------------- ApplicationContextAwareProcessor -----------------------------
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ||bean instanceof ApplicationStartupAware)) {return bean;}invokeAwareInterfaces(bean);return bean;
}// --------------------------- ApplicationContextAwareProcessor -----------------------------
private void invokeAwareInterfaces(Object bean) {if (bean instanceof Aware) {// EnvironmentAware:系统环境if (bean instanceof EnvironmentAware environmentAware) {environmentAware.setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware embeddedValueResolverAware) {embeddedValueResolverAware.setEmbeddedValueResolver(this.embeddedValueResolver);}if (bean instanceof ResourceLoaderAware resourceLoaderAware) {resourceLoaderAware.setResourceLoader(this.applicationContext);}// ApplicationEventPublisherAware:事件发布if (bean instanceof ApplicationEventPublisherAware applicationEventPublisherAware) {applicationEventPublisherAware.setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware messageSourceAware) {messageSourceAware.setMessageSource(this.applicationContext);}if (bean instanceof ApplicationStartupAware applicationStartupAware) {applicationStartupAware.setApplicationStartup(this.applicationContext.getApplicationStartup());}// ApplicationContextAware:Spring 的 ApplicationContext 容器if (bean instanceof ApplicationContextAware applicationContextAware) {applicationContextAware.setApplicationContext(this.applicationContext);}}
}
http://www.lryc.cn/news/426582.html

相关文章:

  • android FD_SET_chk问题定位
  • Chapter 39 Python多线程编程
  • STM32(二):GPIO
  • 一文入门mysql 数据库
  • 通义千问( 四 ) Function Call 函数调用
  • 设置idea中放缩字体大小
  • frameworks 之getEvent指令
  • tensorboard显示一片空白解决方案
  • C#编程中,如何实现一个高效的数据排序算法?
  • LookupError: Resource averaged_perceptron_tagger not found.解决方案
  • Leetcode JAVA刷刷站(39)组合总和
  • Spring中AbstractAutowireCapableBeanFactory
  • PostgreSQL的walwriter和archiver进程区别
  • 前端字体没有授权,字体版权检测(是否为方正字体)
  • 在 SOCKS 和 HTTP 代理之间如何选择?
  • C++适配windows和linux下网络编程TCP简单案例
  • OpenDDS的GUID是如何构造的?
  • 初识MySQL(安装与配置环境)
  • druid+logback打印sql执行日志
  • C++编程:无锁环形队列 (LockFreeRingQueue)的简单实现、测试和分析
  • 植物生长时为什么会扭动?科学家解开令查尔斯·达尔文困惑的千古之谜
  • SAP LE学习笔记02 - WM和库存管理(IM)之间的关系,保管Lot(Quant)
  • Span<T> 是 C# 7.2 引入的重要类型
  • Python办公自动化:初识 `openpyxl`
  • Pocketbase实战体验:内置数据库与实时功能如何超越传统MySQL
  • ChatGPT 3.5/4.0 新手使用手册(详细版)
  • 【Java学习】Stream流详解
  • Oracle(69)什么是表压缩(Table Compression)?
  • java JUC编程
  • vue3+element-plus表格分页选中加默认回显选中