Bean的Aware接口

news2024/11/27 2:31:27

Aware 简介

Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源。比如BeanNameAware之类的以Aware结尾的接口,这个接口获取的资源就是以BeanName相关的。
通过Aware接口,可以对Spring相应资源进行操作(一定要慎重,因为获取的资源可能是IOC的核心资源)。
为对Spring进行简单的扩展提供了方便的接口。

ApplicationContextAware会向实现了这个接口的Bean提供ApplicationContext,也就是IOC容器的上下文的信息。当然,实现了这个接口的Bean必须配置到bean的配置文件中去,并且由Spring的Bean容器去加载,这样才能实现这样的效果。
BeanNameAware类似,它会提供一个关于BeanName定义的这样一些内容。
 

例子 Spring中各个Aware接口,以及这些接口的主要应用场景。

1. ApplicationContextAware

ApplicationContextAware接口可以让Bean获取到ApplicationContext对象,通过这个对象,我们可以获取Spring容器中的其他Bean实例或一些组件。常见的应用场景包括:

  •     在Web项目中获取ServletContext
  •     获取国际化信息
  •     获取Scheduler等定时任务

示例代码:

public class MyBean implements ApplicationContextAware {
    private ApplicationContext applicationContext;
 
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
 
    public void doSomething() {
        // 获取其他的Bean实例或其他的组件
        OtherBean otherBean = applicationContext.getBean("otherBean", OtherBean.class);
        // ...
    }
}
 

2. BeanFactoryAware

BeanFactoryAware接口可以让Bean获取到BeanFactory对象,通过这个对象,我们可以获取Spring容器中的Bean实例或一些组件。常见的应用场景包括:

  • 获取Spring容器中的Bean实例
  • 手动注册BeanDefinition

示例代码:

public class MyBean implements BeanFactoryAware {
    private BeanFactory beanFactory;
 
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
 
    public void doSomething() {
        // 获取其他的Bean实例或其他的组件
        OtherBean otherBean = beanFactory.getBean("otherBean", OtherBean.class);
        // ...
    }
}

3. MessageSourceAware

MessageSourceAware接口可以让Bean获取到MessageSource对象,通过这个对象,我们可以方便地进行国际化操作。常见的应用场景包括:

        获取国际化信息

public class MyBean implements MessageSourceAware {
    private MessageSource messageSource;
 
    @Override
    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
 
    public void doSomething() {
        // 获取国际化信息
        String message = messageSource.getMessage("key", null, Locale.getDefault());
        // ...
    }
}
 

等等

在使用Aware接口时,需要注意避免循环依赖和过度依赖的问题。另外,Aware接口的实现可以通过XML、注解或编程方式来实现

源码解析

我们先了解什么是BeanPostProcessor,是在创建Bean之前以及创建Bean之后的一种后置处理器,这里就简单的讲一下这个,就是在我们使用的这些注解,例如:@Async (异步执行),@Bean,@Component、@Autowired、@PropertySource等等都需要经过BeanPostProcessor去处理才能加载到容器当中,
 

先看一个示例:

 不仅仅有BeanPostProcessor还有BeanDefinitionRegistryPostProcessor(Bean注册器后置处理器)、BeanFactoryPostProcessor(BeanFactory后置处理器),

在处理Aware实现类的时候就会有对应的一个AwareProcessor去处理,我们拿ApplicationContextAware做示例:

我们找到对应的后置处理器ApplicationContextAwareProcessor

因为BeanPostProcessor有两个接口实现,但是只对处理前做内置对象赋值,将对应的对象暴露给我们
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/844430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以产品经理的角度去讲解原型图---会议OA项目

目录 一.前言 二.原型图 2.1 原型图是什么 3.1 原型图的作用 三.演示讲解 3.1 项目背景 3.2 项目介绍 3.2.1 会议管理(会议的发起,通知) 3.2.2 投票管理(会议的流程重大决策记录) 3.2.3 会议室管理 3.2.4 系统管…

SDXL-Stable Diffusion改进版

文章目录 1. 摘要2. 算法:2.1 结构:2.2 微小的条件机制2.3 多宽高比训练2.4 改进自编码器2.5 所有组合放到一起2.6 主流方案比较 3. 未来工作4. 限制 论文: 《SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis…

HCL MPLS L2VPN BGP lsp

目录 1 拓扑 2 配置步骤 2.1 配置接口IP 和路由协议 2.2 配置MPLS LDP 2.3 配置L2VPN PW(BGP) 2.4 验证L2VPN 使用EVE-NG 中 的H3C 镜像,配置bgp 后,OSPF 会失效,可能镜像有问题,使用HCL没有问题。 1 拓扑 2 配置步骤 2.1…

【Axure动态面板】利用动态面板实现树形菜单的制作

利用动态面板,简单制作高保真的树形菜单。 一、先看效果 https://1poppu.axshare.com 二、实现思路 1、菜单无非就是收缩和展开,动态面板有个非常好的属性:fit to content,这个属性的含义是:面板的大小可以根据内容多少…

vue3-ts-vite:vue 项目 配置 多页面应用

