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

Aware接口作用

介绍

Aware(感知)接口是一个标记,里面没有任何方法,实际方法定义都是子接口确定(相当于定义了一套规则,并建议子接口中应该只有一个无返回值的方法)。

我们知道spring已经定义好了很多对象,如ApplicationContext、BeanFactory、Environment等,但是这些对象是spring框架自身的,我们去获取这些是及其困难的,所以spring定义了一套规则能让我们很容易得获取框架中的对象,这就是Aware的意义,现在对Aware有一定了解了吧,Aware是感知spring容器中的对象。

spring定义了很多子接口并已实现可直接可用,下图均为spring中的子接口。
在这里插入图片描述
如图第一个ApplicationContextAware,类名很清晰的告诉我们是感知ApplicationContext,ApplicationContext都知道是spring容器,所以这里表示感知容器,就是我们想获取ApplicationContext只需要实现这个接口就行。

注意
这里的接口名都是有规则的,如ApplicationContextAware就是获取ApplicationContext的,BeanFactoryAware就是获取BeanFactory的,见名知意。

源码

public interface ApplicationContextAware extends Aware {/*** 只有一个方法,实现这方法spring在启动过程中会默认将* 调用此方法并将ApplicationContext参数传递过来,这样* 我们就能很容易的获取到ApplicationContext了*/void setApplicationContext(ApplicationContext applicationContext) throws BeansException;}

例子

Teacher类并实现ApplicationContextAware 接口

package com.lp.entity;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class Teacher implements ApplicationContextAware {private String name;private ApplicationContext applicationContext;public ApplicationContext getApplicationContext() {return applicationContext;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +'}';}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext =applicationContext;}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.lp"/><bean id="teacher" class="com.lp.entity.Teacher"><property name="name" value="zhangsan"/></bean>
</beans>

测试,看一看Teacher类中能不能获取到ApplicationContext对象

package example.lp;import com.lp.entity.Teacher;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");Teacher teacher = (Teacher)context.getBean("teacher");System.out.println("------------ApplicationContext="+teacher.getApplicationContext());}
}

在这里插入图片描述
从结果中可以清晰的看到已经获取到了ApplicationContext对象,当我们需要其他对象也可以看看其他Aware子接口,直接实现即可。

自定义Aware接口(简单看一下)

spring中有一个ApplicationContextAwareProcessor类,里面就是实现这些子接口功能的,invokeAwareInterfaces方法就是具体逻辑。

class ApplicationContextAwareProcessor implements BeanPostProcessor {private final ConfigurableApplicationContext applicationContext;private final StringValueResolver embeddedValueResolver;/*** Create a new ApplicationContextAwareProcessor for the given context.*/public ApplicationContextAwareProcessor(ConfigurableApplicationContext applicationContext) {this.applicationContext = applicationContext;this.embeddedValueResolver = new EmbeddedValueResolver(applicationContext.getBeanFactory());}@Override@Nullablepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof Aware) {invokeAwareInterfaces(bean);}return bean;}private void invokeAwareInterfaces(Object bean) {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);}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());}if (bean instanceof ApplicationContextAware applicationContextAware) {applicationContextAware.setApplicationContext(this.applicationContext);}}}

自己实现Aware接口

这个需要了解一下spring启动过程,跟BeanPostProcessor这个接口有关,也需要了解BeanPostProcessor的执行时机,这里我就不介绍了,我自己写了一个示例,这里只是展示怎么实现Aware的。

