Spring中的Aware接口及应用场景 spring aware接口作用
lipiwang 2024-10-31 15:24 21 浏览 0 评论
Aware接口是Spring Framework中提供的一组标记接口,用于在Bean装配的过程中获取Spring容器中提供的一些核心组件或运行时上下文等信息。通过使用Aware接口,我们可以在Bean实例化和初始化过程中获取到Spring容器中其他组件,方便Bean类实现更复杂的业务逻辑。
本文将会一一介绍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());
// ...
}
}
复制代码
4. ResourceLoaderAware
ResourceLoaderAware接口可以让Bean获取到ResourceLoader对象,通过这个对象,我们可以方便地进行资源加载操作。常见的应用场景包括:
- 加载配置文件
- 加载图片等静态资源
示例代码:
public class MyBean implements ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
public void doSomething() {
// 加载配置文件
Resource resource = resourceLoader.getResource("classpath:config.xml");
// ...
}
}
复制代码
5. ServletContextAware
ServletContextAware接口可以让Bean获取到ServletContext对象,通过这个对象,我们可以方便地进行Web项目开发。常见的应用场景包括:
- 获取Web项目的一些信息,如上下文路径等
示例代码:
public class MyBean implements ServletContextAware {
private ServletContext servletContext;
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void doSomething() {
// 获取上下文路径
String contextPath = servletContext.getContextPath();
// ...
}
}
复制代码
6. EnvironmentAware
EnvironmentAware接口可以让Bean获取到Environment对象,通过这个对象,我们可以方便地获取Spring的环境配置信息。常见的应用场景包括:
- 获取当前的环境配置,如开发环境、测试环境或生产环境
- 获取配置文件中的属性值
示例代码:
public class MyBean implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public void doSomething() {
// 获取当前环境
String profile = environment.getActiveProfiles()[0];
// 获取配置文件中的属性值
String value = environment.getProperty("key");
// ...
}
}
复制代码
7. ServletConfigAware
ServletConfigAware接口可以让Bean获取到ServletConfig对象,通过这个对象,我们可以方便地获取Servlet的相关信息。常见的应用场景包括:
- 获取Servlet的名称
- 获取Servlet的初始化参数
示例代码:
public class MyServlet extends HttpServlet implements ServletConfigAware {
private ServletConfig servletConfig;
@Override
public void setServletConfig(ServletConfig servletConfig) {
this.servletConfig = servletConfig;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// 获取Servlet的名称
String servletName = servletConfig.getServletName();
// 获取Servlet的初始化参数
String value = servletConfig.getInitParameter("key");
// ...
}
}
复制代码
8. ApplicationContextInitializer
ApplicationContextInitializer接口是Spring提供的一个接口,我们可以在Spring容器初始化之前做一些必要的操作,常见的应用场景包括:
- 修改配置信息
- 注册BeanDefinition
示例代码:
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
// 注册BeanDefinition
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(OtherBean.class);
beanDefinition.setPropertyValues(new MutablePropertyValues());
((DefaultListableBeanFactory) applicationContext.getBeanFactory()).registerBeanDefinition("otherBean", beanDefinition);
// ...
}
}
复制代码
9. EmbeddedValueResolverAware
EmbeddedValueResolverAware接口可以让Bean获取到EmbeddedValueResolver对象,通过这个对象,我们可以方便地替换属性占位符。常见的应用场景包括:
- 替换配置文件中的占位符
示例代码:
public class MyBean implements EmbeddedValueResolverAware {
private EmbeddedValueResolver embeddedValueResolver;
@Override
public void setEmbeddedValueResolver(EmbeddedValueResolver embeddedValueResolver) {
this.embeddedValueResolver = embeddedValueResolver;
}
public void doSomething() {
// 获取属性值
String value = embeddedValueResolver.resolveStringValue("${key}");
// ...
}
}
复制代码
10. LoadTimeWeaverAware
LoadTimeWeaverAware接口可以让Bean获取到LoadTimeWeaver对象,通过这个对象,我们可以实现类的动态加载。常见的应用场景包括:
- 动态加载类 示例代码:
public class MyBean implements LoadTimeWeaverAware {
private LoadTimeWeaver loadTimeWeaver;
@Override
public void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver) {
this.loadTimeWeaver = loadTimeWeaver;
}
public void doSomething() {
// 动态加载类
ClassLoader classLoader = loadTimeWeaver.getClassLoader();
Class<?> clazz = classLoader.loadClass("com.example.OtherClass");
// ...
}
}
复制代码
11. ApplicationEventPublisherAware
ApplicationEventPublisherAware接口可以让Bean获取到ApplicationEventPublisher对象,通过这个对象,我们可以方便地发布和监听事件。常见的应用场景包括:
- 实现自定义事件
- 监听Spring容器事件
示例代码:
public class MyBean implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void doSomething() {
// 发布事件
applicationEventPublisher.publishEvent(new MyEvent(this, "event data"));
// ...
}
}
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
// 处理事件
// ...
}
}
复制代码
12. ConversionServiceAware
ConversionServiceAware接口可以让Bean获取到ConversionService对象,通过这个对象,我们可以方便地进行类型转换。常见的应用场景包括:
- 类型转换
- 数据校验
示例代码:
public class MyBean implements ConversionServiceAware {
private ConversionService conversionService;
@Override
public void setConversionService(ConversionService conversionService) {
this.conversionService = conversionService;
}
public void doSomething() {
// 类型转换
String str = "123";
Integer value = conversionService.convert(str, Integer.class);
// ...
}
}
复制代码
在使用Aware接口时,需要注意避免循环依赖和过度依赖的问题。另外,Aware接口的实现可以通过XML、注解或编程方式来实现。
以上就是Spring中各个Aware接口的应用场景和示例代码,希望对大家在实际开发中使用Spring有一定的帮助。
原文链接:https://juejin.cn/post/7229485914219610173
相关推荐
- 一个简单便捷搭建个人知识库的开源项目(MDwiki)
-
这里我通过自动翻译软件,搬运总结MDwiki官网的部署和使用方法。第一步:下载编译好的后MDwiki文件,只有一个HTML文件“mdwiki.html”。第二步:在mdwiki.html同级目录创建“...
- 强大、简洁、快速、持续更新 PandaWiki新一代 AI 驱动的开源知识库
-
PandaWiki是什么PandaWiki是一款AI大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供AI创作、AI问答...
- DeepWiki-Open: 开源版Deepwiki,可自己构建github文档库
-
Deepwiki是Devin团队开发的github文档库,用户能免费使用,但代码不是开源,而DeepWiki-Open侧是开源版本的实现。DeepWiki-Open旨在为GitHub和GitLa...
- 最近爆火的wiki知识管理开源项目PandaWiki
-
项目介绍PandaWiki是一款AI大模型驱动的开源知识库搭建系统,帮助你快速构建智能化的产品文档、技术文档、FAQ、博客系统,借助大模型的力量为你提供AI创作、AI问答、AI搜索等...
- 轻量级开源wiki系统介绍(轻量开源论坛系统)
-
wiki系统有很多DokuWiki、MediaWiki、MinDoc等等都是开源的wiki系统。商业版的wiki,像很多企业在用的confluence等。今天我们讲的是一款轻量级且开源的文档管理系统:...
- DNS解析错误要怎么处理(dns解析状态异常怎么办)
-
在互联网时代,网络已经成为人们生活和工作中不可或缺的一部分。然而,当遇到DNS解析错误时,原本畅通无阻的网络访问会突然陷入困境,让人感到十分困扰。DNS,即域名系统,它如同互联网的电话簿,将人们易于...
- 网页加载慢?这些方法让你秒开网页!
-
打开浏览器,信心满满地准备查资料、看视频或者追剧,却发现网页怎么都打不开!是不是瞬间感觉手足无措?别慌,这个问题其实挺常见,而且解决起来并没有你想象的那么复杂。今天就来聊聊网页打不开究竟是怎么回事,以...
- windows11 常用CMD命令大全(windows11msdn)
-
Windows11中的命令提示符(CMD)是一个强大的工具,可以通过命令行执行各种系统操作和管理任务。以下是一些常用的CMD命令,按功能分类整理,供你参考:一、系统信息与状态systeminfo显...
- 电脑提示DNS服务器未响应怎么解决?
-
我们在使用电脑的时候经常会遇到各种各样的网络问题,例如最近就有Win11电脑用户在使用的时候遇到了DNS未响应的问题,遇到这种情况我们应该怎么解决呢? 方法一:刷新DNS缓存 1、打开运行(W...
- 宽带拨号错误 651 全解析:故障定位与修复方案
-
在使用PPPoE拨号连接互联网时,错误651提示「调制解调器或其他连接设备报告错误」,通常表明从用户终端到运营商机房的链路中存在异常。以下从硬件、系统、网络三层维度展开排查:一、故障成因分类图...
- 如何正确清除 DNS 缓存吗?(解决你访问延时 )
-
DNS缓存是一个临时数据库,用于存储有关以前的DNS查找的信息。换句话说,每当你访问网站时,你的操作系统和网络浏览器都会保留该域和相应IP地址的记录。这消除了对远程DNS服务器重复查询的...
- 网络配置命令:ipconfig和ifconfig,两者有啥区别?
-
在计算机网络的世界里,网络接口就像是连接你电脑和外部网络的桥梁,而网络配置则是确保这座桥梁稳固、通信顺畅的关键。提到网络配置工具,ipconfig和ifconfig绝对是两个绕不开的名字。它们一...
- 救急的命令 你会几个?(救急一下)
-
很多人都说小编是注册表狂魔,其实不完全是,小编常用的命令行才是重点。其实所谓的命令行都是当初DOS时代的标准操作方式,随着Windows不断演化,DOS的命令早已成为Windows的一部分了——开始菜...
- 电脑有网却访问不了GitHub原来是这样
-
当满心欢喜打开电脑,准备在GitHub这个“开源宝藏库”里挖掘点超酷的项目,却遭遇了网页无法访问的尴尬。看着屏幕上那令人无奈的提示,原本高涨的热情瞬间被泼了一盆冷水,是不是感觉世界都不美好了...
- rockstargames更新慢| r星更新速度 怎么办 解决办法
-
rockstargames更新慢|r星更新速度怎么办解决办法说到RockstarGames,那可是游戏界的大佬,作品个顶个的经典。但话说回来,每当新内容更新时,那蜗牛般的下载速度,真是让人急得...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)