• 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();
                }
            }
        }
  • 相关阅读:
    38.Linux驱动调试-根据系统时钟定位出错位置
    37.Linux驱动调试-根据oops的栈信息,确定函数调用过程
    36.Linux驱动调试-根据oops定位错误代码行
    35.Linux-分析并制作环形缓冲区
    34.Linux-printk分析、使用__FILE__, __FUNCTION__, __LINE__ 调试
    arm裸板驱动总结(makefile+lds链接脚本+裸板调试)
    33.Linux-实现U盘自动挂载(详解)
    Android插件化技术——原理篇
    Android插件化(五):OpenAtlasの四大组件的Hack
    Android插件化(4):OpenAtlasの插件的卸载与更新
  • 原文地址:https://www.cnblogs.com/chaojibaidu/p/14959015.html
Copyright © 2020-2023  润新知