两个核心类
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;
}
}