• Spring容器初始话原理图


    主流程入口

    ApplicationContext context = new ClassPathXmlApplicationContext(“spring.xml”)

    ClassPathXmlApplicationContext类:重载的构造方法依次调用,进入下面代码

     

    AbstractApplicationContext的refresh方法:初始化spring容器的核心代码

    public void refresh() throws BeansException, IllegalStateException {
    
        synchronized (this.startupShutdownMonitor) {
    
                //1、 Prepare this context for refreshing.
                prepareRefresh();
    
                //创建DefaultListableBeanFactory(真正生产和管理bean的容器)
                //BeanDefinition处理
                // 1 定位XML文件(Resource、ResourceLoader)
                // 2 加载XML(Document、Dom4j解析)
                // 3 从Document对象中解析BeanDefinition然后注册到BeanDefinitionRegistry(Map)
                //通过NamespaceHandler解析自定义标签的功能(比如:context标签、aop标签、tx标签)
    
                //2、 Tell the subclass to refresh the internal bean factory.
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
                //3、 Prepare the bean factory for use in this context.
                prepareBeanFactory(beanFactory);
    
                try {
    
                    //4、 Allows post-processing of the bean factory in context subclasses.
                    postProcessBeanFactory(beanFactory);
    
                    //实例化并调用实现了BeanFactoryPostProcessor接口的Bean
                    //比如:PropertyPlaceHolderConfigurer(context:property-placeholer)
                    //就是此处被调用的,作用是替换掉BeanDefinition中的占位符(${})中的内容
                    //5、 Invoke factory processors registered as beans in the context.
                    invokeBeanFactoryPostProcessors(beanFactory);
    
    
                    //创建并注册BeanPostProcessor到BeanFactory中(Bean的后置处理器)
                    //比如:AutowiredAnnotationBeanPostProcessor(实现@Autowired注解功能)
                    //RequiredAnnotationBeanPostProcessor(实现@Required注解功能)
                    //这些注册的BeanPostProcessor
                    //6、 Register bean processors that intercept bean creation.
                    registerBeanPostProcessors(beanFactory);
                    
                    //7、 Initialize message source for this context.
                    initMessageSource();
                    
                    //8、 Initialize event multicaster for this context.
                    initApplicationEventMulticaster();
                    
                    //9、 Initialize other special beans in specific context subclasses.
                    onRefresh();
                    
                    //10、 Check for listener beans and register them.
                    registerListeners();
    
                    //1 通过构造方法,创建Bean的实例。此处的Bean是非懒加载方式的单例Bean(未设置属性)
                    //2 填充属性(DI,依赖注入)---循环依赖(A中有B的依赖、B中有A的依赖)
                    //3 初始化实例(比如调用init-method方法)
                    // 调用BeanPostProcessor(后置处理器)对实例bean进行后置处理(AOP功能)
                    //11、 Instantiate all remaining (non-lazy-init) singletons.
                    finishBeanFactoryInitialization(beanFactory);
                        
                    //12、 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();
                }
        }
    }

  • 相关阅读:
    struts1下载地址
    基础知识浮点数
    基础知识this[String]
    矩阵基础知识(二)
    矩阵基础知识(三)
    設計公司軟件開發需求分析流程
    動態調用js文件
    图片的淡入淡出的实现方法
    IIS7.5(经典/集成),IIS6,asp.net 4.0下配置Url映射(asp.net mvc)
    页面状态加载....
  • 原文地址:https://www.cnblogs.com/amiezhang/p/9691575.html
Copyright © 2020-2023  润新知