spring源码吧(一)beans篇章

两个核心类
1.DefaultListableBeanFactory
XmlBeanFactory 继承向 DefaultListableBeanFacto1y,对它进行了扩展主要用于从 XML 文档中读
取 BeanDefinition ,对于注册及获取 bean 都是使用从父类 DefaultListableBeanFactory 继承的方
法去实现,而唯独与父类不同的个性化实现就是增加了 XmlBeanDefinitionReader 类型的 reader
属性。 在 Xm!BeanFactory 中主要使用 reader 属性对资源文件进行读取和注册

BeanFactory :定义 获取 bean 及 bean 的各种属性 。
DefauItS ingletonBeanRegistry :对接口 Si ngletonBeanRegistry 各函数的实现。

BeanDefinitionRegistry : 定义对 BeanDefinition 的各种增删改操作 。

DefaultListableBeanFactory : 综合上面所有功能, 主要是对 bean 注册后的处理

2.XmlBeanDefinitionReade
从 XmlBeanDefinitionReader 中梳理一下资源文件读取、解析及注册的大致脉络

查看各个类的功能:
  • ResourceLoader :定义资源加载器,主妥应用于根据给定的资源文件地址返 回对应的
    Resource 。
    -BeanDefinitionReader :主要定义资源文件读取并转换为 BeanDefinition 的各个功能

Spring 对其内部使用到的资源实现了自己的抽象结构 : Resource 接口封装底层资源 继承了接口InputStreamReader,里面可以获取到InputStream

对不同来源的资源文件都有相应的 Resource 实现 : 文件( FileSystemResource ) 、 Classpath
资源( ClassPathResource )、 URL 资源( Ur!Resource )、 InputStream 资源( InputStreamResource ) 、
Byte 数组( ByteArrayResource )等

public class XmlBeanFactory extends DefaultListableBeanFactory 

	public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
		super(parentBeanFactory);1.
		**this.reader.loadBeanDefinitions(resource);**
	}
//1
public AbstractAutowireCapableBeanFactory() {
		super();
		ignoreDependencyInterface(BeanNameAware.class);
		ignoreDependencyInterface(BeanFactoryAware.class);
		ignoreDependencyInterface(BeanClassLoaderAware.class);
	}

现在对上面做个总结:
l . 封装资源文件 。当 进入 XrnlBean.DefinitionReader 后首先对 参 数 Resource 使用
EncodedResource 类进行封装 。

  • 获取输入流 。 从 Resource 中获取对应的 InputStrearn 并构造 lnputSource 。

  • 通过构造的 l nputSource 实例和 Resource 实例继续调 用 函数 .loadBeanDefinitions(resource)。

  • loadBeanDefinitions的执行过程

public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader
public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
		return loadBeanDefinitions(new EncodedResource(resource));
	}
	public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource){
try {
		获取对 XML 文件的验证模式 。
加载 XML 文件,并得到对应的 Document。
根据返回的 Document 注册 Bean 信息 。
			Document doc = doLoadDocument(inputSource, resource);
			
			int count = registerBeanDefinitions(doc, resource);
			if (logger.isDebugEnabled()) {
				logger.debug("Loaded " + count + " bean definitions from " + resource);
			}
			return count;
		}
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值