prepareBeanFactory的作用
application.refresh的核心作用是完成xml,注解,自定义扩展点的解析
解析完毕生成Bean对象元信息=>BeanDefinition
然后通过BeanDefinition将单例bean进行实例化
而在此之前我们需要对容器本身做一些初始化工作,prepareBeanFactory的作用就是完成一些初始化工作, 从而支撑BeanDefinition生成和单例Bean实例化工作
源码分析
其初始化工作包含
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的增强,其有很多子接口,功能各异,后文会对其详述 |
ApplicationListener |
Applicationcontext除去beanFactory的功能还具有时间发布等等功能,ApplicationListener就是发布监听器 |
LoadTimeWeaverAwareProcessor |
加载时织入Bpp,和aop类似都可以完成代理增强逻辑 但作用的时机不同,后面会对这个点详述 |