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的方法中被调用的。
需要详细分析。