Spring源码分析之IOC (四)

之前分别在Spring源码分析之IOC (二)Spring源码分析之IOC (三)中分析了spring解析和注册自定义标签的代码,最终转化为BeanDefinition保存在IOC容器的beanDefinitionMap中,本篇接着 Spring源码分析之IOC (一)继续往下分析。

 如上图注释:prepareBeanFactory是对Spring容器进行功能补充,设置classLoader、解析器、注册beanPostProcessor、环境设置等,没有其他的特殊逻辑。以下是该方法中对应的代码

/**
 * Configure the factory's standard context characteristics,
 * such as the context's ClassLoader and post-processors.
 * @param beanFactory the BeanFactory to configure
 */
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
   //设置beanFactory相关功能属性,调用父类AbstractBeanFactory的set方法,供所有继承的子类使用
   //BeanClassLoader(类加载器)、BeanExpressionResolver(Spring EL表达式解析器)、PropertyEditorRegistrar(Spring扩展点,添加一个属性编辑器的注册器)
   beanFactory.setBeanClassLoader(getClassLoader());
   beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
   beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

   // Configure the bean factory with context callbacks.
   // 配置Aware的前置处理器ApplicationContextAwareProcessor,
   // 同时设置ignoreDependencyInterface,在bean自动装配时就会被忽略这六个Aware接口
   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);


   //设置依赖注入的值,保存到resolvableDependencies中,底层是Map结构,将
   //BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext类型作为key,对应的beanFactory等作为value
   //在自动注入的时候,如果遇到是BeanFactory等这些类型的就自动注入为当前映射的value值,如果不这么做,比如BeanFactory是有多个实现类的,
   //spring在自动注入的时候是不知道该注入哪一个,就会抛出异常,同理,如果我们一个接口如果有多个实现类,在设置自动注入的时候,也是会报错
   //这个时候就需要指明到底需要注入哪个实现类
   beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
   beanFactory.registerResolvableDependency(ResourceLoader.class, this);
   beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
   beanFactory.registerResolvableDependency(ApplicationContext.class, this);

   // Register early post-processor for detecting inner beans as ApplicationListeners.
   //ApplicationListenerDetector实现了BeanPostProcessor,主要左右是在bean实例化时,如果bean属于ApplicationListener
   //则将bean加入到IOC容器的applicationListeners变量中
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

   // Detect a LoadTimeWeaver and prepare for weaving, if found.
   if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
      //LoadTimeWeaverAwareProcessor用于AOP,也是dBeanPostProcessor,在bean实例化时设置LoadTimeWeaver属性
      beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
      // Set a temporary ClassLoader for type matching.
      beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
   }

   // Register default environment beans.
   //设置默认的系统属性到IOC容器总,分别是environment、systemProperties、systemEnvironment
   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());
   }
}
 

接着往下看,refresh()方法使用的是设计模式中的模板模式,而postProcessBeanFactory(beanFactory)方法就是留给子类去扩展的,设置一些自己特有的业务需求。

继续看invokeBeanFactoryPostProcessors(beanFactory)方法,该方法是执行已经提前注册的工厂处理器,进入invokeBeanFactoryPostProcessors中可以看到主要是委托给PostProcessorRegistrationDelegate去执行invokeBeanFactoryPostProcessors。

	//实例化并调用所有注册的BeanFactoryPostProcessor,必须在单例实例化之前调用。
	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		//PostProcessorRegistrationDelegate是AbstractApplicationContext委托执行post processors任务的工具类
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
		// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}

继续进入PostProcessorRegistrationDelegate的 invokeBeanFactoryPostProcessors方法中,注释很详细,没有对postProcessBeanDefinitionRegistry和postProcessBeanFactory进行深入研究,感兴趣的话可以一步一步debug看下,重点关注ConfigurationClassPostProcessor,该类扫描了应用中的所有可被注册的bean,并加载到容器中。

