前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring Aware机制

Spring Aware机制

作者头像
李鸿坤
发布于 2020-07-18 10:39:24
发布于 2020-07-18 10:39:24
1K00
代码可运行
举报
文章被收录于专栏:泛泛聊后端泛泛聊后端
运行总次数:0
代码可运行

在使用Spring的过程中比较好的设计是bean不依赖于容器。在一些特殊的情况下需要感知容器的存在,使用容器的提供的资源。Spring IoC容器提供了Aware机制。

Aware机制的作用

Aware:意识,发现的意思。它的作用即是让bean感知到容器的资源。早年版本的Spring容器如果需要ApplicationContext则经常使用如下代码去先存储其引用,在容器初始化后手动调用setApplicationContext把引用set进去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ApplicationContextHolder {
    private static ApplicationContext applicationContext = null;
    public static void setApplicationContext(ApplicationContext applicationContext) {        ApplicationContextHolder.applicationContext = applicationContext;    }
    public static ApplicationContext getApplicationContext() {        return applicationContext;    }}

如果是web场景下使用ContextLoaderListener来默认初始化容器,取得就有点困难。如果使用Spring的Aware机制则无需自己手动去获得容器的资源,而是Spring容器初始化bean后对其进行注入。上述例子可以修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Componentpublic class ApplicationContextHolder implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }
    public ApplicationContext getApplicationContext() {        return applicationContext;    }}

ApplicationContextHolder的applicationContext不再是一个静态字段。当然并不希望到处去使用ApplicationContextHolder而是需要使用到ApplicationContext的时候bean自己去ApplicationContextAware。

其它Aware接口

