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

Spring高级篇-Spring IOC容器 Aware 接口

一、概述

在Spring框架中,IOC(Inversion of Control)容器负责管理应用程序中的对象(即Bean)的生命周期和依赖关系。Spring提供了一系列的Aware接口,允许Bean在初始化时获取Spring容器中的某些资源或信息。这些接口通常以Aware结尾,表示Bean能够“感知”到某些特定的Spring容器功能。

1.2 spring 对Aware对实现

spring将Aware 分成两大类,一类是可以直接继承实现分别为 bean、classLoader、beanFactory。另一类是通过 ApplicationContextAwareProcessor 后置处理器,间接回调。
在bean注册的时候,将实现继承这些接口( bean、classLoader、beanFactory)的类相关的信息注入该类中。如下图:
在这里插入图片描述
通过 ApplicationContextAwareProcessor 后置处理器:
在这里插入图片描述

二、常用的Aware

接下来我们来看看Spring提供的常用Aware 接口。

2.1 BeanNameAware

在这里插入图片描述
实现 BeanNameAware 接口需要实现 setBeanName () 方法,这个方法只是简单的返回我们当前的 beanName,这个接口表面上的作用就是让实现这个接口的 bean 知道自己在 spring 容器里的名字,而且官方的意思是这个接口更多的使用在 spring 的框架代码中,实际开发环境应该不建议使用,因为 spring 认为 bean 的名字与 bean 的联系并不是很深,(的确,抛开 spring API 而言,我们如果获取了该 bean 的名字,其实意义不是很大,我们没有获取该 bean 的 class,只有该 bean 的名字,我们也无从下手,相反,因为 bean 的名称在 spring 容器中可能是该 bean 的唯一标识,也就是说再 beanDefinitionMap 中,key 值就是这个 name,spring 可以根据这个 key 值获取该 bean 的所有特性)所以 spring 说这个不是非必要的依赖。

2.2 BeanClassLoaderAware

2.2.1 介绍

在这里插入图片描述
BeanClassLoaderAware 接口为开发者提供了一种简单而有用的方式来获取 Bean 的类加载器信息。通过实现该接口,Bean 可以在初始化阶段获取自身类加载器,从而更灵活地处理一些与类加载器相关的逻辑。

2.3 BeanFactoryAware

2.3.1 简介

在这里插入图片描述
BeanFactoryAware 接口是一个回调接口,它提供了一个用于设置 Bean 工厂的方法。当一个 Bean 实现了 BeanFactoryAware 接口时,在该 Bean 实例被实例化后,Spring 容器会调用 setBeanFactory 方法,并将该 Bean 所在的工厂作为参数传递进去。

2.3.2 使用场景

BeanFactoryAware 最常用的场景 是在需要根据特别变量创建或者配置Bean,在运行过程中获取对应相关连的bean做一些拓展或者实现策略模式等。
BeanFactoryAware主要解决代码间的耦合问题,并且可以利用容器上下文范围其他的bean,以便实现更多的功能。

2.4 EnvironmentAware

2.4.1 介绍

在这里插入图片描述
所有注册到 Spring 容器内的 bean,只要该 bean 实现了 EnvironmentAware 接口,并且进行重写了 setEnvironment 方法的情况下,那么在工程启动时就可以获取得 application.properties 的配置文件配置的属性值,这样就不用我们将魔法值写到代码里面了。

2.5 EmbeddedValueResolverAware

在这里插入图片描述
EmbeddedValueResolverAware 接口为开发者提供了一种获取EmbeddedValueResolver对象的机会,该对象可用于解析占位符表达式。通过实现该接口,Bean 可以在初始化阶段获取解析占位符的能力,从而更灵活地处理一些与动态属性值相关的逻辑。

2.6 ResourceLoaderAware

