前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 中的感知接口

Spring 中的感知接口

作者头像
水货程序员
修改2018-11-20 22:00:49
9800
修改2018-11-20 22:00:49
举报
文章被收录于专栏:javathingsjavathings

Sring 中有一个 Aware 接口,并且有许多子接口继承于它。

如其名字一样,实现这种接口的 Bean,能自身感知到容器的存在,容器在操作 Bean 的过程中,会调用感知接口中的方法。Spring 设计的这些接口,等于埋下了很多钩子函数,让开发者能在某些关键节点上,运行自定义的代码。

很多感知接口都和 Spring 生命周期有关,会在整个生命周期中触发运行,比如 BeanNameAware、ApplicationContextAware 等。

比如如下几个接口,通过这些接口的名字,也能猜出这些感知接口的含义和用途。

ApplicationContextAware,可以让 Bean 感知到 Spring 容器对象,获得容器 ApplicationContext 引用。

BeanFactoryAware,可以让 Bean 感知到 BeanFactory 对象,获得 BeanFactory 的引用。

BeanNameAware,让 Bean 获取自己在 BeanFactory 配置中的名字(根据情况是 id 或者 name)。

一个 User 类,实现如下的感知接口:

代码语言:javascript
复制
@Component
public class User implements ApplicationContextAware, BeanFactoryAware,
    BeanNameAware {
    public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
        System.out.println("setApplicationContext called");
        System.out.println("setApplicationContext:: Bean Definition Names=" +
            Arrays.toString(applicationContext.getBeanDefinitionNames()));
    }
 
    public void setBeanFactory(BeanFactory beanFactory)
        throws BeansException {
        System.out.println("setBeanFactory called");
        System.out.println("setBeanFactory:: user bean singleton=" +
            beanFactory.isSingleton("user"));
    }
 
    public void setBeanName(String name) {
        System.out.println("setBeanName called");
        System.out.println("setBeanName:: Bean Name defined in context=" +
            name);
    }
}

配置 ComponentScan 路径

代码语言:javascript
复制
@ComponentScan(value="com.learn")
public class Config {
}

Main 方法运行:

代码语言:javascript
复制
public static void main(String[] args) {
    //使用Config.class这个配置类
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
    applicationContext.close();
}

main 运行的时候,容器会从配置的扫描路径中扫描到 User 这个类,并且将这个类的实例注入到容器中,此时就会触发感知接口中的各个方法。运行结果如下:

setBeanName called setBeanName:: Bean Name defined in context=user setBeanFactory called setBeanFactory:: user bean singleton=true setApplicationContext called setApplicationContext:: Bean Definition Names=[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, config, org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor, org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor, user]

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

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