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

Spring Aware机制

作者头像
李鸿坤
发布2020-07-18 18:39:24
9640
发布2020-07-18 18:39:24
举报
文章被收录于专栏:泛泛聊后端泛泛聊后端

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

Aware机制的作用

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

代码语言:javascript
复制
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
复制
@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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Aware机制的作用
  • 其它Aware接口
  • 小结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档