spring启动过程之源码跟踪(中)--spring Debug
上节我们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相关推荐
- spring启动过程之源码跟踪(小结bean的生命周期)--spring Debug
spring in action 1.容器发现bean的定义,初始化bean 2.使用依赖注入的方式,spring根据bean定义,设置bean的所有属性 3.如果bean继承了BeanNameAwa ...
- spring启动过程之源码跟踪(下)--spring Debug
在web应用启动入口是ContextLoaderListener,它是怎么完成启动过程的呢? 首先: public class ContextLoaderListenerextends Object ...
- spring启动过程之源码跟踪(续beanfactory)--spring Debug
1.初始化过程 1 Resource res = new ClassPathResource("/applicationContext.xml"); 2 XmlBeanFactor ...
- spring启动过程之源码跟踪(上)--spring Debug
1,初始化容器 1 ClassPathXmlApplicationContext context=new 2 ClassPathXmlApplicationContext("/applica ...
- spring session spring:session:sessions:expires 源码跟踪
2019独角兽企业重金招聘Python工程师标准>>> spring session spring:session:sessions:expires 源码跟踪 博客分类: sprin ...
- spring依赖注入_Spring源码阅读:Spring依赖注入容器
依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...
- spring 启动之全过程 源码解析
主类代码 public class BeanLifeCycle {public static void main(String[] args) {System.out.println("现在 ...
- Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】
基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图 ...
- 从源码深处体验Spring核心技术--面试中IOC那些鲜为人知的细节
通过前面章节中对 Spring IOC 容器的源码分析,我们已经基本上了解了 Spring IOC 容器对 Bean 定义资源的定位.载入和注册过程,同时也清楚了当用户通过 getBean()方法向 ...
最新文章
- 数据中台:宜信敏捷数据中台建设实践
- 求a^b前n位和后n位
- OSX 10.8+下开启Web 共享 的方法
- 数据挖掘竞赛-北京PM2.5浓度回归分析训练赛
- win10安装mudbox失败,怎么强力卸载删除注册表并重新安装
- 【算法】剑指 Offer 42. 连续子数组的最大和 【重刷】
- 牛顿插值法 matlab程序计算方法,(最新整理)牛顿插值法matlab程序
- 正则匹配emoji字符
- 计算机硬件关系密切,与计算机硬件关系最密切的软件是.
- Unity 跳转第三方App
- 十大IT危机处理高手
- Spark 创建 hive表报错 ROW FORMAT DELIMITED is only compatible with 'textfile', not 'parquet'
- 华为java一个月写多少行代码_[财经]阿里员工吐槽华为:面试官1万行代码都没写过? - 南方财富网...
- 微信跳一跳刷分代码剖析
- 猿创征文|聊一聊我在字节跳动做项目质量改进的经验
- Future 模式详解(并发使用)
- 学c语言的第一篇博客~
- Windows11镜像下载及安装
- MATLAB+GUI:手动修改曲线中的点
- 柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
热门文章
- php setrawcookie,PHP setrawcookie() 函数
- java nginx tomcat_Nginx + Tomcat (java )服务器部署
- js监听select值变化_网络编程——C++实现socket通信(TCP)高并发之select模式
- 荧光皮肤有哪些_价格适中又显白的口红有哪些?MAC占大头,KIKO卡拉泡泡超平价...
- tf.reverse
- Ubuntu 里的Spyder不能切换中文输入
- 计算机专业的金书,《计算机专业英语》书评,金书网
- c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解
- 打印二叉树的边界节点
- Tensorflow实现MNIST数据自编码(2)