IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring-IOC容器的底层原理 -> 正文阅读

[Java知识库]Spring-IOC容器的底层原理

容器的创建和刷新过程

Spirng的IOC是Spring的核心之一,容器的创建和刷新主要的流程如下:

创建和刷新的过程集中在AbstractApplicationContext类的refresh方法中,该方法定义如下

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

			// 进行容器刷新前的欲处理工作
			prepareRefresh();

			// 通过GenericApplicationContext类的构造方法创建容器,并且进行一些必要的设置工作
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// 对创建的容器进行一些主要组件的注册
			prepareBeanFactory(beanFactory);

			try {
				// 容器的前置处理器 空方法 主要用于子类实现之后注册一些必备的组件
				postProcessBeanFactory(beanFactory);

				StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
				// 对容器中的bean进行循环执行bean的前置处理器方法 (按照优先级)
				invokeBeanFactoryPostProcessors(beanFactory);

				// 容器的后置处理器
				registerBeanPostProcessors(beanFactory);
				beanPostProcess.end();

				// 初始化MessageSource工作包括:国际化,消息绑定,消息解析等。
				initMessageSource();

				// 初始化事件派发器
				initApplicationEventMulticaster();

				// 主要初始化特定上下文子类中的其他特殊 bean。
				onRefresh();

				// 将所有的监听器注册到容器中
				registerListeners();

				// 实例化所有的单实例bean
				finishBeanFactoryInitialization(beanFactory);

				// 最后一步:完成容器的刷新工作 发布相应的事件。 
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// 如果抛出异常,则销毁已经创建的单例以节约资源。
				destroyBeans();

				// 重写设置激活状态
				cancelRefresh(ex);

				// 将异常抛出,传播给调用者。
				throw ex;
			}

			finally {
				// 重置 Spring 核心缓存
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
				contextRefresh.end();
			}
		}
	}
  1. 首先在代码的第四行,调用了此类中的prepareRefresh方法

    这个方法是进行容器刷新前的预处理工作的,该方法的定义如下

    protected void prepareRefresh() {
            this.startupDate = System.currentTimeMillis(); //记录启动时间
            this.closed.set(false); //是否关闭
            this.active.set(true); //是否激活
            if (this.logger.isDebugEnabled()) {
                if (this.logger.isTraceEnabled()) {
                    this.logger.trace("Refreshing " + this);
                } else {
                    this.logger.debug("Refreshing " + this.getDisplayName());
                }
            }
    
            this.initPropertySources(); //设置属性源
            this.getEnvironment().validateRequiredProperties(); //对设置的属性源进行校验
            if (this.earlyApplicationListeners == null) {
                this.earlyApplicationListeners = new LinkedHashSet(this.applicationListeners);
            } else {
                this.applicationListeners.clear();
                this.applicationListeners.addAll(this.earlyApplicationListeners);
            }
    
            this.earlyApplicationEvents = new LinkedHashSet();
        }
    
    1. 在容器刷新的预处理中,代码第2行设置了容器的启动日期,之后设置一些容器的基本标志,包括是否关闭,以及是否激活等状态。
    2. 接下来的代码会判断当前运行环境是否为Debug,如果是,输入一些提示信息。
    3. 直到代码的第13行,执行了initPropertySources方法,通过Debug我们发现,这个方法是一个空方法 ,这个方法在此处什么也不做,但是我们可以继承这个类来自定义个性化的属性配置
    4. 接着,流程执行到prepareRefresh方法中的14行,this.getEnvironment().validateRequiredProperties()这个方法主要对上一步的属性配置进行校验。
    5. 接着会对域earlyApplicationListeners进行非null校验
    6. 执行到22行,创建了一个List集合,用于存储容器中的一些早期事件,如果有事件发生,则保存到此list中,之后对应的事件派发器准备好之后,将事件派发出去。此时容器的预处理工作结束。
  2. 然后执行到refresh的5行

    通过obtainFreshBeanFactory方法获取了BeanFactory

    该方法的定义如下

    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    		refreshBeanFactory(); //容器创建
    		return getBeanFactory();//返回刷新后的容器
    	}
    
    1. 方法首先调用refreshBeanFactory();进行容器的刷新工作,通过Debug,我们发现流程进入了GenericApplicationContext类中,我们发现此类的构造方法创建了一个BeanFactory

      public GenericApplicationContext() {
      		this.beanFactory = new DefaultListableBeanFactory();
      }
      
    2. 我们回到refreshBeanFactory方法,此方法中,设置了Serialization的id,然后将创建的BeanFactory返回给调用者,

      protected final void refreshBeanFactory() throws IllegalStateException {
      		if (!this.refreshed.compareAndSet(false, true)) {
      			throw new IllegalStateException(
      					"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
      		}
      		this.beanFactory.setSerializationId(getId()); //设置serializationId
      }
      
    3. 也就是之前的AbstractApplicationContext类中的refresh方法的第五行,流程回来。

  3. 然后执行到6行 this.prepareBeanFactory(beanFactory);

    BeanFacotory进行预处理的工作,对其进行一些设置。

    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    		// Tell the internal bean factory to use the context's class loader etc.
    		beanFactory.setBeanClassLoader(getClassLoader()); //设置类加载器
    		if (!shouldIgnoreSpel) {
    			beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
    		}
    		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); //设置支持的表达式解析器
    
    		// 设置忽略的自动装配接口
    		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.ignoreDependencyInterface(ApplicationStartupAware.class);
    
    		//注册可以解析的自动装配  包括BeanFactory,ResourceLoader,ResourceLoader,ApplicationContext等。
    		beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
    		beanFactory.registerResolvableDependency(ResourceLoader.class, this);
    		beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
    		beanFactory.registerResolvableDependency(ApplicationContext.class, this);
    
    		// 添加后置处理器
    		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
    
    		// Detect a LoadTimeWeaver and prepare for weaving, if found.
    		if (!NativeDetector.inNativeImage() && 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()));
    		}
    
    		// 注册环境变量
    		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());
    		}
    		if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
    			beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
    		}
    	}
    
  4. 执行到refresh的16行 postProcessBeanFactory(beanFactory); 方法,此方法是一个空方法 主要用于子类实现之后对容器进行前置工作

  5. 流程来到refresh方法的18行,在Bean Factory标准初始流程之后执行

  6. 来到refresh20行,invokeBeanFactoryPostProcessors方法被执行 该方法定义如下

    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    
    		if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
    			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
    			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    		}
    	}
    
    1. 第一行调用invokeBeanFactoryPostProcessors方法,此方法会实例化并调用所有已注册的 BeanFactoryPostProcessor bean,如果给出则遵守显式顺序。 必须在单例实例化之前调用。

      该方法的定义如下

      public static void invokeBeanFactoryPostProcessors(
      			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
      
      		Set<String> processedBeans = new HashSet<>();
      
               //判断beanfactory的类型 如果是BeanDefinitionRegistry则对其进行遍历并执行bean的前置处理器
      		if (beanFactory instanceof BeanDefinitionRegistry) {
      			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
      			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
      
                  // 循环将传入的beanFacotory中bean的前置处理器添加到list集合中
      			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
      				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
      					BeanDefinitionRegistryPostProcessor registryProcessor =
      							(BeanDefinitionRegistryPostProcessor) postProcessor;
      					registryProcessor.postProcessBeanDefinitionRegistry(registry);
      					registryProcessors.add(registryProcessor);
      				}
      				else {
      					regularPostProcessors.add(postProcessor);
      				}
      			
      			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
      
      			
                      // 通过优先级进行排序 
      			String[] postProcessorNames =
      					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      			for (String ppName : postProcessorNames) {
                      // 首先判断bean是否实现了PriorityOrdered接口
      				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
      					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
      					processedBeans.add(ppName);
      				}
      			}
      			sortPostProcessors(currentRegistryProcessors, beanFactory);
      			registryProcessors.addAll(currentRegistryProcessors);
                      //执行bean的前置处理器
      			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
      			currentRegistryProcessors.clear();
      
      
      			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                      
                     
      			for (String ppName : postProcessorNames) {
                      
                      // 其次判断是否实现了Ordered接口
      				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
      					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
      					processedBeans.add(ppName);
      				}
      			}
      			sortPostProcessors(currentRegistryProcessors, beanFactory);
      			registryProcessors.addAll(currentRegistryProcessors);
                      
                      //执行bean的前置处理器
      			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
      			currentRegistryProcessors.clear();
      
      			boolean reiterate = true;
      			while (reiterate) {
      				reiterate = false;
      				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
      				for (String ppName : postProcessorNames) {
      					if (!processedBeans.contains(ppName)) {
      						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
      						processedBeans.add(ppName);
      						reiterate = true;
      					}
      				}
      				sortPostProcessors(currentRegistryProcessors, beanFactory)
                          
                          
      				registryProcessors.addAll(currentRegistryProcessors);
      				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
      				currentRegistryProcessors.clear();
      			}
      
      			//执行没有实现任何优先级的bean的前置处理器;
      			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
      			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
      		}
      
      		else {
      			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
      		}
      
      
      		String[] postProcessorNames =
      				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
      
      			//判断beanfactory的类型 如果是PriorityOrdered则对其进行遍历并执行bean的前置处理器
      		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
      		List<String> orderedPostProcessorNames = new ArrayList<>();
      		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
      		for (String ppName : postProcessorNames) {
      			if (processedBeans.contains(ppName)) {
      			
      			}
      			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
      				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
      			}
      			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
      				orderedPostProcessorNames.add(ppName);
      			}
      			else {
      				nonOrderedPostProcessorNames.add(ppName);
      			}
      		}
      
      		// 首先执行priorityOrderedPostProcessors接口的bean的前置处理器
      		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
      		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
      
      		//判断beanfactory的类型 如果是BeanFactoryPostProcessor则对其进行遍历并执行bean的前置处理器
      		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
      		for (String postProcessorName : orderedPostProcessorNames) {
      			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
      		}
      		sortPostProcessors(orderedPostProcessors, beanFactory);
      		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
      
      		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
      		for (String postProcessorName : nonOrderedPostProcessorNames) {
      			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
      		}
      		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
      
      		//清除缓存的合并 bean 定义,因为后处理器可能已经修改了原始元数据,例如替换值中的占位符..
      		beanFactory.clearMetadataCache();
      	}
      
  7. 来到refresh方法的23行。

    registerBeanPostProcessors(beanFactory);

    对容器中的bean进行后置处理 方法的定义如下

    protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
    	}
    

    继续进入registerBeanPostProcessors方法

    public static void registerBeanPostProcessors(
    			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
    
        	//获取容器中所有的postProcessorNames
    		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
    
    		
    		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
        	// 加入自己的后置处理器
    		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
    
    		//分离实现 PriorityOrdered 的 BeanPostProcessor
    		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
    		List<String> orderedPostProcessorNames = new ArrayList<>();
    		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
        	// 循环所有的后置处理器 通过MergedBeanDefinitionPostProcessor接口和Ordered接口进行优先级排序
    		for (String ppName : postProcessorNames) {
    			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    				priorityOrderedPostProcessors.add(pp);
                    
    				if (pp instanceof MergedBeanDefinitionPostProcessor) {
    					internalPostProcessors.add(pp);
    				}
    			}
    			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    				orderedPostProcessorNames.add(ppName);
    			}
    			else {
    				nonOrderedPostProcessorNames.add(ppName);
    			}
    		}
    
    		// 首先,注册实现 PriorityOrdered 的 BeanPostProcessors。
    		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
    
    	
    		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
    		for (String ppName : orderedPostProcessorNames) {
    			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    			orderedPostProcessors.add(pp);
    			if (pp instanceof MergedBeanDefinitionPostProcessor) {
    				internalPostProcessors.add(pp);
    			}
    		}
        
        	//接下来,注册实现 Ordered 的 BeanPostProcessors。
        	sortPostProcessors(orderedPostProcessors, beanFactory);
    		registerBeanPostProcessors(beanFactory, orderedPostProcessors);
    
    		// 现在,注册所有常规 BeanPostProcessor。
    		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
    		for (String ppName : nonOrderedPostProcessorNames) {
    			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
    			nonOrderedPostProcessors.add(pp);
    			if (pp instanceof MergedBeanDefinitionPostProcessor) {
    				internalPostProcessors.add(pp);
    			}
    		}
    		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
    
    		// 最后,重新注册所有内部 BeanPostProcessor。
    		sortPostProcessors(internalPostProcessors, beanFactory);
    		registerBeanPostProcessors(beanFactory, internalPostProcessors);
    
    		// 将用于检测内部 bean 的后处理器重新注册为 ApplicationListeners,
    		// 将其移动到处理器链的末端(用于获取代理等)。
    		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    	}
    
  8. 来到refresh方法的27行。 initMessageSource()

    初始化MessageSource工作包括:国际化,消息绑定,消息解析等。

    定义如下

    protected void initMessageSource() {
        
        	//获取容器
    		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        
        	//判断容器中是否有id为MESSAGE_SOURCE_BEAN_NAME的组件
    		if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
                //如果有 赋值给自己的属性
    			this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
    			// 使 MessageSource 知道父 MessageSource。
    			if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {				
    				HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
    				if (hms.getParentMessageSource() == null) {
                        // 如果容器中没有id为MESSAGE_SOURCE_BEAN_NAME的组件 则创建一个默认的
    					hms.setParentMessageSource(getInternalParentMessageSource());
    				}
    			}
                
                //用于debug环境下打印提示信息
    			if (logger.isTraceEnabled()) {
    				logger.trace("Using MessageSource [" + this.messageSource + "]");
    			}
    		}
    		else {
    			//给容器中注册空的 MessageSource 使得容器可以接受 getMessage 的调用
    			DelegatingMessageSource dms = new DelegatingMessageSource();
    			dms.setParentMessageSource(getInternalParentMessageSource());
    			this.messageSource = dms;
    			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
    			if (logger.isTraceEnabled()) {
    				logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
    			}
    		}
    	}
    
  9. 接着来到refresh方法的30行 initApplicationEventMulticaster();

    protected void initApplicationEventMulticaster() {
        
        	//获取容器
    		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
        	//如果容器中存在APPLICATION_EVENT_MULTICASTER_BEAN_NAME
    		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 + "]");
    			}
    		}
        	
    		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() + "]");
    			}
    		}
    	}
    
  10. 接着来到refresh方法的32行 onRefresh();

    ? 主要初始化特定上下文子类中的其他特殊 bean。

    protected void onRefresh() throws BeansException {
    		// For subclasses: do nothing by default.
    	}
    

    空实现,留给子类重写,然后在容器刷新的时候,自定义逻辑。

  11. 接着来到refresh方法的36行 registerListeners();

    将所有的监听器注册到容器中

    protected void registerListeners() {
    		// 拿到所有的监听器
    		for (ApplicationListener<?> listener : getApplicationListeners()) {
    			getApplicationEventMulticaster().addApplicationListener(listener);
    		}
    
    		// 将每个监听器添加到事件派发器中
    		String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
    		for (String listenerBeanName : listenerBeanNames) {
    			getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
    		}
    
    		// 派发之前步骤产生的事件
    		Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
    		this.earlyApplicationEvents = null;
    		if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
    			for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
    				getApplicationEventMulticaster().multicastEvent(earlyEvent);
    			}
    		}
    	}
    
  12. 接着来到refresh方法的39行 finishBeanFactoryInitialization

    实例化所有的单实例bean

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));
		}

		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();

		// 初始化剩下的单实例bean
		beanFactory.preInstantiateSingletons();
	}

