spring源码初讲

spring的ioc和aop的核心——容器刷新refresh()方法详解:

常用方法介绍

ConfigurableListableBeanFactory.getBeanNamesForType( Class<?> type, boolean includeNonSingletons, boolean allowEagerInit)

返回与给定类型(包括子类)匹配的bean的名称,根据bean定义或{@code getObjectType}*的值判断(对于FactoryBeans)。

注意:这个方法只内省顶级bean。它不检查可能也与指定类型匹配的嵌套bean。

如果设置了“allowEagerInit”标志,这意味着FactoryBeans将被初始化,则考虑由FactoryBeans创建的对象。如果FactoryBean创建的对象不匹配,则原始FactoryBean本身将与type匹配。如果未设置“allowEagerInit”,则只检查原始FactoryBeans(这不需要初始化每个FactoryBean)。

不考虑该工厂可能参与的任何层级。使用BeanFactoryUtils{@codebeannamesfortypeincluding祖先}也将bean包含在祖先工厂中。*

注意:不要忽略通过bean定义以外的方法注册的单例bean。

此方法返回的Bean名称应尽可能按照后端配置中定义的*顺序返回Bean名称

public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {

		super(parent);//读取环境参数并设置进spring配置信息里面
		setConfigLocations(configLocations);//设置config文件路径
		if (refresh) {
			refresh();//spring核心,刷新容器方法
		}
	}
private static void invokeBeanDefinitionRegistryPostProcessors(
			Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {

		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		}
	}

postProcessor.postProcessBeanDefinitionRegistry(registry)最终会跳转到ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()中,该方法的作用——扫描和注册后置处理器

refresh()方法详解

@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.
			//告诉子类刷新内部bean工厂  
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            //配置工厂信息
			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				//允许context子类对bean工厂中进行后置处理
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				//执行bean工厂后置处理器扩展BeanDefinitionRegistry的方法
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				//注册bean后置处理器
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				//初始化messageSource
				initMessageSource();

				// Initialize event multicaster for this context.
				//初始化applicationEventMulticaster
				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.
				//实例化beancactory
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				//完成此上下文的刷新,调用LifecycleProcessor的onRefresh()方法并发布
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					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;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

prepareRefresh()——注册一堆监听器

prepareRefresh()内的validateRequiredProperties()方法解析
    MissingRequiredPropertiesException ex = new MissingRequiredPropertiesException();
		for (String key : this.requiredProperties) {
			if (this.getProperty(key) == null) { //如果该key解析为null则在MissingRequiredPropertiesException添加一处错误
				ex.addMissingRequiredProperty(key);
			}
		}
		if (!ex.getMissingRequiredProperties().isEmpty()) { //如果MissingRequiredPropertiesException的元素不为null,则手动抛出异常
			throw ex;
		}
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors)

简单来说:
先定义一个存放bean工厂后置处理器名的集合processedBeans,然后判断改bean工厂后置处理器是否属于BeanDefinitionRegistry类型,不属于则{直接调用bean工厂的后置处理器},属于则{定义存放后置处理器的集合——regularPostProcessors、registryProcessors,循环遍历bean工厂后置处理器并根据类型分辨存入regularPostProcessors、registryProcessors两个集合中。然后定义一个缓存集合currentRegistryProcessors。反射出所有的currentRegistryProcessors。排出优先级,每个优先级都执行排序currentRegistryProcessors、currentRegistryProcessors存入registryProcessors、实例化currentRegistryProcessors处理器、清空currentRegistryProcessors处理器。最后注册registryProcessors、regularPostProcessors}。反射出一堆bean工厂后置处理器名,定义三个后置处理器集合,分别装载三个优先级的后置处理器。然后根据后置处理器优先级把该后置处理器实例化。清除bean工厂的缓存。

BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor区别

BeanDefinitionRegistryPostProcessor 侧重于创建自定义的bd 而 BeanFactoryPostProcessor侧重于对已有bd属性的修改。
BeanDefinitionRegistryPostProcessor 先于 BeanFactoryPostProcessor 执行

bean后置处理器执行优先级

PriorityOrdered————>Ordered————>nonOrdered

registerBeanPostProcessors()详解

PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this)详解

简单来说:
首先反射出所有bean后置处理器并将其转为数组postProcessorNames,然后检查是否所有的bean后置处理器都走完了。其次定义三个集合装载三种优先级的bean后置处理器,并且注册到spring。最后注册applicationContext

initMessageSource()——spring国际化

initApplicationEventMulticaster()——初始化多播器

registerListeners()——此方法用于注册侦听器

finishBeanFactoryInitialization()——完成bean初始化

finishRefresh()——准备完成

getBean()详解——获取bean,没有则创建,已有则从一级缓存获取
registerDependentBean()详解——注册bean
getSingleton()详解——获取单例bean
createBean()——创建单例bean
从三级缓存中找有没有这个单例对象

spring循环依赖解决办法

假设两个bean,分别为A和B

class A{
    private B b;
    
    setter/getter
}

class B{
    private A a;
    
    setter/getter
}

通过反射实例化A,注:此时A的状态为创建中,调用addSingletonFactory()把(A,getEarlyBeanReference(beanName, mbd, bean))放入三级缓存,循环检测property,检测到B,调用getSingleton查看三级缓存有没有b,没有,调用doCreateBean()实例化B,调用调用addSingletonFactory()把(B,getEarlyBeanReference(beanName, mbd, bean))放入三级缓存,循环检测property,检测到A, 调用getSingleton()。此时,一级缓存(singletonObject)找不到A,且A在创建中,在三级缓存(singletonFactories)清除A并且缓存把A放入二级缓存(earlySingletonObjects),返回至AbstractAutowireCapableBeanFactory,执行applyPropertyValues()里面的bw.setPropertyValues(new MutablePropertyValues(deepCopy))方法把A值赋给B,此时B属于创建完成状态(实例化和初始化都完成),调用方法DefaultSingletonBeanRegistry.addSingleton()方法从B(b,B)放入一级缓存(singletonObject)并从二级缓存(earlySingletonObjects)和三级缓存(singletonFactories)删除B。返回至实例化A的AbstractAutowireCapableBeanFactory.applyPropertyValues()处给A里面的属性B赋值(用刚才创建的B对象赋值),注:A的状态为创建完成,把A从二级缓存(earlySingletonObjects)和三级缓存(singletonFactories)中清除并把A放入一级缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值