上节我们debug到

1 // Tell the subclass to refresh the internal bean factory.
2 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

我们继续debug 下一步:配置beanfactory的上下文

 1     /**
 2      * Configure the factory's standard context characteristics,
 3      * such as the context's ClassLoader and post-processors.
 4      * @param beanFactory the BeanFactory to configure
 5      */
 6     protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
 7         // Tell the internal bean factory to use the context's class loader.
 8         beanFactory.setBeanClassLoader(getClassLoader());
 9
10         // Populate the bean factory with context-specific resource editors.
11         beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this));
12
13         // Configure the bean factory with context callbacks.
14         beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
15         beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
16         beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
17         beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
18         beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
19
20         // BeanFactory interface not registered as resolvable type in a plain factory.
21         // MessageSource registered (and found for autowiring) as a bean.
22         beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
23         beanFactory.registerResolvableDependency(ResourceLoader.class, this);
24         beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
25         beanFactory.registerResolvableDependency(ApplicationContext.class, this);
26
27         // Detect a LoadTimeWeaver and prepare for weaving, if found.
28         if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME) && JdkVersion.isAtLeastJava15()) {
29             // Register the (JDK 1.5 specific) LoadTimeWeaverAwareProcessor.
30             try {
31                 Class ltwapClass = ClassUtils.forName(
32                         "org.springframework.context.weaving.LoadTimeWeaverAwareProcessor",
33                         AbstractApplicationContext.class.getClassLoader());
34                 BeanPostProcessor ltwap = (BeanPostProcessor) BeanUtils.instantiateClass(ltwapClass);
35                 ((BeanFactoryAware) ltwap).setBeanFactory(beanFactory);
36                 beanFactory.addBeanPostProcessor(ltwap);
37             }
38             catch (ClassNotFoundException ex) {
39                 throw new IllegalStateException("Spring's LoadTimeWeaverAwareProcessor class is not available");
40             }
41             // Set a temporary ClassLoader for type matching.
42             beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
43         }
44     }

下面是下一步要debug的内容:

                // Allows post-processing of the bean factory in context subclasses.                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.                initMessageSource();

                // Initialize event multicaster for this context.                initApplicationEventMulticaster();

                // 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);

                // Last step: publish corresponding event.                finishRefresh();

初始化singletonbean(DefaultListableBeanFactory.java#preInstantiateSingletons())

 1     public void preInstantiateSingletons() throws BeansException {
 2         if (this.logger.isInfoEnabled()) {
 3             this.logger.info("Pre-instantiating singletons in " + this);
 4         }
 5
 6         synchronized (this.beanDefinitionMap) {
 7             for (Iterator it = this.beanDefinitionNames.iterator(); it.hasNext();) {
 8                 String beanName = (String) it.next();
 9                 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
10                 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
11                     if (isFactoryBean(beanName)) {
12                         FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName);
13                         if (factory instanceof SmartFactoryBean && ((SmartFactoryBean) factory).isEagerInit()) {
14                             getBean(beanName);
15                         }
16                     }
17                     else {
18                         getBean(beanName);
19                     }
20                 }
21             }
22         }
23     }

结束动作:发布事件

 1     public void publishEvent(ApplicationEvent event) {
 2         Assert.notNull(event, "Event must not be null");
 3         if (logger.isTraceEnabled()) {
 4             logger.trace("Publishing event in context [" + getId() + "]: " + event);
 5         }
 6         getApplicationEventMulticaster().multicastEvent(event);
 7         if (this.parent != null) {
 8             this.parent.publishEvent(event);
 9         }
10     }

转载于:https://www.cnblogs.com/davidwang456/archive/2013/03/12/2955025.html

spring启动过程之源码跟踪(中)--spring Debug相关推荐

  1. spring启动过程之源码跟踪(小结bean的生命周期)--spring Debug

    spring in action 1.容器发现bean的定义,初始化bean 2.使用依赖注入的方式,spring根据bean定义,设置bean的所有属性 3.如果bean继承了BeanNameAwa ...

  2. spring启动过程之源码跟踪(下)--spring Debug

    在web应用启动入口是ContextLoaderListener,它是怎么完成启动过程的呢? 首先: public class ContextLoaderListenerextends Object ...

  3. spring启动过程之源码跟踪(续beanfactory)--spring Debug

    1.初始化过程 1 Resource res = new ClassPathResource("/applicationContext.xml"); 2 XmlBeanFactor ...

  4. spring启动过程之源码跟踪(上)--spring Debug

    1,初始化容器 1 ClassPathXmlApplicationContext context=new 2 ClassPathXmlApplicationContext("/applica ...

  5. spring session spring:session:sessions:expires 源码跟踪

    2019独角兽企业重金招聘Python工程师标准>>> spring session spring:session:sessions:expires 源码跟踪 博客分类: sprin ...

  6. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  7. spring 启动之全过程 源码解析

    主类代码 public class BeanLifeCycle {public static void main(String[] args) {System.out.println("现在 ...

  8. Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】

      基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图 ...

  9. 从源码深处体验Spring核心技术--面试中IOC那些鲜为人知的细节

    通过前面章节中对 Spring IOC 容器的源码分析,我们已经基本上了解了 Spring IOC 容器对 Bean 定义资源的定位.载入和注册过程,同时也清楚了当用户通过 getBean()方法向 ...

最新文章

  1. 数据中台:宜信敏捷数据中台建设实践
  2. 求a^b前n位和后n位
  3. OSX 10.8+下开启Web 共享 的方法
  4. 数据挖掘竞赛-北京PM2.5浓度回归分析训练赛
  5. win10安装mudbox失败,怎么强力卸载删除注册表并重新安装
  6. 【算法】剑指 Offer 42. 连续子数组的最大和 【重刷】
  7. 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
  8. 正则匹配emoji字符
  9. 计算机硬件关系密切,与计算机硬件关系最密切的软件是.
  10. Unity 跳转第三方App
  11. 十大IT危机处理高手
  12. Spark 创建 hive表报错 ROW FORMAT DELIMITED is only compatible with 'textfile', not 'parquet'
  13. 华为java一个月写多少行代码_[财经]阿里员工吐槽华为:面试官1万行代码都没写过? - 南方财富网...
  14. 微信跳一跳刷分代码剖析
  15. 猿创征文|聊一聊我在字节跳动做项目质量改进的经验
  16. Future 模式详解(并发使用)
  17. 学c语言的第一篇博客~
  18. Windows11镜像下载及安装
  19. MATLAB+GUI:手动修改曲线中的点
  20. 柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户

热门文章

  1. php setrawcookie,PHP setrawcookie() 函数
  2. java nginx tomcat_Nginx + Tomcat (java )服务器部署
  3. js监听select值变化_网络编程——C++实现socket通信(TCP)高并发之select模式
  4. 荧光皮肤有哪些_价格适中又显白的口红有哪些?MAC占大头,KIKO卡拉泡泡超平价...
  5. tf.reverse
  6. Ubuntu 里的Spyder不能切换中文输入
  7. 计算机专业的金书,《计算机专业英语》书评,金书网
  8. c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解
  9. 打印二叉树的边界节点
  10. Tensorflow实现MNIST数据自编码(2)