? 在此方法中,所有的代码都是为了最后一步初始化单实例bean,26行中调用了容器的preInstantiateSingletons方法 定义如下

public void preInstantiateSingletons() throws BeansException {
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Pre-instantiating singletons in " + this);
        }
		// 首先获取所有的bean
        List<String> beanNames = new ArrayList(this.beanDefinitionNames);
        Iterator var2 = beanNames.iterator();

    	// 遍历所有的bean 依次实例化
        while(true) {
            String beanName;
            Object bean;
            do {
                while(true) {
                    RootBeanDefinition bd;
                    do {
                        do {
                            do {
                                if (!var2.hasNext()) {
                                    var2 = beanNames.iterator();

                                    while(var2.hasNext()) {
                                        beanName = (String)var2.next();
                                        Object singletonInstance = this.getSingleton(beanName);
                                        
                                        //如果bean是单实例的
                                        if (singletonInstance instanceof SmartInitializingSingleton) {
                                            StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize").tag("beanName", beanName);
                                            SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton)singletonInstance;
                                            if (System.getSecurityManager() != null) {
                                                AccessController.doPrivileged(() -> {
                                                    smartSingleton.afterSingletonsInstantiated();
                                                    return null;
                                                }, this.getAccessControlContext());
                                            } else {
                                                smartSingleton.afterSingletonsInstantiated();
                                            }

                                            smartInitialize.end();
                                        }
                                    }

                                    return;
                                }

                                beanName = (String)var2.next();
                                bd = this.getMergedLocalBeanDefinition(beanName);
                            } while(bd.isAbstract());
                        } while(!bd.isSingleton());
                    } while(bd.isLazyInit());

                    if (this.isFactoryBean(beanName)) {
                        bean = this.getBean("&" + beanName);
                        break;
                    }

                    this.getBean(beanName);
                }
            } while(!(bean instanceof FactoryBean));

            FactoryBean<?> factory = (FactoryBean)bean;
            boolean isEagerInit;
            if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                SmartFactoryBean var10000 = (SmartFactoryBean)factory;
                ((SmartFactoryBean)factory).getClass();
                isEagerInit = (Boolean)AccessController.doPrivileged(var10000::isEagerInit, this.getAccessControlContext());
            } else {
                //判断是否是SmartFactoryBean接口的bean
                isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean)factory).isEagerInit();
            }
			// 如果是 则调用ban自己重写的getObject方法创建组件
            if (isEagerInit) {
                this.getBean(beanName);
            }
        }
    }

