spring启动过程之源码跟踪(中)--spring Debug
2013-03-12 09:18
351 查看
上节我们debug到
我们继续debug 下一步:配置beanfactory的上下文
下面是下一步要debug的内容:
初始化singletonbean(DefaultListableBeanFactory.java#preInstantiateSingletons())
结束动作:发布事件
// Tell the subclass to refresh the internal bean factory. 2 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
我们继续debug 下一步:配置beanfactory的上下文
/** * Configure the factory's standard context characteristics, * such as the context's ClassLoader and post-processors. * @param beanFactory the BeanFactory to configure */ protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use the context's class loader. beanFactory.setBeanClassLoader(getClassLoader()); // Populate the bean factory with context-specific resource editors. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this)); // Configure the bean factory with context callbacks. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); // BeanFactory interface not registered as resolvable type in a plain factory. // MessageSource registered (and found for autowiring) as a bean. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); // Detect a LoadTimeWeaver and prepare for weaving, if found. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME) && JdkVersion.isAtLeastJava15()) { // Register the (JDK 1.5 specific) LoadTimeWeaverAwareProcessor. try { Class ltwapClass = ClassUtils.forName( "org.springframework.context.weaving.LoadTimeWeaverAwareProcessor", AbstractApplicationContext.class.getClassLoader()); BeanPostProcessor ltwap = (BeanPostProcessor) BeanUtils.instantiateClass(ltwapClass); ((BeanFactoryAware) ltwap).setBeanFactory(beanFactory); beanFactory.addBeanPostProcessor(ltwap); } catch (ClassNotFoundException ex) { throw new IllegalStateException("Spring's LoadTimeWeaverAwareProcessor class is not available"); } // Set a temporary ClassLoader for type matching. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } }
下面是下一步要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())
public void preInstantiateSingletons() throws BeansException { if (this.logger.isInfoEnabled()) { this.logger.info("Pre-instantiating singletons in " + this); } synchronized (this.beanDefinitionMap) { for (Iterator it = this.beanDefinitionNames.iterator(); it.hasNext();) { String beanName = (String) it.next(); RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { FactoryBean factory = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName); if (factory instanceof SmartFactoryBean && ((SmartFactoryBean) factory).isEagerInit()) { getBean(beanName); } } else { getBean(beanName); } } } } }
结束动作:发布事件
public void publishEvent(ApplicationEvent event) { Assert.notNull(event, "Event must not be null"); if (logger.isTraceEnabled()) { logger.trace("Publishing event in context [" + getId() + "]: " + event); } getApplicationEventMulticaster().multicastEvent(event); if (this.parent != null) { this.parent.publishEvent(event); } }
相关文章推荐
- spring启动过程之源码跟踪(中)--spring Debug
- spring启动过程之源码跟踪(上)--spring Debug
- spring启动过程之源码跟踪(上)--spring Debug
- spring启动过程之源码跟踪(上)--spring Debug
- spring启动过程之源码跟踪(下)--spring Debug
- spring启动过程之源码跟踪(续beanfactory)--spring Debug
- spring启动过程之源码跟踪(续beanfactory)--spring Debug
- spring启动过程之源码跟踪(下)--spring Debug
- spring启动过程之源码跟踪(下)--spring Debug
- Spring 源码学习(二) IOC容器启动过程
- [Spring Boot] 1. Spring Boot启动过程源码分析
- Spring源码-启动过程
- 【Spring启动过程分析】(2)源码分析
- spring源码分析-应用启动过程
- Spring Boot启动过程源码分析(二)事件监听器
- spring启动加载过程源码分析
- Spring原理与源码分析系列(二)- Spring IoC容器启动过程分析(上)
- spring启动component-scan类扫描加载过程---源码分析
- spring启动component-scan类扫描加载过程---源码分析