日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring启动过程之源码跟踪(中)--spring Debug

發布時間:2025/4/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。