? 对所有的Bean进行实例化主要的步骤如下:

  1. 获取所有的bean , 然后进行遍历 ,

  2. 判断如果bean是单实例的,并且没有实现SmartFactoryBean接口,则进行实例化,

  3. 如果实现了SmartFactoryBean,则调用它重写的getObjece()方法,实例化组件。

    1. 首先调用getBean(name)方法,73行所示
    2. 通过Debug,发现调用了doGetBean(name,null,null,false)方法
      1. 首先获取缓存中保存的单实例bean,如果能获取到,说明之前已经被创建过了,(所有的单实例bean在创建的时候都会被缓存)
      2. 如果没有拿到,则开始创建过程
        1. 首先获取父工厂,然后标记当前的bean已经被创建(防止多线程下的安全问题)
        2. 获取bean的定义信息,并获取 bean依赖的其他bean。将按照同样的getBean方法对依赖的进行创建。
        3. 调用createBean方法
          1. beanPostProcessor创建代理对象的机会。
          2. 如果1中返回的不为Null,则利用代理对象进行创建bean,并成功返回bean
          3. 如果1中返回为Null,则进入doCreateBean(name)
            1. 调用createBeanInstance方法,此时,Debug进入bean的构造方法,实例出bean对象。
            2. 添加到缓存中。
            3. 执行populateBean()
              1. 拿到bean的所有后置处理器并执行方法。
              2. 执行applyPropertyValues()方法 为bean的属性利用反射机制中获取的set方法进行赋值。
              3. 判断bean中是否实现了执行init接口或者是否在注解中指定了Init方法,如果有,则回调bean的初始化方法。即自定义的Init方法。
              4. 执行后置处理器初始化之后的方法。
            4. doCreateBean(name)执行完毕,创建bean完成。
          4. 判断bean中是否实现了销毁接口或者是否在注解中指定了销毁方法,如果有,注册bean的销毁方法(非执行)。
        4. doCreateBean(name)结束,bean对象创建完成。
      3. createBean方法完成,bean对象创建完成。将其添加到单实例bean的列表中。
    3. 循环中的bean创建完成
  4. 继续循环迭代,直到数组beanNames中的所有bean创建完毕。

  5. 接着来到refresh方法的39行 finishRefresh();

    最后一步:完成容器的初始化工作,发布相应的事件。

    protected void finishRefresh() {
    		// 清除上下文级资源缓存
    		clearResourceCaches();
    
    		//初始化和生命周期有关的后置处理器。
    		initLifecycleProcessor();
    
    		getLifecycleProcessor().onRefresh();
    
    		//发布最终事件。
    		publishEvent(new ContextRefreshedEvent(this));
    
    
    		if (!NativeDetector.inNativeImage()) {
    			LiveBeansView.registerApplicationContext(this);
    		}
    	}
    
  6. 至此,Spring的IOC容器创建完毕。

总结

  1. Spirng容器启动的时候,首先保存所有已经注册的bean的定义信息

    1. 通过XML,或者注解定义bean的信息。
  2. 容器会在合适的时机创建bean。

    1. 单例模式,会在启动容器的时候,统一循环创建。
    2. 非单例模式时,在用到bean的时候,利用getBean创建,并保存在容器中
  3. 每一个Bean创建完成都会使用各种后置处理器来增强Bean的功能。

    • 比如AutowiredAnnotationBeanPostProcessorBean用来处理自动注入的功能。
    • 比如AnnotationAwareAspectJAutoProxyCreatorBean用来AOP切面功能。
    • ……
  4. 事件驱动模型

    1. ApplicationListener : 事件监听
    2. ApplicationEventMuiticaster: 事件派发
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:31:22  更:2021-07-25 11:31:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 11:12:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码