百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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,那可是游戏界的大佬,作品个顶个的经典。但话说回来,每当新内容更新时,那蜗牛般的下载速度,真是让人急得...

取消回复欢迎 发表评论: