简介
- Spring框架的优点,在Bean中感知不到容器的存在,我们在不用代码中引入容器代码,但是在有些场景中我们需要感知到容器的存在,需要获取容器的工具类,这个时候需要使用Spring Aware提供的工具类
- Spring 框架中提供许多实现Aware接口的类,这些类主要是为了辅助Spring访问容器中的数据
常用Aware
类名 | 作用 |
---|---|
BeanNameWare | 获得容器中Bean名称 |
BeanClassLoaderAware | 获得类加载器 |
BeanFactoryAware | 获得Bean创建工厂 |
EnvironmentAware | 获得环境变量 |
EmbeddedValueResolverAware | 获得spring容器加载的properties文件属性值 |
ResourceLoaderAware | 获得资源加载器 |
ApplicationEventPublisherAware | 获得应用事件发布器 |
MessageSourceAware | 获得文本信息 |
ApplicationContextAware | 获得当前应用上下文 |
源码解析
源码入口方法
自定义实现ApplicationContextAware接口类,然后在setApplicationContext方法打断点,debug模式下查看堆栈信息
此时可以看到调用链信息
Aware调用链
源码跟踪
- initializeBean 初始化Bean
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new