Spring aware相关接口 浅析

Spring中的Aware接口及应用场景 Aware接口是Spring Framework中提供的一组标记接口,用于在Bean装配的过程中获取Spring容器中提供的一些核心组件或运行时上下文等信息。通过使用Aware接口,我们可以在Bean实例化和初始化过程中获取到Spring容器中其他组件,方便Bean类实现更复杂的业务逻辑。本文将会一一介绍Spring中各个Aware接口,以及这些接口的主要应用场景。 阅读详情

 spring中 有一大堆Aware结尾接口,  例如BeanFactoryAware,  ApplicationContextAware, ServletContextAware等

 在程序中 我们自定义的bean实现了 Aware相关接口  spring 通过回调   就可以获得一些资源  

 比如说 我们的bean实现BeanFactoryAware  spring会在bean实例化(getBean)阶段 回调该setBeanFactory方法   注入BeanFactory实例(也就是this)   

 spring   BeanFactoryAware 接口定义

public interface BeanFactoryAware {

   void setBeanFactory(BeanFactory beanFactory) throws BeansException;

}

 spring容器中的bean 实例化 是在AbstractBeanFactory getBean中发生

public Object getBean(String name, Class requiredType, Object[] args) throws BeansException {
	return doGetBean(name, requiredType, args, false);
}

调用的 doGetBean 方法比较复杂  简单看看 创建单例这段

protected Object doGetBean(
			final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {

		final String beanName = transformedBeanName(name);
			.................略			// Create bean instance.
			//bean的定义是不是单例 
  			if (mbd.isSingleton()) {
				sharedInstance = getSingleton(beanName, new ObjectFactory() {
					public Object getObject() throws BeansException {
						try {
							// 是一个抽象方法  在子类AbstractAutowireCapableBeanFactory中实现
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							destroySingleton(beanName);
							throw ex;
						}
					}
				});
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}

		.................略
		return bean;
	}

AbstractAutowireCapableBeanFactory  createBean方法

	protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
			throws BeanCreationException {

		AccessControlContext acc = AccessController.getContext();
		return AccessController.doPrivileged(new PrivilegedAction() {
			public Object run() {
				.................略
				//关注doCreateBean方法
				Object beanInstance = doCreateBean(beanName, mbd, args);
				if (logger.isDebugEnabled()) {
					logger.debug("Finished creating instance of bean '" + beanName + "'");
				}
				return beanInstance;
			}
		}, acc);
	}

doCreateBean方法

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
		// Instantiate the bean.
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			instanceWrapper = (BeanWrapper) this.factoryBeanInstanceCache.remove(beanName);
		}
		.................略
		// Initialize the bean instance.
		Object exposedObject = bean;
		try {
			populateBean(beanName, mbd, instanceWrapper);
			//实现 *Aware部分接口, InitializingBean接口  方法调用在此发生
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
		catch (Throwable ex) {
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
				throw (BeanCreationException) ex;
			}
			else {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}

		.................略
		return exposedObject;
}

initializeBean方法

	protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) {
		if (bean instanceof BeanNameAware) {
			((BeanNameAware) bean).setBeanName(beanName);
		}
		if (bean instanceof BeanClassLoaderAware) {
			((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
		}
		// 如果当前bean 是BeanFactoryAware的一个实例 
		if (bean instanceof BeanFactoryAware) {
			//回调当前实例注入资源
			((BeanFactoryAware) bean).setBeanFactory(this);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			//BeanPostProcessor 接口  postProcessBeforeInitialization方法回调
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}
		try {
			// 实现InitializingBean接口  afterPropertiesSet方法调用
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}

		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}


Spring  aware相关接口

从零玩转GD32单片机CAN总线:手把手实战配置与源码解析 本文提供了一份基于GD32单片机的CAN总线实战入门指南。从硬件连接(GD32F103C8T6与TJA1050收发器)到软件配置,详细解析了CAN初始化、波特率计算、过滤器设置及中断收发等核心源码。通过手把手的回环测试示例与常见问题排查,帮助开发者快速掌握CAN总线通信的关键配置与调试技巧。 阅读详情

相关推荐

同济大学C++mooc第五、六讲参考答案

同济大学C++moooc第5、6讲 第五讲 第一题 随机产生10个30~100(包括30,100)的正整数,求它们的最大值、最小值、平均值,并显示整个数组的值和结果。 代码片. // #include<iostream> const int n = 10; using namespace std; int main() { int s[n],i,j,t,sum=0; for (i = 0; i < n; i++)

cjzui6666的博客 1万+

Spring原理学习(四)Aware 接口

Java 配置类包含 BeanFactoryPostProcessor 的情况,因此要创建其中的 BeanFactoryPostProcessor 必须提前创建 Java 配置类,而此时的 BeanPostProcessor 还未准备好,导致 @Autowired 等注解失效。例如下面这个例子:你会发现用 Aware 注入 ApplicationContext 成功,而 @Autowired 注入 ApplicationContext 失败要想生效就得加处理器。配置类MyConfig1。

小鲁蛋的博客 5097

深度强化学习系列(13): 策略梯度(Policy Gradient)

对于DQN来说使用一个网络直接逼近了值函数,最后取得了非常不错的效果, 但是对于一些连续性控制或者动作空间特别大的环境来说,很难全部计算所有的值函数来得到最好的策略,那么直接计算策略的方法就别提出来了。 回顾一下前面几篇,所谓的策略,其实就是状态到动作的映射数学表达为 π:s→aπ:s→a\pi : s \to a, 我们用ττ\tau 表示状态s到最后一个状态的一个序列,表示为: τ:st...

深度强化学习(DeepRL)探索博客 4642

深入分析Spring Aware原理

深入分析Spring Aware原理

及时当勉励,岁月不待人 1982

基于Claude Code的 规范驱动开发(SDD)指南

传统的AI辅助开发,如同手工作坊,我们向AI描述想法,它给我们零散的部件,我们再手动打磨、组装。这个过程充满了不确定性、信息损耗和重复劳动。本指南将尝试引领您进入软件开发的“工业时代”。在这里,

形上得其象,形下合于数;阴阳自济,玄理自明。 2749

Spring Aware总结

spring aware

抽象的螺旋 944

uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端

uni-app-在纯JS文件中调用自定义弹框组件/封装全局API调用弹框组件(解决小程序、APP无法使用document.body.appendChild插入组件节点)适配全端,uni-appappendChild怎么向小程序中插入节点,如何开发类似uni.showModal全局组件。h5端可以通过document.body.appendChild挂载,请问app跟微信小程序怎么弄,请问uniapp如何封装全局api调用弹窗组件?uniapp怎么设置所有页面共用的组件Uni

🏆 前端领域优质创作者 1万+

Spring的Aware机制到底是干什么的?

Aware接口源码分析 Spring中定义了Aware接口,该接口并未定义方法。该接口更多的是一个标记的作用,具体方法由子类去定义和实现。 Spring内置的许多类都实现了该接口: 以ApplicationContextAware为例: ApplicationContextAware接口定义了一个设置应用上下文的方法。该接口的实现类实现该方法,可以做对上下文处理的逻辑。该aware还要对应一个BeanPostProcessor才能生效。 Spring中内置了一个ApplicationContextAw

不积硅步,无以至千里 9585

2026 年 AI 大模型资讯深度研究报告 / 2026 年 3 月 11 日

2026 年已成为 AI 大模型发展的关键拐点年。从 2023 年 ChatGPT 开启的技术奇点,历经多模态突破、推理能力崛起,至 2025 年形成产业爆发态势,AI 大模型正从"技术验证期"迈向"产业落地期"。核心发现技术突破: OpenAI 于 2026 年 3 月 6 日发布 GPT-5.4,首次实现原生计算机操控能力,在 OSWorld 桌面操控测试中以 75% 成功率超越人类 (72.4%),标志着 AI 从"对话工具"向"自主数字员工"的时代跃迁市场格局。

AI天才研究院 785

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 404

Spring源码学习IOC(7):浅析aware相关接口

spring中 有一大堆Aware结尾接口,  例如BeanFactoryAware,  ApplicationContextAware, ServletContextAware等  在程序中 我们自定义的bean实现了 Aware相关接口  spring 通过回调   就可以获得一些资源    比如说 我们的bean实现BeanFactoryAware  spring会在bean实例

执子之手 622

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Spring】关于Spring中aware相关接口的作用

完成了属性赋值之后,Spring会执行一些回调,包括: 1. BeanNameAware:回传beanName给bean对象。接口的回调方法是在 Bean 实例化之后调用的。具体来说,这些回调方法是在依赖注入完成后,但在 Bean 完全初始化之前调用的。通过这种方式,你可以使用纯 Java 配置来实现 BeanNameAware、BeanClassLoaderAware 和 BeanFactoryAware 回调。最后,编写一个主类来启动 Spring 应用,并获取 MyBean 实例。

qq_36634055的博客 1313

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

spring中的Aware接口原来是这么回事

一、介绍   使用spring开发的同学,或多或少都使用过形如XxxAware这样的接口。spring文档中是这样解释Aware接口的: Spring提供了广泛的Aware回调接口,让bean向容器表明它们需要某种基础设施依赖。 通常Aware有这样一个规则:Aware接口的名称,表示依赖对象的类名称。 例如,一个bean需要使用ApplicationContext,实现Application...

咔咔学长 1万+

Spring之Aware接口介绍

Spring 中的Aware接口详解

波波烤鸭的博客 9377

Spring入门15 - Aware相关接口

入门 15 - Aware相关接口  Spring中提供一些Aware相关接口,像是BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,实作这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实作BeanFactoryAware的Bean在初始后,Sprin

chho的专栏 5432

一文看懂 Spring Aware 接口

本文主要介绍了Spring中的Aware接囗和其子接口的相关用途与其在源码中的调用时机。

weixin_46425661的博客 1104

Spring中的Aware接口

Aware接口,是Spring中的一个根接口。Aware的中文含义,是“意识到,察觉到,发觉,发现”,所以该接口的目的,通过实现Aware的子接口,让类添加发觉信息的能力。 常见的Aware直接实现类: ApplicationContextAware 实现该接口,可以访问Spring容器中缓存的的其他Bean。 获取的ApplicationContext,ApplicationContext接口继承了MessageSource, ApplicationEventPublisher, ResourcePatt

u012556047的博客 3323

【Java】Spring中Aware接口的作用

学习spring的笔记

要继续努力的孤独的博客 1751

Spring之Aware接口

Aware接口从字面上翻译过来是感知捕获的含义。单纯的bean(未实现Aware系列接口)是没有知觉的;实现了Aware系列接口的bean可以访问Spring容器。这些Aware系列接口增强了Spring bean的功能,但是也会造成对Spring框架的绑定,增大了与Spring框架的耦合度。(Aware是“意识到的,察觉到的”的意思,实现了Aware系列接口表明:可以意识到、可以察觉到)。 Aw...

JustinNeil的博客 341

Spring 源码学习 4:Aware 接口

Spring Aware接口与注解失效问题分析 摘要:Spring Aware接口(如ApplicationContextAware、BeanNameAware)允许bean获取容器资源,而InitializingBean接口提供初始化生命周期钩子。文章通过代码示例展示了这些接口的使用方式,并与依赖注入方式(@Autowired、@PostConstruct)进行对比。特别指出当配置类包含BeanFactoryPostProcessor时,会因创建顺序导致注解失效,并给出两种解决方案:1)重构配置类分离工厂

梦幻天空 1135

Spring Aware相关接口介绍

name ApplicationContextAware ApplicationEventPublisherAware BeanClassLoaderAware BeanFactoryAware BeanNameAware BootstrapContextAware LoadTimeWeaverAware MessageSourceAware Not...

zbj17602900546的博客 268

spring aware 接口源码浅析

先来看下aware的官方注释 Marker superinterface indicating that a bean is eligible to be notified by the Spring container of a particular framework object through a callback-style method. Actual method signature is determined by individual subinterfaces, but should

sinat_17618381的博客 266
上一篇: 手动从spring BeanFactory 获取bean (二)
下一篇: mongodb- 安装
胸口碎大石_
博客等级 码龄17年 1154粉丝 82原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值