springboot源码分析:Aware机制

Scroll Down

Spring框架中提供了Aware接口采用回调的方式提供给开发者用于在开发中提供各种框架中的对象的支持,比如ApplicationContext、BeanName、ServletContext等等。
以下列举了一些常用的Aware列表:

名字作用
ApplicationContextAware将ApplicationContext引用注入到Bean中
ApplicationEventPublisherAware将ApplicationEventPublisher引用注入到Bean中
BeanClassLoaderAware将ClassLoader引用注入到Bean中
BeanFactoryAware将BeanFactory引用注入到Bean中
BeanNameAware将BeanName引用注入到Bean中
BootstrapContextAware将BootstrapContext引用注入到Bean中
MessageSourceAware将MessageSource引用注入到Bean中
ResouceLoaderAware将ResouceLoader引用注入到Bean中
ServletContextAware将ServletContext引用注入到Bean中

首先是在创建Bean的流程中:

protected Object initializeBean(final String beanName, final 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 BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
	}
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}

	return wrappedBean;
}

private void invokeAwareMethods(final String beanName, final 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);
		}
	}
}

这里面主要判断了如果Bean是BeanNameWare、BeanClassLoaderAware、BeanFactoryAware时会执行相应的回调函数。

另外一部分的回调是通过BeanPostProcessor来执行的。
ApplicationContextAwareProcessor是在AbstractApplicationContext的prepareBeanFactory方法中被添加进去的。
而WebApplicationContextServletContextAwareProcessor是在AbstractApplicationContext的postProcessBeanFactory方法中被添加进去的。

被添加之后会在BeanPostProcessor的方法中被调用的。
需要详细分析。