Skip to content
0

Spring Boot - Aware

前言

Spring 框架的优点,在 Bean 中感知不到容器的存在,我们在不用代码中引入容器代码,但是在有些场景中我们需要感知到容器的存在,需要获取容器的工具类,这个时候需要使用 Spring Aware 提供的工具类

Spring 框架中提供许多实现 Aware 接口的类,这些类主要是为了辅助 Spring 访问容器中的数据。

常用 Aware

类名作用
BeanNameWare获得容器中 Bean 名称
BeanClassLoaderAware获得类加载器
BeanFactoryAware获得 Bean 创建工厂,可以获取 Bean
EnvironmentAware获得 Environment 环境变量
EmbeddedValueResolverAware获得 Spring 容器加载的 properties 文件属性值
ResourceLoaderAware获得资源加载器
ApplicationEventPublisherAware获得应用事件发布器
MessageSourceAware获得文本信息
ApplicationContextAware获得当前应用上下文,可以获取 Bean、Environment 等信息,是最常用的 Aware

这些 Aware 接口可以通过实现对应的接口,并在相应的回调方法中获取所需的资源或进行自定义的操作。通过使用这些 Aware 接口,我们可以更好地集成 Spring Boot 应用程序与其他组件或模块,并实现特定的业务逻辑或功能扩展。

功能实现原理

在 Bean 的创建和初始化过程中,当检测到 Bean 实现了某个 Aware 接口时,会在相应的阶段调用回调方法。

Spring 容器内部会维护一个集合,记录所有实现了 Aware 接口的 Bean。

在适当的生命周期阶段,例如在 Bean 的实例化后、属性注入前或初始化前,Spring 容器会遍历这个集合,并为每个实现了 Aware 接口的 Bean 调用相应的回调方法。

回调方法会传入对应的资源对象,例如 ApplicationContext、Environment 等,以供应用程序进行使用或操作。

应用程序可以在回调方法中根据自己的需求获取所需的资源,并进行进一步的处理或使用。

使用

BeanFactoryAware

获取 Bean 工厂

java
@Component
public class MyBeanFactoryAware implements BeanFactoryAware {
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        // 获取容器的某个 Bean
        System.out.println("BeanFactoryAware:" + beanFactory.getBean(AccountService.class));
    }
}

输出:

java
BeanFactoryAware:cn.youngkbt.boot.service.AccountService@3af7d855

BeanNameAware

获取当前 Bean 的名字

java
@Component
public class MyBeanNameAware implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware:" + name);
    }
}

输出:

java
BeanNameAware:myBeanNameAware

EnvironmentAware

获取环境变量,也就是 application 相关配置信息。

java
@Component
public class MyEnvironmentAware implements EnvironmentAware {
    @Override
    public void setEnvironment(Environment environment) {
        System.out.println("EnvironmentAware:" + environment.getProperty("server.port"));
    }
}

输出:

java
EnvironmentAware:8080

ApplicationContextAware

获取容器上下文

java
@Component
public class MyApplicationContextAware implements ApplicationContextAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContextAware:" + applicationContext.getBean(CouponService.class));
        System.out.println("ApplicationContextAware:" + applicationContext.getEnvironment().getProperty("server.port"));
    }
}

输出:

java
ApplicationContextAware:cn.youngkbt.boot.service.CouponService@178f268a
ApplicationContextAware:8080

ResourceLoaderAware

获取资源加载器

java
@Component
public class MyResourceLoaderAware implements ResourceLoaderAware {

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        Resource resource = resourceLoader.getResource("classpath:application.yml");
        System.out.println("ResourceLoaderAware:" + resource.getDescription());
    }
}

输出:

java
ResourceLoaderAware:class path resource [application.yml]
最近更新