Java教程

spring核心源码分析第四篇 refresh流程之prepareBeanFactory

本文主要是介绍spring核心源码分析第四篇 refresh流程之prepareBeanFactory,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

prepareBeanFactory的作用

application.refresh的核心作用是完成xml,注解,自定义扩展点的解析 
解析完毕生成Bean对象元信息=>BeanDefinition
然后通过BeanDefinition将单例bean进行实例化
而在此之前我们需要对容器本身做一些初始化工作,prepareBeanFactory的作用就是完成一些初始化工作, 从而支撑BeanDefinition生成和单例Bean实例化工作

源码分析

其初始化工作包含

设置类加载器
设置bean标签表达式解析器为Spel解析器
addPropertyEditorRegistrar设置属性编辑注册器为ResourceEditorRegistrar
addBeanPostProcessor添加bpp
ApplicationContextAwareProcessor ApplicationListenerDetector
BeanPostProcessor是核心扩展点 在bean初始化前后完成相关增强逻辑
ignoreDependencyInterface忽略相关依赖接口
EnvironmentAware EmbeddedValueResolverAware ResourceLoaderAware ApplicationEventPublisherAware MessageSourceAware ApplicationContextAware
在autowire依赖注入时,如果发现ignoredDependencyInterfaces接口包含,则不需要处理注入逻辑,例如Aware,一般aware我们走特定的bpp ApplicationContextAwareProcessor进行赋值
registerResolvableDependency 注册可解析的依赖
BeanFactory ResourceLoader ApplicationEventPublisher ApplicationContext
这个方法的作用是将 BeanFactory, ResourceLoader这些特殊的对象(容器没有显示注册相关bean)作为一个bean使用,所以将其加入到resolvableDependencies容器池,用于将来使用
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
		设置类加载器
		beanFactory.setBeanClassLoader(getClassLoader());
		设置bean解析器
		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
		设置属性编辑器
		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

 作用: 根据bean接口将指定[aware]注入到bean 比如最常见的上下文aware ApplicationContextAware
		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

		忽略指定的接口加载		
		beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
		beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
		beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
		beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
		beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

注册BeanFactory作为可解析依赖
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
		beanFactory.registerResolvableDependency(ResourceLoader.class, this);
		beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
		beanFactory.registerResolvableDependency(ApplicationContext.class, this);

		// 如果被解析的bean 是一个ApplicationListener 则自动将其加入spring容器的listener集合 从而可以监听容器发布的相关事件
		
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

		默认这里不包含LOAD_TIME_WEAVER_BEAN_NAME  所以LoadTimeWeaverAwareProcessor默认不注册
		作用类似于aop 都是为了完成切面增强  但LoadTimeWeaver【类加载时织入】是通过编译时增强

		if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}


		直接注册一些特定的单例bean
		if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
			beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
		}
		if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
			beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
		}
		if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
			beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
		}
	}

总结

准备beanfactory时完成了beanfactory的相关初始化
其中涉及了一些新的知识点

类名作用
beanfactory完成bean的解析,创建,注入,增强bpp,注册addsinglton等核心工作
Aware作为扩展点 在bean后置处理器处理时,会将相关Aware接口注入给bean
BeanPostProcessor核心中的核心,bean后置处理器可以完成bean的增强,其有很多子接口,功能各异,后文会对其详述
ApplicationListenerApplicationcontext除去beanFactory的功能还具有时间发布等等功能,ApplicationListener就是发布监听器
LoadTimeWeaverAwareProcessor加载时织入Bpp,和aop类似都可以完成代理增强逻辑 但作用的时机不同,后面会对这个点详述
这篇关于spring核心源码分析第四篇 refresh流程之prepareBeanFactory的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!