spring源码相关第二篇----------------------------spring ioc创建流程图与源码
spring ioc的流程图
spring ioc相关之前bean解析的博客已经做了介绍,这里就不多做解析,下面贴一下refresh方法
public void refresh() throws BeansException, IllegalStateException { //加锁,防止多线程重复启动。 synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. //准备刷新 /** * 前戏,做容器刷新的准备工作 * 1.设置容器的启动时间 * 2.设置活跃状态为true * 3.设置关闭状态为false * 4.获取Environment对象,并加载当前系统的属性值到Environment对象中 * 5.准备监听器和时间的集合对象,默认为空的集合 */ prepareRefresh(); // Tell the subclass to refresh the internal bean factory. /* * 获取beanFactory,内部是一个模板方法,如果是xml的方式,会在这个方法内完成beanFactory的创建 * 和对xml的解析,如果是注解的方式,由于beanFactory在创建容器对象时就已经创建, * 所以,在这里只会设置一个序列化化ID并设置刷新状态。 * 创建容器对象:DefaultListableBeanFactory * 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition */ ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. //BeanFactory执行前的准备工作,主要是设置一些属性和注册一些工具对象,初始化Environment,这里会也会创建bean主要是与Environment相关的bean实例对象,操作bean对象的三个缓存 prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. //一个模板方法,可以在子类中对beanfactory进行操作,如注册自定义的PostProcessor。 postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. //执行已注册的beanFactoryPostProcessor的实现类,在这里完成了类的扫描、解析和注册 //自动装配实现的方法,BeanFactoryPostProcessors.使用ConfigurationPostProcessors这个类实现的 //此处是解析mybatis中的mapper接口相关操作,处理bean对象创建的基本工作,同时将实例对象放入到一级或者二级,三级缓存中,解决循环依赖问题,同时创建beanDefinition对象 invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. //把beandefinition中的beanPostProcessors注册到beanPostProcessors集合中,这个也进行bean的实例化操作,操作那三个缓存 registerBeanPostProcessors(beanFactory); // Initialize message source for this context. //初始化消息源,一般用于国际化 initMessageSource(); // Initialize event multicaster for this context. //初始化事件广播器,这个也进行bean的实例化操作,主要是事件广播相关的bean实例化操作,操作那三个缓存 initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. //扩展方法,由子类实现的方法。如:spring boot结合tomcat或者jetty容器 onRefresh(); // Check for listener beans and register them. //往广播器中注册监听器 registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. //实例化所有单例对对象(spring中对象创建都是通过反射的方式创建的),同时完成bean的生命周期回调,同时也是在此方法中实现对于所有的mapper接口中的@Select相关解析操作 //主要我们的@Controller,@Servicebean对象的创建,也是在此处解决用户所定义bean对象相关循环依赖问题 finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. 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(); } } }