Spring Framework框架容器核心源码逐步剖析 (4)

initApplicationEventMulticaster();

protected void initApplicationEventMulticaster() { //初始化ApplicationEventMulticaster ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); if (logger.isTraceEnabled()) { logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]"); } } //如果在上下文中没有定义,则创建一个默认的SimpleApplicationEventMulticaster。 else { this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); if (logger.isTraceEnabled()) { logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " + "[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]"); } } } 第八步:注册事件监听器

主要功能 : 实例化实现ApplicationListener接口的bean。

// 注册监听器 finishBeanFactoryInitialization(beanFactory); protected void registerListeners() { //首先注册静态指定的侦听器 for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); } //下面是我们自定义的监听器,Spring文档中给出的建议是 "不要在这里初始化FactoryBeans:我们需要保留所有常规bean" String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } //使用已经注册的事件广播器,发布早期的应用程序事件...... Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents; this.earlyApplicationEvents = null; if (earlyEventsToProcess != null) { for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent); } } } 第九步: 实例化所有的单例Bean

功能:执行到这一步,Spring.xml配置文件中的特殊的Bean该注册的也注册了,该调用的也调用了,就剩下了普通的Bean了,在这一步就都实例化了.(仅仅是非延迟实例化的单例Bean),也就是说这一步就已经完成了Bean工厂(ApplicationContext)的初始化了.

// 实例化所有SPring.xml配置文件中配置的非延迟实例化的单例Bean finishBeanFactoryInitialization(beanFactory); protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 初始化此上下文的转换服务 if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) { beanFactory.setConversionService( beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); } //如果没有bean后处理器,则注册默认的嵌入值解析器(例如PropertyPlaceholderConfigurer bean)之前注册过;此时,主要用于注释属性值的分辨率。 if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal)); } // 尽早初始化LoadTimeWeaverAware bean以允许尽早注册其变换器。 String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); } // 停止使用临时ClassLoader进行类型匹配。 beanFactory.setTempClassLoader(null); // 允许缓存所有bean定义元数据,而不期望进一步的更改。 beanFactory.freezeConfiguration(); // 实例化所有剩余(非延迟初始化)单例。 beanFactory.preInstantiateSingletons(); } 第十步:完成ApplicationContext容器的初始化收

功能:进行相关的容器创建完成时的操作,回收相关资源

finishRefresh(); resetCommonCaches(); protected void finishRefresh() { //清除上下文级资源缓存(例如来自扫描的ASM元数据)。 clearResourceCaches(); //为此上下文初始化生命周期处理器。 initLifecycleProcessor(); // 首先将刷新传播到生命周期处理器。 getLifecycleProcessor().onRefresh(); // 广播最终事件 publishEvent(new ContextRefreshedEvent(this)); // 如果处于活动状态,请参与LiveBeansView LiveBeansView.registerApplicationContext(this); } //清除一些单例的工具类的缓存 protected void resetCommonCaches() { ReflectionUtils.clearCache(); AnnotationUtils.clearCache(); ResolvableType.clearCache(); CachedIntrospectionResults.clearClassLoader(getClassLoader()); } 应该学习到的知识

Spring容器中管理的Bean是Class吗?

Spring Framework框架容器核心源码逐步剖析

可以看到Bean容器中的Bean定义映射关系的Map中存放的是key(String)->GenericBeanDefinition的映射,那么GenericBeanDefinition又是什么呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdjws.html