public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
		//processedBeans用于过滤执行过的BeanFactoryPostProcessor,已经执行过的都会添加到该集合中,来保证不会重复执行
		Set<String> processedBeans = new HashSet<>();
		//beanFactory为DefaultListableBeanFactory,是BeanDefinitionRegistry的子类,进入if代码块
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			//普通的BeanFactoryPostProcessor类集合
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			//BeanDefinitionRegistryPostProcessor类集合,BeanDefinitionRegistryPostProcessor继承BeanFactoryPostProcessor类
			//比如后面ConfigurationClassPostProcessor会给Configuration类进行功能增强,如替换了Configuration类的class引用等
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				//如果BeanDefinitionRegistryPostProcessor,执行postProcessBeanDefinitionRegistry方法,主要是给registry增加功能类
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					registryProcessors.add(registryProcessor);
				}
				else {
					regularPostProcessors.add(postProcessor);
				}
			}

			//currentRegistryProcessors为实现了PriorityOrdered, Ordered接口的BeanDefinitionRegistryPostProcessor集合,会先执行实现PriorityOrdered,再执行实现Ordered的接口
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// 首先,执行实现了PriorityOrdered的BeanDefinitionRegistryPostProcessors,此时只有一个ConfigurationClassPostProcessor;
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			//排序
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			//currentRegistryProcessors中此时只有ConfigurationClassPostProcessor类,开始执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,
			//即ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry方法, 此类在spring中起着非常重要的角色
			//主要是用来解析@PropertySource、@ComponentScans、@Import、@Bean等注解,将有@Service,@Component等注解的类全部解析成BeanDefine保存到beanFactory中
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			//清除实现了PriorityOrdered,开始保存实现Ordered的BeanDefinitionRegistryPostProcessor
			currentRegistryProcessors.clear();

			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				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);
			//开始执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,此时currentRegistryProcessors是个空集合
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

			//最后执行所有剩余的BeanDefinitionRegistryPostProcessors接口
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					//如果之前已经执行过,就过滤掉,默认是没有其他的BeanDefinitionRegistryPostProcessors可以执行了,但是如果接入了第三方,此时可能会执行第三方的BeanDefinitionRegistryPostProcessors
					//比如接入了dubbo,就会执行DubboConfigAliasPostProcessor等
					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);
				currentRegistryProcessors.clear();
			}

			//开始执行BeanFactoryPostProcessor的postProcessBeanFactory方法,比如ConfigurationClassPostProcessor会在这一步会通过ConfigurationClassEnhancer的enhance方法增强应用中的Configuration对象,替换class引用等
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// Invoke factory processors registered with the context instance.
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

		//上面是执行了BeanDefinitionRegistryPostProcessor的扩展方法,接下来执行BeanFactoryPostProcessor的扩展方法,
		// 当然BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口,所以会通过processedBeans去过滤掉
		// 这里执行也是更上面一样,先执行先执行实现PriorityOrdered,再执行实现Ordered的接口,最后再执行没有实现该排序的BeanFactoryPostProcessor类
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			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);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// Finally, invoke all other BeanFactoryPostProcessors.
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

		// Clear cached merged bean definitions since the post-processors might have
		// modified the original metadata, e.g. replacing placeholders in values...
		beanFactory.clearMetadataCache();
	}

继续根据主流程往下看registerBeanPostProcessors(beanFactory),往beanFacatory中注册BeanPostProcessor,在getBean的时候调用,属于spring的一个扩展,用来在创建bean的过程中对bean进行一些自定义设置,进入该方法,发现依然是交给PostProcessorRegistrationDelegate来处理。

	protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		//委托给PostProcessorRegistrationDelegate处理
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
	}

继续进入registerBeanPostProcessors方法中发现最终都是beanFactory.addBeanPostProcessor,且有顺序的add,保证后面创建bean的时候以此执行BeanPostProcessor的扩展方法。

public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

		//注册BeanPostProcessorChecker,在执行链最开始的位置,用来在执行整个链时打印日志
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		//同之前的invokeBeanFactoryPostProcessors一样,先注册实现了PriorityOrdered的BeanPostProcessor,接着是Ordered,最后是普通的BeanPostProcessor
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		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);

		// Next, register the BeanPostProcessors that implement Ordered.
		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);
			}
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// 接着, 注册普通的BeanPostProcessors.
		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);

		// 最后, 注册所有MergedBeanDefinitionPostProcessor处理器,在创建bean的时候放到最后执行
		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

		// 注册ApplicationListenerDetector
		// moving it to the end of the processor chain (for picking up proxies etc). 放到执行链末尾执行
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

继续沿着主线走,initMessageSource(),顾名思义是初始化MessageSource,主要是通过配置,后面可以在容器中直接获取相应的资源信息,项目中很少用的,就不多说了。

紧接着是initApplicationEventMulticaster(),初始化事件广播器,spring有一套事件广播监听机制,这里就是先初始化下广播器,后面通过multicastEvent方法来发布事件,也不用多说。

然后onRefresh()也是需要子类去实现的,跳过。

接着就是registerListeners(),注册监听器,就是从刚刚初始化的事件广播器中添加Listeners,以下是根据debug展示的监听器

 

 再接下来就是实例化所有已经在容器中解析的BeanDefinition.这个我们留到下一篇再分析。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值