Spring 启动过程,bean到底是什么时候通过反射生成实例的

Spring 启动时最重要的方法refresh(),
1. 在obtainFreshBeanFactory();中创建所有对象的BeanDefinition
2. 在finishBeanFactoryInitialization(beanFactory);中创建真正的单例对象,及其依赖对象的绑定


public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {

            //调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识  
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            // 得到所有对象的BeanDefinition
            // 告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从  
            // 子类的refreshBeanFactory()方法启动  
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
                AbstractApplicationContext.refreshBeanFactory();
                AbstractApplicationContext.loadBeanDefinitions(beanFactory);
                AbstractXmlApplicationContext.loadBeanDefinitions(beanDefinitionReader);

            // 为BeanFactory配置容器特性,例如类加载器、事件处理器等  
            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // 为容器的某些子类指定特殊的BeanPost事件处理器 
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // 调用所有注册的BeanFactoryPostProcessor的Bean  
                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // 为BeanFactory注册BeanPost事件处理器.  
                // BeanPostProcessor是Bean后置处理器,用于监听容器触发的事件  
                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // 初始化信息源,和国际化相关.
                // Initialize message source for this context.
                initMessageSource();

                // 初始化容器事件传播器.
                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // 调用子类的某些特殊Bean初始化方法 
                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // 为事件传播器注册事件监听器
                // Check for listener beans and register them.
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                // 初始化容器内所有剩余的单例对象,对象间的依赖关系也在此维护
                finishBeanFactoryInitialization(beanFactory);
                    beanFactory.preInstantiateSingletons();
                    for (String beanName : beanNames) {
                        getBean(beanName);
                    }

                // 初始化容器的生命周期事件处理器,并发布容器的生命周期事件  
                // Last step: publish corresponding event.
                finishRefresh();
            }

            catch (BeansException ex) {
                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/hl_java/article/details/79698775