[Análisis de código fuente] Código fuente de DEBUG Spring IOC

SpringIOC

声明: 此博客仅记录本人DUBUG源码步骤

Diagrama aproximado:

Inserte la descripción de la imagen aquí

  1. Cargue el archivo xml

Inserte la descripción de la imagen aquí


Inserte la descripción de la imagen aquí

método setConfigLocations

Inserte la descripción de la imagen aquí

  1. Llamar al método Refresh

Inserte la descripción de la imagen aquí

Método de actualización

¡Los métodos de preparación * son todos preparativos!

@Override
	public void refresh() throws BeansException, IllegalStateException {
    
    
		synchronized (this.startupShutdownMonitor) {
    
    
			// Prepare this context for refreshing.
         	// 准备工作
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
            // 实例化BeanFactory
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
            // 准备工作,设置或忽略Factory中的一些对箱子
			prepareBeanFactory(beanFactory);

			try {
    
    
				// Allows post-processing of the bean factory in context subclasses.
                // 做扩展
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
                // 实例化并执行BeanFactoryPostProcessors
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
                // 注册BeanPostProcessors
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
                // 国际化处理
				initMessageSource();

				// Initialize event multicaster for this context.
                // 初始化一个广播器
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
                // 扩展
				onRefresh();

				// Check for listener beans and register them.
                // 注册监听器
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
                // 实例化Bean
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
                // 刷新
				finishRefresh();
			}

			catch (BeansException ex) {
    
    
				logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}

método prepareRefresh ()

Inserte la descripción de la imagen aquí

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 创建BeanFactory对象

Inserte la descripción de la imagen aquí

método refreshBeanFactory

Inserte la descripción de la imagen aquí

prepareBeanFactory(beanFactory);

Las características de contexto estándar de la fábrica de configuración, como el cargador de clases y el postprocesador del contexto.

Inserte la descripción de la imagen aquí

postProcessBeanFactory(beanFactory);

Extensión de subclase

Inserte la descripción de la imagen aquí

invokeBeanFactoryPostProcessors(beanFactory)

¡Cree una instancia y ejecute BeanFactoryPostProcessors!

Inserte la descripción de la imagen aquí

registerBeanPostProcessors(beanFactory)

Registrar bean BeanPostProcessor

Inserte la descripción de la imagen aquí

initMessageSource();

Procesamiento internacional!

Inserte la descripción de la imagen aquí

initApplicationEventMulticaster()

¡Inicialice una emisora!

Inserte la descripción de la imagen aquí

registerListeners()

¡Registre al oyente!

Inserte la descripción de la imagen aquí

finishBeanFactoryInitialization (beanFactory);

Instancia de frijol

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

@Override
	public void preInstantiateSingletons() throws BeansException {
    
    
		if (this.logger.isDebugEnabled()) {
    
    
			this.logger.debug("Pre-instantiating singletons in " + this);
		}

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
		List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
		for (String beanName : beanNames) {
    
    
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
    
    
				if (isFactoryBean(beanName)) {
    
    
					final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
    
    
						isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
    
    
							@Override
							public Boolean run() {
    
    
								return ((SmartFactoryBean<?>) factory).isEagerInit();
							}
						}, getAccessControlContext());
					}
					else {
    
    
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {
    
    
						getBean(beanName);
					}
				}
				else {
    
    
					getBean(beanName);
				}
			}
		}

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

En el método doGetBean

Inserte la descripción de la imagen aquí

En el método createBean

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

En el método createBeanInstance, los objetos Bean se crean mediante una serie de lógica de reflexión

Inserte la descripción de la imagen aquí

Utilice valores de atributo para poblar instancias de Bean en un BeanWrapper dado

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

En este punto, el Bean se crea y se crea una instancia.

finishRefresh ()

Para completar la actualización de este contexto, llame al método onRefresh () de LifecycleProcessor y publique

Inserte la descripción de la imagen aquí

Adjunto: ciclo de vida de Bean

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_42380734/article/details/108059099
Recomendado
Clasificación