ConfigurableWebApplicationContext wac的refresh方法

来源:互联网 发布:淘宝上买的弹弓枪 编辑:程序博客网 时间:2024/05/18 01:11
ConfigurableWebApplicationContext wac的refresh方法
org.springframework.context.support.AbstractApplicationContext的refresh方法完成ConfigurableWebApplicationContext的刷新工作。
首先,准备刷新,prepareRefresh。在这个方法中会初始化当前context environment中的所有placeholder property sources(实际调用的方法就是configureAndRefreshWebApplicationContext中会调用的wac environment的initPropertySources方法);验证被标记为required 的properties都能够被解(wac environment的propertyResolver属性为PropertySourcesPropertyResolver类型,通过调用propertyResolver的setRequiredProperties可以设置properties为required );初始化wac的earlyApplicationEvents属性为LinkedHashSet,Allow for the collection of early ApplicationEvents to be published once the multicaster is available...
然后,获取beanFactory,obtainFreshBeanFactory,Tell the subclass to refresh the internal bean factory。先执行refreshBeanFactory,这是一个抽象方法,子类必须implement这个方法来完成配置的加载,它在其他初始化开始之前被refresh()方法调用。子类可以创建一个新的bean factory并持有它的引用,或者返回一个子类持有的single BeanFactory实例,后者如果context被refresh多次会抛出IllegalStateException。实际程序运行时调用的是org.springframework.context.support.AbstractRefreshableApplicationContext类实现的refreshBeanFactory()方法, 这个实现执行了context底层的bean factory的refresh,关闭前一个bean factory(如果有),为context的lifecycle的下一个阶段初始化新的bean factory;在执行getBeanFactory,得到ConfigurableListableBeanFactory。
然后,prepareBeanFactory,配置factory的标准context特征,如context的ClassLoader和post-processors。设置BeanClassLoader为context's class loader,设置BeanExpressionResolver为StandardBeanExpressionResolver,添加PropertyEditorRegistrar:ResourceEditorRegistrar, 添加BeanPostProcessor:ApplicationContextAwareProcessor,添加ignoreDependencyInterface:ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware、EnvironmentAware,注册ResolvableDependency:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext,如果beanFactory中包含LoadTimeWeaver就添加BeanPostProcessor:LoadTimeWeaverAwareProcessor和设置类型匹配的temporary ClassLoader:ContextTypeMatchClassLoader,注册默认的environment beans:environment(getEnvironment())、systemProperties(getEnvironment().getSystemProperties())、systemEnvironment(getEnvironment().getSystemEnvironment())。
然后,postProcessBeanFactory,Allows post-processing of the bean factory in context subclasses。添加BeanPostProcessor:ServletContextAwareProcessor,添加ignoreDependencyInterface:ServletContextAware、ServletConfigAware,registerWebApplicationScopes(Register web-specific scopes ("request", "session", "globalSession", "application") with the given BeanFactory, as used by the WebApplicationContext.),registerEnvironmentBeans(Register web-specific environment beans ("contextParameters", "contextAttributes") with the given BeanFactory, as used by the WebApplicationContext.)
然后,invokeBeanFactoryPostProcessors,Invoke factory processors registered as beans in the context,实例化所有已注册的BeanFactoryPostProcessor并调用。processedBeans变量用来记录已经处理或分类过的postProcessor,避免重复操作。先调用BeanDefinitionRegistryPostProcessors。
(1)如果beanFactory不是BeanDefinitionRegistry的子类则直接调用参数中的BeanFactoryPostProcessor的postProcessBeanFactory方法;
(2)否则:先判断参数中的BeanFactoryPostProcessor类型,如果是BeanDefinitionRegistryPostProcessor则调用其postProcessBeanDefinitionRegistry方法然后加入到registryPostProcessors,否则加入到regularPostProcessors;
1)获取beanFactory中所有BeanDefinitionRegistryPostProcessor类型的beanName,这里不初始化FactoryBeans(所有常规bean不要在这里初始化,保证bean factory post-processors 可以正常应用),区分implements了PriorityOrdered接口、Ordered接口、其他接口的BeanDefinitionRegistryPostProcessors;
2)先处理implements了PriorityOrdered接口的,通过beanFactory的getBean方法初始化,并加入到priorityOrderedPostProcessors和processedBeans中,然后排序、加入到registryPostProcessors中、调用postProcessBeanDefinitionRegistry方法;
3)再次获取beanFactory中所有BeanDefinitionRegistryPostProcessor类型的beanName(处理PriorityOrdered接口时可能会加入新的postProcessor);
4)再处理implements了Ordered接口的,processedBeans中不包含,就通过beanFactory的getBean方法初始化,并加入到orderedPostProcessors和processedBeans中,然后排序、加入到registryPostProcessors中、调用postProcessBeanDefinitionRegistry方法;
5)再次获取beanFactory中所有BeanDefinitionRegistryPostProcessor类型的beanName(处理Ordered接口时可能会加入新的postProcessor);
6)最后调用所有剩余的BeanDefinitionRegistryPostProcessors,processedBeans中不包含,就通过beanFactory的getBean方法初始化,并加入到registryPostProcessors和processedBeans中、调用postProcessBeanDefinitionRegistry方法;
7)激活registryPostProcessors和regularPostProcessors中所有postProcessBeanFactory的postProcessBeanFactory方法。
(3)获取beanFactory中所有BeanFactoryPostProcessor类型的beanName,这里不初始化FactoryBeans(所有常规bean不要在这里初始化,保证bean factory post-processors 可以正常应用),区分implements了PriorityOrdered接口、Ordered接口、其他接口的BeanFactoryPostProcessors;跳过processedBeans中包含的,PriorityOrdered接口通过beanFactory的getBean方法初始化并加入到priorityOrderedPostProcessors,Ordered接口将beanName加入到orderedPostProcessorNames,其他接口将beanName加入到nonOrderedPostProcessorNames
(4)先排序并调用PriorityOrdered接口的postProcessBeanFactory方法;
(5)然后处理Ordered接口的BeanFactoryPostProcessors,通过beanFactory的getBean方法初始化,并加入到orderedPostProcessors,然后排序并调用postProcessBeanFactory方法;
(6)最后处理其他接口的BeanFactoryPostProcessors,通过beanFactory的getBean方法初始化,并加入到nonOrderedPostProcessors,然后并调用postProcessBeanFactory方法;
(7)清理cached merged bean definitions,因为post-processors 已经修改了原来的metadata,如替换了values中的placeholders。
然后,registerBeanPostProcessors,记录拦截bean创建的processors。获取beanFactory中所有的BeanPostProcessor类型的beanNames; 注册BeanPostProcessorChecker,记录BeanPostProcessor初始化期间bean被创建的信息和所有的BeanPostProcessors都不能处理bean的信息;区分implements了PriorityOrdered接口、Ordered接口、其他接口的BeanPostProcessors;PriorityOrdered接口通过beanFactory的getBean方法初始化并加入到priorityOrderedPostProcessors,如果是MergedBeanDefinitionPostProcessor的实例还要加入到internalPostProcessors,Ordered接口将beanName加入到orderedPostProcessorNames,其他接口将beanName加入到nonOrderedPostProcessorNames;PriorityOrdered接口,排序并调用beanFactory的addBeanPostProcessor方法完成注册;Ordered接口通过beanFactory的getBean方法初始化并加入到orderedPostProcessors,如果是MergedBeanDefinitionPostProcessor的实例还要加入到internalPostProcessors,排序并调用beanFactory的addBeanPostProcessor方法完成注册;;其他接口通过beanFactory的getBean方法初始化并加入到nonOrderedPostProcessors,如果是MergedBeanDefinitionPostProcessor的实例还要加入到internalPostProcessors,调用beanFactory的addBeanPostProcessor方法完成注册;最后,排序并重新注册所有的internal BeanPostProcessors;调用beanFactory的addBeanPostProcessor方法注册ApplicationListenerDetector
然后,initMessageSource,初始化context的message source。如果beanFactory中包含messageSource,context的messageSource属性为beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);否则创建DelegatingMessageSource,并注册beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource)。
然后,initApplicationEventMulticaster,初始化context的event multicaster。如果beanFactory中包含applicationEventMulticaster,context的applicationEventMulticaster属性为beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);否则context的applicationEventMulticaster属性为新创建的SimpleApplicationEventMulticaster,并注册beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster)。
然后,onRefresh,为特定的context子类初始化其他beans。模板方法,可被重写,实现context特定的refresh操作,在特定的beans初始化时、单例实例化之前被调用。实际程序运行时调用的是org.springframework.web.context.support.AbstractRefreshableWebApplicationContext类的onRefresh(),设置context的themeSource属性,如果context中包含themeSource,themeSource为context.getBean(THEME_SOURCE_BEAN_NAME, ThemeSource.class);否则:如果context的parent是ThemeSource类的实例,themeSource为新创建的DelegatingThemeSource(),否则themeSource为新创建的ResourceBundleThemeSource()。
然后,registerListeners,检查并注册listener beans。先注册静态定义的listeners;获取beanFactory中所有ApplicationListener类型的beanNames;然后获取context的applicationEventMulticaster并将listener加入到applicationEventMulticaster中;发布application event。
然后,finishBeanFactoryInitialization,完成context的bean factory的初始化,初始化剩余的非lazy-init的单例。如果beanFactory中包含conversionService并且为ConversionService类型,通过beanFactory的getBean方法初始化conversionService并设置为beanFactory的conversionService;获取所有LoadTimeWeaverAware类型的beanNames并通过getBean方法进行初始化,以便尽早注册他们的转换器;设置beanFactory的TempClassLoader为null,不再用临时的ClassLoader来做类型匹配;freezeConfiguration, Allow for caching all bean definition metadata, not expecting further changes;preInstantiateSingletons,初始化剩余的非lazy-init的单例。
最后,finishRefresh,发布相应的事件。initLifecycleProcessor,初始化context的lifecycle processor,如果beanFactory中包含lifecycleProcessor,通过beanFactory的getBean方法初始化lifecycleProcessor并设置为context的lifecycleProcessor,否则创建DefaultLifecycleProcessor并设置为context的lifecycleProcessor,注册beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);先将refresh传播给lifecycle processor,在onRefresh中调用startBean,发布ContextRefreshedEvent;LiveBeansView.registerApplicationContext(this),Participate in LiveBeansView MBean, if active,到context的environment中获取spring.liveBeansView.mbeanDomain属性,如果不为null:
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.registerMBean(new LiveBeansView(), new ObjectName(mbeanDomain, MBEAN_APPLICATION_KEY, applicationContext.getApplicationName()));
在finally中,执行resetCommonCaches方法,Reset common introspection caches in Spring's core, since we might not ever need metadata for singleton beans anymore...