美文网首页
Aware接口的作用

Aware接口的作用

作者: Duanty | 来源:发表于2021-05-12 15:23 被阅读0次

简介

在Spring学习中出现了很多以Aware结尾的类或者接口, 这些类主要是为了辅助自定义组件来访问Spring容器底层的组件, bean属性等.
列如我们想要在程序代码中获取ApplicationContext, BeanFactory, bean的名字等

Aware接口定义:

package org.springframework.beans.factory;
public interface Aware {

}

这是一个空接口定义, 以下是一些常用实现了该接口的Aware组件类:

image.png

常用的Aware:

  • BeanNameAware: 能够获取bean的名称
  • BeanFactoryAware:获取BeanFactory实例
  • ApplicationContextAware:获取ApplicationContext
  • MessageSourceAware:获取MessageSource(资源国际化)
  • ResourceLoaderAware:获取ResourceLoader(资源加载器)
  • EnvironmentAware:获取Environment(运行环境)

使用案例

  • 实现对应的xxxAware
  • 将自定义的类注入到容器中
@Component
public class AwareTest implements BeanNameAware, ApplicationContextAware  {
    
    private ApplicationContext applicationContext;
    
    @Override
    public void setBeanName(String name) {
        System.out.println("Bean的名称: " + name);        
    }
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("接收到了IOC容器的applicationContext: " + applicationContext);
        this.applicationContext = applicationContext;
    }
    
}

运行容器打印结果:

Bean的名称: awareTest
接收到了IOC容器的applicationContext: org.springframework.context.annotation.AnnotationConfigApplicationContext@2hf3bc2

总结:

把Spring底层的组件可以注入到自定义的bean中, 使用的是BeanPostProcessor原理, 在初始化之前调用set设置对应的值:

org.springframework.context.support.ApplicationContextAwareProcessor#invokeAwareInterfaces

    private void invokeAwareInterfaces(Object bean) {
          //如果bean实现了Aware接口, 调用对应的set进行装配
        if (bean instanceof Aware) {
            if (bean instanceof EnvironmentAware) {
                ((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment());
            }

            if (bean instanceof EmbeddedValueResolverAware) {
                ((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);
            }

            if (bean instanceof ResourceLoaderAware) {
                ((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext);
            }

            if (bean instanceof ApplicationEventPublisherAware) {
                ((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext);
            }

            if (bean instanceof MessageSourceAware) {
                ((MessageSourceAware)bean).setMessageSource(this.applicationContext);
            }

            if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
            }
        }

    }

由此可见Aware组件功能是依赖BeanPostProcessor后置处理器来处理的.

相关文章

  • Aware接口的作用

    简介 在Spring学习中出现了很多以Aware结尾的类或者接口, 这些类主要是为了辅助自定义组件来访问Sprin...

  • Aware Mode

    Aware接口 Spring中提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以...

  • spring中Aware相关接口的作用

    简介 在spring中有很多以Aware结尾的接口.如果一个Bean实现了该接口,那么当该Bean被spring初...

  • Spring5IOC容器解析——Aware接口

    Aware Aware 是 Spring 中的一个根接口,继承该接口的子接口有很多,但是该接口没有任何方法,所以大...

  • Spring知识点整理(持续更新)

    Aware接口使用 Spring中Aware.java是个没有任何方法的接口,有很多子接口,常见的比如BeanNa...

  • Aware接口

    Aware 接口是 Spring 框架开放调用组件能力的接口 使用 ApplicationContext 这样我们...

  • Aware接口

    这个是spring-beans包中的概念,正常情况下我们使用bean是不需要考虑容器相关的特性的,所以基本在项目中...

  • spring中Aware后缀

    aware: 意识到的;知道的; spring中带有Aware后缀的接口主要是和bean有关,实现了Aware后...

  • Spring实现Aware接口,完成对IOC容器的感知

    aware主要有以下感知接口,只要在程序里实现相关接口,就可以获取该aware相关的信息 BeanNameAwar...

  • org.springframework.beans.factor

    Aware 的含义 察觉、注意到、知道的。 Aware 接口文档 一个标记父接口,指示了一个 Bean 有资格被 ...

网友评论

      本文标题:Aware接口的作用

      本文链接:https://www.haomeiwen.com/subject/xhcadltx.html