package com.lp.entity;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;public class Teacher implements ApplicationContextAware {private String name;private ApplicationContext applicationContext;public ApplicationContext getApplicationContext() {return applicationContext;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +'}';}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext =applicationContext;}
}
package com.lp.entity;import com.lp.TeacherAware;public class Student implements TeacherAware {private String name;private Teacher teacher;public Teacher getTeacher() {return teacher;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void setTeacher(Teacher teacher) {this.teacher =teacher;}
}
package com.lp;import com.lp.entity.Teacher;
import org.springframework.beans.factory.Aware;public interface TeacherAware extends Aware {void setTeacher(Teacher teacher);
}
package com.lp;import com.lp.entity.Teacher;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;@Component
public class TeacherAwareBeanPostProcessor implements BeanPostProcessor {private final ConfigurableApplicationContext applicationContext;@Autowiredpublic TeacherAwareBeanPostProcessor(ConfigurableApplicationContext applicationContext) {this.applicationContext = applicationContext;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof TeacherAware teacherAware){teacherAware.setTeacher(applicationContext.getBean(Teacher.class));}return bean;}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.lp"/><bean id="teacher" class="com.lp.entity.Teacher"><property name="name" value="zhangsan"/></bean><bean id="student" class="com.lp.entity.Student"><property name="name" value="lisi"/></bean></beans>
package example.lp;import com.lp.entity.Student;
import com.lp.entity.Teacher;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//Teacher teacher = (Teacher)context.getBean("teacher");//System.out.println("------------ApplicationContext="+teacher.getApplicationContext());Student student = (Student)context.getBean("student");System.out.println("------------Teacher="+student.getTeacher());}
}

从上述代码和结果中可以看到,我创建了两个bean,一个Student和一个Teacher,我用Aware方式实现了将Student中的Teacher属性注入,当然这个场景可能不是很合适,但这里主要是演示怎么自己实现Aware接口,需要自己写一个接口实现Aware接口并之定义一个方法(接口名最好是遵循spring规则,且只有一个void方法),创建一个实现BeanPostProcessor的对象并写出具体实现逻辑,这儿需要你了解spring启动流程并且知道BeanPostProcessor接口的作用。

希望对你有帮助,别忘了点赞!!

相关文章:

Aware接口作用

介绍 Aware&#xff08;感知&#xff09;接口是一个标记&#xff0c;里面没有任何方法,实际方法定义都是子接口确定&#xff08;相当于定义了一套规则&#xff0c;并建议子接口中应该只有一个无返回值的方法&#xff09;。 我们知道spring已经定义好了很多对象&#xff0c;如…...

Docker部署Minio S3第三方存储

Docker部署Minio S3第三方存储 你不要着急&#xff0c;你先去读你的书&#xff0c;我去看我的电影&#xff0c;总有一天&#xff0c;我们会窝在一起&#xff0c;读同一本书&#xff0c;看同一部电影。 安装Docker 1、选择要安装的平台 Docker要求CentOS系统的内核版本高于3.1…...

听说京东618裁员没?上午还在赶需求,下午就开会通知被裁了~

文末还有最新面经共享群&#xff0c;没准能让你刷到意向公司的面试真题呢。 京东也要向市场输送人才了? 在群里看到不少群友转发京东裁员相关的内容&#xff1a; 我特地去网上搜索了相关资料&#xff0c;看看网友的分享&#xff1a; 想不到马上就618了&#xff0c;东哥竟然抢…...

力扣226. 翻转二叉树(DFS的两种思路)

Problem: 226. 翻转二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 涉及二叉树的递归解法时往往需要考虑两种思路&#xff1a; 1.在递归遍历时执行题目需要的具体要求&#xff1b; 2.将一个大问题分解为多个小子问题 具体到本体&#xff1a; 思路1&#xff1a;遍历 先…...

状态机-非重叠的序列检测

描述 设计一个状态机&#xff0c;用来检测序列 10111&#xff0c;要求&#xff1a; 1、进行非重叠检测 即101110111 只会被检测通过一次 2、寄存器输出且同步输出结果 注意rst为低电平复位 信号示意图&#xff1a; 波形示意图&#xff1a; 输入描述 输入信号 clk rst data…...

Word怎么画图?这5个方法收藏好!

“我需要在Word文档中画一些图&#xff0c;想问下Word应该怎么画图呢&#xff1f;有没有朋友可以帮我看看怎么操作呢&#xff1f;” 在今天的数字化时代&#xff0c;信息爆炸式增长&#xff0c;人们越来越需要高效、直观地传递和接收信息。而Word画图功能正是这一需求的完美体现…...

