Spring 原始碼(十)Spring Aware自動裝配原理
阿新 • • 發佈:2019-10-01
- 在初始化Bean的
initializeBean
方法中執行invokeAwareMethods
方法 - 通後置處理器
ApplicationContextAwareProcessor
來實現的,它實現了BeanPostProcessor
介面
invokeAwareMethods
我們在初始化Bean
的時候,為了保證一部分Aware
必須在後置處理器postProcessBeforeInitialization
方法之前執行,所以在Bean
初始化之前直接呼叫了invokeAwareMethods
方法。原始碼如下:
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) { ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader()); } if (bean instanceof BeanFactoryAware) { ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this); } } }
ApplicationContextAwareProcessor
除了上訴涉及的Aware
,剩餘部分的Aware
的自動裝配都是在ApplicationContextAwareProcessor#postProcessBeforeInitialization
中實現的,該方法最終會去呼叫invokeAwareInterfaces
方法。原始碼如下:
private void invokeAwareInterfaces(Object bean) { if (bean instanceof Aware) { if (bean instanceof EnvironmentAware) { ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment()); } if (bean instanceof EmbeddedValueResolverAware) { ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver); } if (bean instanceof ResourceLoaderAware) { ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext); } if (bean instanceof ApplicationEventPublisherAware) { ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext); } if (bean instanceof MessageSourceAware) { ((MessageSourceAware) bean).setMessageSource(this.applicationContext); } if (bean instanceof ApplicationContextAware) { ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext); } } }
總結
從上面原始碼我們可以看出,不管是哪種實現方式,我們執行過程都是一樣的:
- 判斷是否實現了
Aware
介面 - 判斷具體實現了那個
Aware
介面 - 直接呼叫
XxxAware
介面的特有方法實現XxxAware