Spring源码四prepareBeanFactory()方法大家好,我是程序员田同学!今天就带大家解读一下refresh()方法的第三个方法prepareBeanFactory()。通过对refresh()的一步步解读,相信总有一天小伙伴们能够揭开Spring的神秘面纱。和往常一样,先站在prepareBeanFactory()的门外看看它做了什么,然后逐步深入分析。prepareBeanFactory()方法主要是:设置BeanFactory的类加载器,添加BeanPostProcessor,手动注册几个特殊的bean。Extension:BeanPostProcessor是SpringIOC容器提供的一个扩展接口。//在调用bean初始化方法之前调用@NullabledefaultObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{returnbean;}//bean初始化方法调用后调用@NullabledefaultObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{returnbean;BeanPostProcessor在bean的整个生命周期中都处于红色箭头所指的位置。prepareBeanFactory()的每个详细方法都在下面的代码注释中。//告诉内部bean工厂使用上下文的类加载器等//设置上下文的启动类加载器beanFactory.setBeanClassLoader(getClassLoader());//添加一个bean表达式解释器,为了让我们的beanFactory去解析bean表达式beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));//spring内部的propertyeditor,读取配置文件beanFactory.addPropertyEditorRegistrar(newResourceEditorRegistrar(this,getEnvironment()));//使用上下文回调配置bean工厂。//添加BeanPostProcessorbeanFactory.addBeanPostProcessor(newApplicationContextAwareProcessor(this));//跳过下面6个属性的自动注入//因为beanFactory.ignoreDependencyInterface是通过ApplicationContextAwareProcessor后处理器(EnvironmentAware.class)中的setter注入的;beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);beanFactory.ignoreDependencyInterface(MessageSourceAware.class);beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);//BeanFactory接口未在普通工厂中注册为可解析类型。一个豆子。////注册四个特殊的bean//在应用程序代码中,工厂实例和ApplicationContext实例可以通过typeauto-assembly设置自定义bean的属性//这四个属性会自动设置,虽然不注入它们在bean定义xml中显示beanFactory.registerResolvableDependency(BeanFactory.class,beanFactory);类,这个);//将用于检测内部bean的早期后处理器注册为ApplicationListeners。//注册事件监听器beanFactory.addBeanPostProcessor(新的ApplicationListenerDetector(这个));//检测LoadTimeWeaver并准备编织(如果找到)。如果(beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)){beanFactory.addBeanPostProcessor(newLoadTimeWeaverAwareProcessor(beanFactorySetary)Loadte);//用于类型匹配。beanFactory.setTempClassLoader(newContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}//注册默认环境bean。//如果未定义“环境”bean,Spring将“手动”注册一个}//如果没有定义bean“systemProperties”,Spring将“手动”注册一个beant().getSystemProperties());}//如果“systemEnvironment”bean没有定义,Spring将“手动”注册一个}肯定有同学对ignoreDependencyInterface()方法有一些疑惑。ignoreDependencyInterface的主要作用是忽略给定接口的自动组装功能,即当有被忽略的接口类时,自动组装会忽略该类。初始化程序集,因为在某些情况下,此时的接口实现类是无法初始化的。比如BeanNameAware,如果要组装这个接口的实现对象,可以实现这个接口,通过实现的set方法组装