qt designer 依赖库 QMessageBox

目录 qt designer 依赖库配置实例 单步调试快捷键 f10 QMessageBox 使用方法 背景图设置...

反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class&#xff0c;这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到…...

PHP身份证真伪验证、身份证二、三要素核验、身份证ocr接口

实名认证有利于网络绿化&#xff0c;所以在互联网发展迅速的今天&#xff0c;实名认证成了“刚需”。而OCR与实名认证两种产品的结和更是擦出了美丽的火花。翔云人工智能开放平台提供的实名认证OCR接口良好的展现出两种功能结合的效果。以身份实名认证产品举例来说&#xff0c;…...

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 表单布局Form Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 表单布局Form Layout 文章编号&#xff1a…...

数智赋能内涝治理,四信城市排水防涝解决方案保障城市安全运行

由强降雨、台风造成城市低洼处出现大量积水、内涝的情况时有发生&#xff0c;给人们出行带来了极大不便和安全隐患&#xff0c;甚至危及群众生命财产安全。 为降低内涝造成的损失&#xff0c;一方面我们要大力加强城市排水基础设施的建设&#xff1b;另一方面要全面掌握城市内涝…...

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步&#xff08;Master-Slave Replication&#xff09;是一种常用的解决方案&#xff0c;它允许一个主服…...

LTD275次升级 | 网页编辑器新增AI翻译 • 文章|产品等内容可导出 • 新增交互数据 • 购物清单可导出• 官微中心app出新版

1、 网站编辑器文本组件可一键翻译&#xff1b; 2、 文章、产品新增导出功能&#xff1b; 3、 购物车新增导出购物清单功能&#xff1b; 4、 App优化首页数据展示、新增访客交互数据功能&#xff1b; 5、 已知问题修复与优化&#xff1b; 01 网站编辑器 新增文本组件一键翻…...

代码随想录算法训练营第36期DAY36

贪心好难&#xff0c;希望能坚持到柳暗花明那天。 DAY36 1005K次取反后最大化的数组和 自己的方法&#xff0c;注意越界条件放在最前面就好&#xff1a; class Solution {public: int largestSumAfterKNegations(vector<int>& nums, int k) { //自己的…...

zookeeper安装教程

前置环境&#xff1a; hadoop3.3.6 三台集群 CentOS7 (图文并茂)基于CentOS-7搭建hadoop3.3.6大数据集群-CSDN博客 1.下载并上传 下载并上传ZOOKEEPER安装包到主节点 官网下载地址 Index of /dist/zookeeper (apache.org) 切换到/opt/bigdata目录&#xff08;根据自己的情况…...

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中&#xff0c;Windows 2008系统以其卓越的稳定性和可靠性&#xff0c;赢得了众多企业和个人的青睐。然而&#xff0c;随着网络安全问题的日益严峻&#xff0c;如何确保远程桌面连接的安全&#xff0c;成为了摆在我们面前的一道难题。今天&#xff0c;我将为…...

【计算机网络原理】对传输层TCP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...

mysql实战——半同步复制搭建

一、搭建前准备 主库 192.168.1.78 从库 192.168.1.76 二、搭建 1、先搭建异步复制 MySQL实战——主从异步复制搭建&#xff08;一主一从&#xff09;-CSDN博客 2、在异步的基础上搭建半同步复制 主库 mysql>install plugin rpl_semi_sync_slave soname semisy…...

Leetcode 3152. Special Array II

Leetcode 3152. Special Array II 1. 解题思路2. 代码实现 题目链接&#xff1a;3152. Special Array II 1. 解题思路 这一题的话思路上就是分堆&#xff0c;使用贪婪算法找到每一个元素所在的最长special子序列&#xff0c;然后判断query的首尾元素是不是属于同一个special…...

人工智能与区块链技术:开启未来科技的双引擎

