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

 

posted on 2021-07-01 15:32  The羿  阅读(92)  评论(0编辑  收藏  举报

导航