java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Aware 接口

一文看懂 Spring Aware 接口功能

作者:齐 飞

Aware接口是一个空接口,可以理解为是一个标记接口,方便在一个统一的方法(AbstractAutowireCapableBeanFactory.invokeAwareMethods)中进行判断处理赋值,在子接口写出各自的set方法,这篇文章主要介绍了一文看懂 Spring Aware 接口功能,需要的朋友可以参考下

前言

有些情况下,当Bean需要实现某个功能时,需要借助于 Spring容器对象属性 才能实现。此时就需要让该Bean先获取Spring容器对象属性,然后借助于Spring容器对象属性实现该功能。

Aware

Aware接口是一个空接口,可以理解为是一个标记接口,方便在一个统一的方法(AbstractAutowireCapableBeanFactory.invokeAwareMethods)中进行判断处理赋值,在子接口写出各自的set方法。

**Aware接口方法的主要作用是让 Bean 能够获取 Spring 容器的相关资源和信息,以便在后续的初始化和业务逻辑中使用。**可以理解为之前的属性赋值是将我们自定义属性的值进行赋值,而使用Aware可以让我们拿到Spring容器内部的容器对象。

/*
 * A marker superinterface
 * 在该接口的注释中也解释了该接口是一个标记接口
 */
public interface Aware {
}

常见的 Aware 接口及功能

BeanNameAware接口

ApplicationContextAware接口

BeanFactoryAware接口

ApplicationEventPublisherAware接口

ResourceLoaderAware接口

EnvironmentAware接口

MessageSourceAware接口

代码示例

如:Bean 实现了 ApplicationContextAware 接口,此时Spring会通过 setApplicationContext() 给Bean中的ApplicationContext属性值赋值。

org.springframework.context.ApplicationContextAware

public interface ApplicationContextAware extends Aware {
    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

通过类实现ApplicationContextAware接口,并重写接口中的setApplicationContext()方法,则可以获取 Spring 的应用上下文ApplicationContext对象

public class SpringContextUtil implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

Aware 接口中set()的调用时机

在以上代码中setApplicationContext()方法是spring容器进行调用的,在invokeAwareMethods中统一调用。
当子实现类实现ApplicationContextAware接口后,当前类中重写setApplicationContext为接口中setApplicationContext方法。Spring会在执行invokeAwareMethods()时由容器进行赋值。

Spring源码中的具体实现如下:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods

private void invokeAwareMethods(String beanName, Object bean) {
    //如果 bean 是 Aware 实例
    if (bean instanceof Aware) {
        //如果bean是BeanNameAware实例
       if (bean instanceof BeanNameAware) {
           //调用 bean 的setBeanName方法
          ((BeanNameAware) bean).setBeanName(beanName);
       }
       //如果bean是 BeanClassLoaderAware 实例
       if (bean instanceof BeanClassLoaderAware) {
           //获取此工厂的类加载器以加载Bean类(即使无法使用系统classLoader,也只能为null)
          ClassLoader bcl = getBeanClassLoader();
          if (bcl != null) {
              //调用 bean 的 setBeanClassLoader 方法
             ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
          }
       }
       //检查bean是否实现了BeanFactoryAware,如果是,则调用其setBeanFactory方法设置工厂实例。
       if (bean instanceof BeanFactoryAware) {
          ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
       }
    }
}

什么时候调用invokeAwareMethods方法

invokeAwareMethods()通常是在Spring容器初始化一个bean的过程中被调用的。

到此这篇关于一文看懂 Spring Aware 接口的文章就介绍到这了,更多相关Spring Aware 接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文