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 工厂
@Component
public class MyBeanFactoryAware implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// 获取容器的某个 Bean
System.out.println("BeanFactoryAware:" + beanFactory.getBean(AccountService.class));
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出:
BeanFactoryAware:cn.youngkbt.boot.service.AccountService@3af7d855
1
BeanNameAware
获取当前 Bean 的名字
@Component
public class MyBeanNameAware implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("BeanNameAware:" + name);
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
输出:
BeanNameAware:myBeanNameAware
1
EnvironmentAware
获取环境变量,也就是 application 相关配置信息。
@Component
public class MyEnvironmentAware implements EnvironmentAware {
@Override
public void setEnvironment(Environment environment) {
System.out.println("EnvironmentAware:" + environment.getProperty("server.port"));
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出:
EnvironmentAware:8080
1
ApplicationContextAware
获取容器上下文
@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"));
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出:
ApplicationContextAware:cn.youngkbt.boot.service.CouponService@178f268a
ApplicationContextAware:8080
1
2
2
ResourceLoaderAware
获取资源加载器
@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());
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
输出:
ResourceLoaderAware:class path resource [application.yml]
1
编辑此页 (opens new window)
更新时间: 2024/01/06, 06:51:53