在这里插入图片描述
ResourceLoaderAware 是特殊的标记接口,它希望拥有一个 ResourceLoader 引用的对象。当实现了 ResourceLoaderAware 接口的类部署到 application context (比如受 Spring 管理的 bean) 中时,它会被 application context 识别为 ResourceLoaderAware。 接着 application context 会调用 setResourceLoader (ResourceLoader) 方法,并把自身作为参数传入该方法 (记住,所有 Spring 里的 application context 都实现了 ResourceLoader 接口)。

既然 ApplicationContext 就是 ResourceLoader,那么该 bean 就可以实现 ApplicationContextAware 接口并直接使用所提供的 application context 来载入资源,但是通常更适合使用特定的满足所有需要的 ResourceLoader 实现。 这样一来,代码只需要依赖于可以看作辅助接口的资源载入接口,而不用依赖于整个 Spring ApplicationContext 接口。

2.7 ApplicationEventPublisherAware

在这里插入图片描述
ApplicationEventPublisherAware 接口是一个回调接口,它提供了一个用于设置 Bean 所在的ApplicationEventPublisher 的方法。当一个 Bean 实现了 ApplicationEventPublisherAware 接口时,在该 Bean 实例被实例化后,Spring 容器会调用 setApplicationEventPublisher 方法,并将该 Bean 所在的ApplicationEventPublisher 作为参数传递进去。主要用于获取发布事件的 ApplicationEventPublisher,使得 Bean 能够在运行时发布自定义的事件。

2.8 MessageSourceAware

在这里插入图片描述
MessageSourceAware 接口是 Spring 提供的一个用于访问消息资源(例如文本消息)的接口。国际化的主要目标是使应用程序的用户界面能够根据用户的首选语言或地区显示相应的消息。

2.9 ApplicationContextAware

在这里插入图片描述
ApplicationContextAware 的作用是可以方便获取 Spring 容器 ApplicationContext,从而可以获取容器内的 Bean。ApplicationContextAware 接口只有一个方法,如果实现了这个方法,那么 Spring 创建这个实现类的时候就会自动执行这个方法,把 ApplicationContext 注入到这个类中,也就是说,spring 在启动的时候就需要实例化这个 class(如果是懒加载就是你需要用到的时候实例化),在实例化这个 class 的时候,发现它包含这个 ApplicationContextAware 接口的话,sping 就会调用这个对象的 setApplicationContext 方法,把 applicationContext Set 进去了。

http://www.dtcms.com/a/35370.html

相关文章:

  • 一周热点:马斯克让OpenAI变的更加具有变数
  • 牛客周赛 Round 82(思维、差分、树状数组、大根堆、前后缀、递归)
  • 【Linux知识】Linux上从源码编译到软件安装全过程详细说明
  • 1. EXCEL基础、界面介绍《AI赋能Excel 》
  • 基于TensorFlow.js与Web Worker的智能证件照生成方案
  • C++对象模型之C++额外成本
  • 姜雷从萨满非物质文化传承者到跨界融合的成长历程
  • 51单片机编程学习笔记——点亮LED
  • 初阶数据结构(C语言实现)——1数据结构前言
  • LeetCode刷题零碎知识点整理
  • 2024/2/23 考试
  • js中的await与async的使用
  • react使用拖拽,缩放组件,采用react-rnd解决
  • instanceof和typeof的区别【JavaScript常见面试题】
  • 跨境宠物摄像头是一种专为宠物主人设计的智能设备
  • OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()
  • 【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台
  • P5304 [GXOI/GZOI2019] 旅行者
  • 嵌入式项目:STM32刷卡指纹智能门禁系统
  • ShardingSphere--02--数据分片
  • 基于嵌入式linux的数据库:SQLite
  • 分片机制如何理解?
  • Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
  • 统计学中的得分函数(Score Function)是什么?它和Fisher信息矩阵有什么关系?
  • Golang笔记——Interface类型
  • JavaScript获取DOM元素语法总结(getElementsByName()、querySelector()、querySelectorAll())
  • 网络安全漏洞管理要求 网络安全产品漏洞
  • OC高级编程之GCD
  • C语言数据结构—二叉树的链式结构实现
  • 【ECMAScript6】