一、方法功能概述
// Prepare the bean factory for use in this context.
// 准备bean工厂,初始化bean工厂,给bean工厂设置属性值
prepareBeanFactory(beanFactory);
准备bean工厂,初始化bean工厂,给bean工厂设置属性值,主要包含如下的操作:
-
设置BeanFactory的类加载器
-
设置BeanExpressionResolver
-
添加ResourceEditorRegistrar
-
添加ApplicationContextAwareProcessor
-
忽略一些依赖接口
-
设置几个自动装配的特殊规则
-
添加ApplicationListenerDetector
-
增加对AspectJ的支持
-
将相关环境变量及属性以单例模式注册
二、整体代码展示
//AbstractApplicationContext
/**
* Configure the factory's standard context characteristics,
* such as the context's ClassLoader and post-processors.
* @param beanFactory the BeanFactory to configure
*/
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//设置beanFactory的classLoader为当前context的classLoader
beanFactory.setBeanClassLoader(getClassLoader());
//设置beanFactory的表达式语言处理器,Spring3增加了表达式语言的支持,SPEL语言。
//默认可以使用#{bean.xxx}的形式来调用相关属性值。
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
//为beanFactory增加了一个默认的propertyEditor,这个主要是对bean的属性等设置管理的一个工具
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
//添加BeanPostProcessor
//ApplicationContextAwareProcessor实现了BeanPostProcessor接口,在bean实例化的时候会被调用postProcessBeforeInitialization
//postProcessBeforeInitialization方法中调用了invokeAwareInterfaces。从invokeAwareInterfaces方法中,我们可以看出来,实现这些Aware接口的bean在被初始化之后,可以取得一些对应的资源。
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//Spring将ApplicationContextAwareProcessor注册后,在invokeAwareInterfaces方法中间调用的Aware类已经不是普通的bean了,
//如ResourceLoaderAware,ApplicationEventPublisherAware等,需要在Spring做bean的依赖注入的时候忽略它们。
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.class的解析后,当bean的属性注入的时候
//一旦检测到属性为BeanFactory类型便会将beanFactory的实例注入进去。
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
//看ApplicationListenerDetector源码我们会知道其作用是找到ApplicationListener的子类
//并加入到ApplicationListener中
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
//增加对AspectJ的支持,也是就用于AOP静态代理相关的处理
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
//将相关环境变量及属性以单例模式注册,environment,systemProperties,systemEnvironment
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
//如果没有定义"environment"这个bean,那么Spring会"手动"注册一个
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
//如果没有定义"systemProperties"这个bean,那么Spring会"手动"注册一个
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
//如果没有定义"systemEnvironment"这个bean,那么Spring会"手动"注册一个
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154518.html