是什么
Aware接口从字面上翻译过来是感知捕获的含义。单纯的bean(未实现Aware系列接口)是没有知觉的;实现了Aware系列接口的bean可以访问Spring容器。这些Aware系列接口增强了Spring bean的功能,但是也会造成对Spring框架的绑定,增大了与Spring框架的耦合度。
- Spring框架优点:Bean感知不到容器的存在
- Aware使用场景:需要使用Spring容器的功能资源,引入后就与spirng强耦合了
一些常用的Aware
类名 | 作用 |
---|---|
BeanNameAware | 获得容器中bean名称 |
BeanClassLoaderAware | 获得类加载器 |
BeanFactoryAware | 获得bean创建工厂 |
EnvironmentAware | 获得环境变量 |
EmbeddedValueResolverAware | 获取spring容器加载的properties文件属性值 |
ResourceLoaderAware | 获得资源加载器 |
ApplicationEventPublisherAware | 获得应用事件发布器 |
MessageSourceAware | 获得文本信息 |
ApplicationContextAware | 获得当前应用上下文 |
案例
通过实现EnvironmentAware使得普通Bean可以使用spirng中的环境变量。
@Component
@Data
public class My2Aware implements EnvironmentAware {
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
}
我们在获取My2Aware的bean的时候就可以拿到spring的环境变量
那么Aware究竟是怎么做到的呢
在srpingboot启动的时候,Bean创建的时候有一个方法initializeBean(处理回调)里面有这样一段代码。
AbstractAutowireCapableBeanFactory#1757
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
@Override
public Object run() {
invokeAwareMethods(beanName, bean);
return null;
}
}, getAccessControlContext());
}
else {
// 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic