博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring源码学习笔记 (一)bean是怎么生成的
阅读量:2353 次
发布时间:2019-05-10

本文共 2355 字,大约阅读时间需要 7 分钟。

bean 实在 bean 刷新过程中产生的,首先我们看下 bean 的刷新方法。下面是 AbstractApplicationContext 的 refresh 方法。

 

@Override    public void refresh() throws BeansException, IllegalStateException {		synchronized (this.startupShutdownMonitor) {			// Prepare this context for refreshing.			prepareRefresh();			// Tell the subclass to refresh the internal bean factory.			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();			// Prepare the bean factory for use in this context.			prepareBeanFactory(beanFactory);			try {				// 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();			}			catch (BeansException ex) {				if (logger.isWarnEnabled()) {					logger.warn("Exception encountered during context initialization - " +							"cancelling refresh attempt: " + ex);				}				// Destroy already created singletons to avoid dangling resources.				destroyBeans();				// Reset 'active' flag.				cancelRefresh(ex);				// Propagate exception to caller.				throw ex;			}			finally {				// Reset common introspection caches in Spring's core, since we				// might not ever need metadata for singleton beans anymore...				resetCommonCaches();			}		}	}

我们可以看到这个方法中一共进行了准备刷新,获取bean工厂,调用 postProcess 等一系列操作。

这里有一个比较重要的地方就是 postProcess 是什么东西

熟悉 spring 的应该都知道,postProcessor给 用户留的一个扩展点,Spring允许BeanFactoryPostProcessor在容器实例化前后操纵 bean 的属性,BeanPostProcessor实现类可以在bean初始化前后做一些事情,BeanPostProcessor的作用域是容器级的,它只和所在容器有关。

bean 的默认生成就是通过默认的 postProcessor 生成的。bean 的生成主要分为通过注解,通过xml,通过自动扫描,以及mybatis dao的bean生成,这些每一种类型都是一种bean的生成器,当然,我们也可以自定义我们自己的 bean 生成器。

bean 生成以后被保存在一个map里,用来供调用。

初看 spring 源码,难免理解错误,希望大家能指出和谅解,感激不尽。

转载地址:http://lkwtb.baihongyu.com/

你可能感兴趣的文章
c中嵌入python
查看>>
python的C扩展
查看>>
python的USB通信
查看>>
eclipse svn
查看>>
SPSS基础教程:SPSS统计分析基础
查看>>
IBM SPSS Modeler 客户端 vs 服务器的区别详解
查看>>
DataStage On Cloud,构建云端的企业数据集成平台
查看>>
ICMP协议
查看>>
SSL协议
查看>>
IMAP,POP3,SMTP协议
查看>>
数据库协议
查看>>
SNMP协议
查看>>
RDP远程桌面协议
查看>>
ssh Forward X11
查看>>
搜索引擎知识图谱相关结构化数据挖掘与去歧处理
查看>>
找到n个元素中的第二小元素
查看>>
linux命令之find
查看>>
linux命令学习之cut
查看>>
linux下目录读权限与执行权限区别
查看>>
[think in java]知识点学习
查看>>