一、Vue项目,什么是多页面应用 Vue是一种单页面应用程序(SPA)框架,这意味着Vue应用程序通常只有一个HTML页面,而在该页面上进行动态的内容更改,而不是每次都加载新的HTML页面。 但是,有时候我…

C++动态内存管理 - new和delete

目录 开胃菜 - 浅析C/C的内存分段 内存分段 各段说明 new和delete的基础用法 深度剖析new 定位new 浅析delete malloc/free和new/delete的异同 开胃菜 - 浅析C/C的内存分段 这部分是计算机系统相关的知识,这里只是先浅谈一下,可能有些内容会有冲…

初学绘画就上手!7款AI绘图免费软件精选推荐!

本篇文章将分享7款个人非常喜爱的AI绘图免费软件,一起来看看吧。 即时灵感 即时灵感 " 是一款全新升级的 AI 绘画工具,为创作者们提供了丰富多样的创作体验和强大功能。这个创新工具旨在让创作过程更加简单、便捷,同时提供高质量的作品…

Jenkins+Nginx+vue

安装nodejs 在这里插入图片描述 echo off xcopy C:\ProgramData\Jenkins\.jenkins\workspace\super_manage_vue\dist F:\java\www\super_manage_vue\ /s /e /y echo 复制文件完成 exit安装niginx 配置文件如下 #user nobody; worker_processes 1;#error_log logs/error.lo…

反射调用private方法的坑

使用反射调用私有方法时,发现空指针异常,无法直接注入导致空指针异常 加入如下代码后,恢复正常 if (AopUtils.isCglibProxy(marketSmsTaskService)) {// 如果是cglib代理对象,则转为原始对象marketSmsTaskService (MarketSmsTas…

与身边的人有差距,我选择只跟自己比并发展自己的长处!

文章目录 方向一:简述自己的感受方向二:聊聊你想怎么做方向三:如何调整自己的心态 虽然清楚知识需要靠时间沉淀,但在看到自己做不出来的题别人会做,自己写不出的代码别人会写时还是会感到焦虑怎么办? 你是…

链表OJ题

题目一:206反转链表 题目要求: 思路分析: 代码实现: struct ListNode* reverseList(struct ListNode* head){ //n1,n2反转指针 n3链接下一个结点的指针struct ListNode* n1,*n2,*n3;n1 NULL;n2 head;if(n2)//有可能head本身…

CentOS7 启动谷歌浏览器 java+Selenium+chrome+chromedriver

前言:自己想使用该技术实现自动化抓取音乐,目前在window上运行成功,需要在Linux Centos服务上跑,配置上出现了许多问题,特此记录。 参考文档:CentOS7 安装Seleniumchromechromedriverjava_远方丿的博客-CSD…

PLC拉格朗日插值(SCL、ST计算源代码)

插值是对函数进行近似的基本方法,这篇博客主要介绍常用的拉格朗日插值法, Lagrange插值法不太清楚的同学,可以看看数值计算和分析类书籍,网上有很多C语言的拉格朗日插值算法,这里我们主要给出在PLC里利用ST,SCL语言完成拉格朗日插值计算。 1、拉格朗日插值FC 插值法可以…

TSINGSEE青犀视频安防监控视频平台加密机的详细使用与操作步骤

我们在此前的文章中介绍过不少TSINGSEE青犀视频安防监控视频平台关于加密机授权操作及相关疑问解答,感兴趣的用户可以翻阅往期的文章进行了解。由于新用户咨询该方面的问题较多,今天我们再来介绍一下操作步骤。 注意:加密机是依据IP授权&…

第三章-运输层

运输层服务 运输层协议为运行在不同主机上的进程之间提供逻辑通信,即从应用程序角度看两个主机好像直连一样,实际可能相隔万里运输层协议是在端系统上实现的,而不是路由器,为什么这么强调,因为运输层会将应用报文划分…

ctfshow web93-98

web93 打开环境是一个代码审计题目 简单分析就是输入一个变量num,其值不能等于4476与包含字母,但是他的值需要为4476 函数intval作用为获取变量的整数值,第二个参数的意思是进制,默认为10进制。题目参数为0,就根据变…

【数据结构与算法】力扣:完全二叉树的节点个数+平衡二叉树

完全二叉树的节点个数 给你一棵完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最…

本地搭建web服务器、个人博客并发布公网访问

文章目录 前言1. 安装套件软件2. 创建网页运行环境 指定网页输出的端口号3. 让WordPress在所需环境中安装并运行 生成网页4. “装修”个人网站5. 将位于本地电脑上的网页发布到公共互联网上 前言 在现代社会,网络已经成为我们生活离不开的必需品,而纷繁…

YOLOv5项目调试与实战

拥有青春的时候 你就要感受它 不要浪费你的黄金时代 把宝贵的内在生命活出来 什么都别错过 一、项目介绍与环境配置 github地址 选择5.0版本的tag,并下载源码 使用Pycharm打开代码 选择解释器,我选择的是之前conda创建的pytorch环境 安装项目所需要用到…

map 比较(两个map的key,value 是否一样)

1. 用equals 比较 public static void main(String[] args) {List<Map<String,Object>> list new ArrayList<>();Map<String,Object> map1 new HashMap<>();map1.put("name","郭");map1.put("objId","1&quo…