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

Spring 中的感知接口

作者头像
水货程序员
修改2018-11-20 22:00:49
修改2018-11-20 22:00:49
1K00
代码可运行
举报
文章被收录于专栏:javathingsjavathings
运行总次数:0
代码可运行

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

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
复制
@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
代码运行次数:0
复制
@ComponentScan(value="com.learn")
public class Config {
}

Main 方法运行:

代码语言:javascript
代码运行次数:0
复制
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 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档