1.目的
以前也稍微了解spring的源碼,最近在研究研究,記錄一下心得。
今天就針對(duì)spring中BeanPostProcessor的理解進(jìn)行加深一下。
2.BeanPostProcessor是什么?
spring中基礎(chǔ)對(duì)象都是bean! 那么beanPostProcessor也是一個(gè)bean,只不過(guò)多了一層關(guān)系,實(shí)現(xiàn)BeanPostProcessor接口。
2.1.beanPostProcessor如何被識(shí)別出來(lái)的?
在AbstractApplicationContext方法中registerBeanPostProcessors()
代碼行數(shù):
版本:spring-core-3.0.0.RELEASE-sources.jar
方法中:AbstractApplicationContext.registerBeanPostProcessors() 401行
registerBeanPostProcessors(beanFactory);
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
2.2.beanPostProcessor中的方法何時(shí)被調(diào)用?
在bean初始化的時(shí)候,也就是Spring激活bean的init-method方法的前后,會(huì)調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法和postProcessAfterInitialization。
代碼行數(shù):
版本:spring-core-3.0.0.RELEASE-sources.jar
方法中:AbstractAutowireCapableBeanFactory.initializeBean()
1394
1407
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);
}
3.分析一下BeanPostProcessor的實(shí)現(xiàn)類ApplicationContextAwareProcessor
3.1.ApplicationContextAwareProcessor的作用?
如果bean實(shí)現(xiàn)ApplicationContextAware的接口,那么就會(huì)將applicationContext注入到這個(gè)bean中。
3.2.ApplicationContextAwareProcessor實(shí)現(xiàn)原理:
1.添加到容器中:在AbstractApplicationContext的refresh方法中的prepareBeanFactory(beanFactory);方法。添加了ApplicationContextAwareProcessor處理器
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Tell the internal bean factory to use the context's class loader etc.
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
// BeanFactory interface not registered as resolvable type in a plain factory.
// MessageSource registered (and found for autowiring) as a bean.
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
.....
...
..
}
2.調(diào)用地方:ApplicationContextAwareProcessor是繼承了BeanPostProcessor接口。在bean初始化的時(shí)候,也就是Spring激活bean的init-method方法的前后,會(huì)調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法和postProcessAfterInitialization。
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
3.3.ApplicationContextAware的作用。
通過(guò)對(duì)ApplicationContextAwareProcessor的分析,我們可以清楚的了解ApplicationContextAware的作用:對(duì)當(dāng)前bean傳入對(duì)應(yīng)的Spring上下文。(即得到applicationContext)
3.4.ApplicationContextAware的使用實(shí)例。
請(qǐng)點(diǎn)擊以下的文章(自己看)
請(qǐng)點(diǎn)擊---文章1
3.5.ApplicationContextAwareProcessor的使用實(shí)例
請(qǐng)點(diǎn)擊---[文章2](https://blog.csdn.net/qq_34310242/article/details/78266590)
4.參考目錄
推薦:https://blog.csdn.net/mdq11111/article/details/79050280