0
点赞
收藏
分享

微信扫一扫

Spring中的Aware作用以及源码


文章目录

  • ​​1.源码​​
  • ​​2.Aware调用链​​
  • ​​3.initializeBean 初始化Bean​​


在有些场景中我们需要感知到容器的存在,需要获取容器的工具类,这个时候需要使用Spring Aware提供的工具类

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

Spring中的Aware作用以及源码_spring

Spring中的Aware作用以及源码_spring_02

1.源码

自定义实现ApplicationContextAware接口类,然后在setApplicationContext方法打断点,debug模式下查看堆栈信息

Spring中的Aware作用以及源码_工具类_03
Spring中的Aware作用以及源码_初始化_04

2.Aware调用链

Spring中的Aware作用以及源码_工具类_05
createBean - doCreateBean - initializeBean - applyBeanPostProcessorsBeforeInitialization - invokeAwareInterfaces

3.initializeBean 初始化Bean

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction) () -> {
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 BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

return wrappedBean;
}

invokeAwareMethods,applyBeanPostProcessorsBeforeInitialization

invokeAwareMethods 对ware执行分类

private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}

Spring中的Aware作用以及源码_spring_06
applyBeanPostProcessorsBeforeInitialization 获取所有的执行器,依次执行

@Override
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {

Object result = existingBean;
for (BeanPostProcessor processor : getBeanPostProcessors()) {
Object current = processor.postProcessBeforeInitialization(result, beanName);
if (current == null) {
return result;
}
result = current;
}
return result;
}

举报

相关推荐

0 条评论