// Prepare the bean factory for use in this context.
//添加一些 Spring 本身需要的一些工具类
prepareBeanFactory(beanFactory);
/**
* 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) {
// Tell the internal bean factory to use the context's class loader etc.
//bean工厂设置类加载器
beanFactory.setBeanClassLoader(getClassLoader());
//创建一个新的StandardBeanExpressionResolver实例,此实例拥有类加载器的引用
//在bean定义的值中,此实例为表达式的使用指定解决策略,上下文通常会设置标准的表达式策略支持"#{...}"EL表达式,例如数据库信息的引用
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
//创建一个新的ResourceEditorRegistrar自定义属性编辑器实例,此实例拥有类加载器和Environment的引用
//将这个ResourceEditorRegistrar实例添加到bean工厂的propertyEditorRegistrars属性中
//propertyEditorRegistrars是LinkedHashSet类型,定制自定义策略,来扩展propertyEditor,适用于所有bean的创建过程
//案例:一个重要的使用就是将xml中bean中的属性值注入到class对象中
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// Configure the bean factory with context callbacks.
//通过上下文回调配置bean工厂
//BeanPostProcessor(SF中特别重要的一个接口)允许我们自定义修改bean的属性,可以创建此接口的实现类,修改bean信息
//在bean工厂添加BeanPostProcessor处理器,用于创建bean(creatBean),BeanPostProcessor是CopyOnWriteArrayList类型,线程安全
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 interface not registered as resolvable type in a plain factory.
// MessageSource registered (and found for autowiring) as a bean.
//BeanFactory接口未在普通工厂中注册为可解析类型。
//MessageSource注册为bean(并发现用于自动装配)。
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// Register early post-processor for detecting inner beans as ApplicationListeners.
//注册早期的后处理器以将内部bean检测为ApplicationListeners。
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// Detect a LoadTimeWeaver and prepare for weaving, if found.
//如果发现LoadTimeWeaver,请准备编织。
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
//为类型匹配设置一个暂时的类加载器
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// Register default environment beans.
//注册默认的环境beans
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());
}
}