在当今科技飞速发展的时代&#xff0c;人工智能和区块链技术如同两颗璀璨的明星&#xff0c;照亮了人类通往未来的道路。 人工智能&#xff0c;以其强大的学习和分析能力&#xff0c;正悄然改变着我们的生活。它能够处理海量的数据&#xff0c;为我们提供精准的预测和个性化的…...

Python筑基之旅-MySQL数据库(二)

目录 一、第三方库 1、mysql-connector-python 1-1、由来 1-2、优缺点 1-2-1、优点 1-2-1-1、官方支持 1-2-1-2、纯Python实现 1-2-1-3、全面支持 1-2-1-4、兼容性 1-2-1-5、易于使用 1-2-2、缺点 1-2-2-1、性能 1-2-2-2、安装 1-2-2-3、社区支持 1-2-2-4、扩…...

web前端面试题

web前端面试题 1、前端如何实现优化性能 (1)减少网络时间 ①使用DNS缓存技术 ​ ②减少需要传输的文件尺寸 ​ ③加快文件传输速度 (2)减少发送的请求数量 ①利用浏览器缓存 ​ ②使用合并的图片文件 (3)提高浏览器下载的并发度 ①JS文件放在HTML文档最后 ​ ②使用多个域名 (…...

创建型模式之单例

文章目录 概述定义场景小结 概述 设计模式包括创建型模式&#xff0c;结构型模式&#xff0c;行为型模式。 今天先看看创建型模式&#xff0c;而单例是创建型模式中的第一个而且是常用的&#xff0c;就从它开始吧。 定义 单例模式用来创建全局唯一的对象。一个类只允许创建一…...

在 Next.js 应用中创建ContactForm表单提交

在 Next.js 应用中创建表单提交涉及几个关键步骤&#xff0c;包括设置表单、处理表单提交以及管理服务器端或 API 逻辑。以下是使用 Next.js 开发一个简单表单提交的步骤。 1. 设置表单组件 首先&#xff0c;创建一个表单组件。在这个例子中&#xff0c;我们将创建一个 Conta…...

HTML5 3D图像应用

目录 关键技术与规范应用示例与领域相关工具与框架HTML5 3D图像应用是利用HTML5、CSS3、JavaScript(及其相关的库和框架)以及其他现代Web技术(如WebGL)构建的,能够在浏览器中呈现三维图形、动画和交互式场景的应用程序。以下是一些关于HTML5 3D图像应用的关键点和示例: …...

SQL——DML对表中数据的操作

# 创建数据库 create database if not exists db_BigData default character set gb2312 default collate gb2312_chinese_ci; # 创建表 create table if not exists db_BigData.stu (id int auto_increment primary key comment 主键ID,name var…...

深度学习之基于Matlab卷积神经网络(CNN)手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是计算机视觉领域的一个重要问题&#xff0c;也是深度学习应用的一个典型场景。卷…...

工业4.0 企业级云MES全套源码,支持app、小程序、H5、台后管理端

工业4.0 企业级云MES全套源码&#xff0c;支持app、小程序、H5、台后管理端 采用javaspringboot-vue.jsuniapp开发 随着工业4.0的快速发展&#xff0c;制造执行系统&#xff08;MES&#xff09;成为了智能制造的核心。今天&#xff0c;将为大家介绍一款开源的MES系统——MES管…...

Science| 单体耦合纤维实现无芯片纺织电子(纤维器件/智能织物/柔性可穿戴电子)

东华大学Hongzhi Wang,Chengyi Hou和Qinghong Zhang团队在《Science》上发布了一篇题为“Single body-coupled fiber enables chipless textile electronics”的论文。论文内容如下: 一、 摘要 智能纺织品为将技术融入日常生活中提供了理想的平台。然而,目前的纺织电子系统…...

前端面试项目细节重难点(已工作|做分享)

面试官提问&#xff1a;需求场景&#xff1a;页面上有一个单选框&#xff0c;有是否两个选项&#xff1a;当用户选择是&#xff0c;出现一个输入框&#xff0c;用户可以输入内容&#xff0c;给后端的保存接口传入参数radio和content这两个字段&#xff0c;值分别是用户选项和输…...