除了ApplicationContextAware,Spring容器还默认提供了一些常用的容器相关对象发现接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AwareBean implements ApplicationContextAware,         ApplicationEventPublisherAware,         BeanClassLoaderAware,         BeanFactoryAware,         MessageSourceAware,         BeanNameAware {

    @Override    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {    // 获得ApplicationEventPublisher,    // 可使用来发布Spring容器事件    }
    @Override    public void setBeanClassLoader(ClassLoader classLoader) {    // 动态bean初始化的时候使用和Spring容器一样的ClassLoader    }
    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {    // 获得 BeanFactory    }
    @Override    public void setBeanName(String beanName) {    // 获得当前bean的名称    }
    @Override    public void setMessageSource(MessageSource messageSource) {    // i18n和一些配置参数解析    }
    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    // 获得 ApplicationContext    }}
小结

Spring容器提供了Aware机制,使Bean能够感知到容器的资源。此功能虽然是比较方便,但是使得Bean依赖于容器的API,这违背了依赖反转的初衷。因此,只有在一些需要对容器进行动态编程的基础bean才建议使用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 泛泛聊后端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring - ApplicationContextAwareProcessor扩展接口
ApplicationContextAwareProcessor 本身并没有扩展点,但是该类内部却有6个扩展点可供实现 ,这些类触发的时机在bean实例化之后,初始化之前.
小小工匠
2022/12/05
5480
Spring - ApplicationContextAwareProcessor扩展接口
手写Spring,定义标记类型Aware接口,实现感知容器对象
大佬的代码,就像 “赖蛤蟆泡青蛙,张的丑玩的花” :一个类实现了多个接口、继承的类又继承了其他类、接口还可以和接口继承、实现接口的抽象类再由类实现抽象类方法、类A继承的类B实现了类A实现的接口C,等等。
小傅哥
2021/06/29
6970
手写Spring,定义标记类型Aware接口,实现感知容器对象
Spring扩展点之Aware接口族
Spring中提供了各种Aware接口,方便从上下文中获取当前的运行环境,比较常见的几个子接口有:BeanFactoryAware,BeanNameAware,ApplicationContextAware,EnvironmentAware,BeanClassLoaderAware等
Java学习录
2019/09/17
5270
Spring之Aware接口
冬天vs不冷
2025/01/21
660
spring之aware接口
实现org.springframework.beans.factory.aware子接口的Bean类在创建时会在调用该bean的init方法之前调用aware子接口的相应方法,举几个类来说明下:
johnhuster的分享
2022/03/28
2190
ApplicationContextAware 的 setApplicationContext() 方法执行逻辑全解析
org.springframework.context.ApplicationContextAware#setApplicationContext
一个会写诗的程序员
2021/03/18
3.6K1
ApplicationContextAware 的 setApplicationContext() 方法执行逻辑全解析
15个Spring扩展点,一般人知道的不超过5个!
Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。
田维常
2022/11/25
2.3K0
15个Spring扩展点,一般人知道的不超过5个!
《Spring 手撸专栏》第 9 章:虎行有雨,定义标记类型Aware接口,实现感知容器对象
大佬的代码,就像“赖蛤蟆泡青蛙,长的丑玩的花”:一个类实现了多个接口、继承的类又继承了其他类、接口还可以和接口继承、实现接口的抽象类再由类实现抽象类方法、类A继承的类B实现了类A实现的接口C,等等。
小傅哥
2021/07/23
3240
Spring - BeanFactoryAware扩展接口
扩展点方法为setBeanFactory,可以拿到BeanFactory这个属性。
小小工匠
2022/12/05
4890
Spring - BeanFactoryAware扩展接口
Spring系列五:Bean 的生命周期
在本章中,我们学习Spring bean的生命周期。掌握bean生命周期的各个阶段,初始化和销毁回调方法。我们将学习使用XML配置和注释配置来控制bean生命周期事件。
java干货
2021/02/19
3200
Spring系列五:Bean 的生命周期
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
codetrend
2024/08/03
1430
Spring中的Aware解析
简介 Spring框架中提供了许多实现了Aware接口的类,这些类主要是为了辅助Spring访问容器中的数据,比如BeanNameAware,这个类能够在Spring容器加载的过程中将Bean的名字(id)赋值给变量。 常用的Aware BeanNameAware:能够获取bean的名称,即是id BeanFactoryAware:获取BeanFactory实例 ApplicationContextAware:获取ApplicationContext MessageSourceAware:获取Message
爱撒谎的男孩
2019/12/30
1K0
如何记忆 Spring Bean 的生命周期
“请你描述下 Spring Bean 的生命周期?”,这是面试官考察 Spring 的常用问题,可见是 Spring 中很重要的知识点。
草捏子
2020/08/10
7410
如何记忆 Spring Bean 的生命周期
Spring Aware 接口
有些时候,在 Bean 的初始化中,需要使用 Spring 框架自身的对象来执行一些操作,比如获取 ServletContext 的一些参数,获取 ApplicaitionContext 中的 BeanDefinition 的名字,获取 Bean 在容器中的名字等等。为了让 Bean 可以获取到框架自身的一些对象,Spring 提供了一组以 Aware 为结尾的接口。
happyJared
2019/10/08
4960
Spring5源码学习(3)refresh 方法
接上回 Spring5源码学习(2) ,分析完register(annotatedClasses);后,现在来看一下refresh();方法。
Coder小黑
2019/12/18
6580
Spring5源码学习(3)refresh 方法
被隔离了,聊一聊春(Spring)的生命周期
今天我们来分享一下Spring Bean的生命周期,Spring Bean的生命周期对于我们掌握Spring来说是很关键的,理解了Spring的生命周期,那么我们在开发的时候才能更好的利用Spring的功能,从而达到我们的目的!
小四的技术之旅
2022/07/26
3680
被隔离了,聊一聊春(Spring)的生命周期
如何让 Bean 深度感知 Spring 容器
TienChin 视频杀青啦~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。
江南一点雨
2023/11/05
2210
如何让 Bean 深度感知 Spring 容器
Spring Aware容器感知技术
Spring Aware是什么 Spring提供Aware接口能让Bean感知Spring容器的存在,即让Bean可以使用Spring容器所提供的资源。 Spring Aware的分类 几种常用的Aware接口如下。 Aware接口说明ApplicationContextAware能获取Application Context调用容器的服务ApplicationEventPublisherAware应用事件发布器,可以用来发布事件BeanClassLoaderAware能获取加载当前Bean的类加载器Be
Java技术栈
2018/03/30
1.2K0
Spring Aware容器感知技术
Spring复杂的BeanFactory继承体系该如何理解? ----中
本系列重点不在于对源码的讲解,而在于让大家认识到spring为什么这样设计,重在思想的传递
大忽悠爱学习
2022/05/10
3240
Spring复杂的BeanFactory继承体系该如何理解? ----中
Spring之Aware接口介绍
  在Bean对象的生命周期的方法中有好几个接口是Aware接口的子接口,所以弄清楚Aware接口对于理解Spring框架还是很有帮助的。
用户4919348
2019/04/02
5.2K0
Spring之Aware接口介绍
相关推荐
Spring - ApplicationContextAwareProcessor扩展接口
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验