Spring源码学习--Spring配置文件解析BeanDefinitionReader(二)
来源:互联网 发布:双色球随机选号软件 编辑:程序博客网 时间:2024/06/05 19:34
Spring配置文件的解析是通过BeanDefinitionReader来实现的,其实了解BeanDefinitionReader实现的机制就会发现,其只是将ApplicationContext.xml配置文件解析成Document对象,真正对xml中元素解析的类是在BeanDefinitionDocumentReader的实现类中来完成的,接下来我们也会对它进行介绍。
对ApplicationContext.xml中开始解析的方法是loadBeanDefinitions
AbstractBeanDefinitionReader的loadBeanDefinitions中会对ApplicationContext.xml进行解析
@Overridepublic int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {Assert.notNull(locations, "Location array must not be null");int counter = 0;for (String location : locations) {counter += loadBeanDefinitions(location);}return counter;}
@Overridepublic int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {return loadBeanDefinitions(location, null);}loadBeanDefinitions中会根据文件地址来进行解析操作:
public int loadBeanDefinitions(String location, Set<Resource> actualResources) throws BeanDefinitionStoreException {//判断资源地址类型if (resourceLoader instanceof ResourcePatternResolver) {// Resource pattern matching available.try {Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);//在子类的loadBeanDefinitions进行解析操作int loadCount = loadBeanDefinitions(resources);if (actualResources != null) {for (Resource resource : resources) {actualResources.add(resource);}}if (logger.isDebugEnabled()) {logger.debug("Loaded " + loadCount + " bean definitions from location pattern [" + location + "]");}return loadCount;}catch (IOException ex) {throw new BeanDefinitionStoreException("Could not resolve bean definition resource pattern [" + location + "]", ex);}}else {// Can only load single resources by absolute URL.Resource resource = resourceLoader.getResource(location);//在子类的loadBeanDefinitions进行解析操作int loadCount = loadBeanDefinitions(resource);if (actualResources != null) {actualResources.add(resource);}if (logger.isDebugEnabled()) {logger.debug("Loaded " + loadCount + " bean definitions from location [" + location + "]");}return loadCount;}}loadBeanDefinitions是在子类XmlBeanDefinitionReader中实现
@Overridepublic int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {return loadBeanDefinitions(new EncodedResource(resource));}
doLoadBeanDefinitions会将文件地址解析为数据流,然后解析数据流
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {..........try {//从xml文件中获取流InputStream inputStream = encodedResource.getResource().getInputStream();try {InputSource inputSource = new InputSource(inputStream);if (encodedResource.getEncoding() != null) {inputSource.setEncoding(encodedResource.getEncoding());}//解析文件流return doLoadBeanDefinitions(inputSource, encodedResource.getResource());}finally {inputStream.close();}}.......}doLoadBeanDefinitions中会将文件流解析成Document对象
protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)throws BeanDefinitionStoreException {try {Document doc = doLoadDocument(inputSource, resource);return registerBeanDefinitions(doc, resource);}.....}registerBeanDefinitions中会创建BeanDefinitionDocumentReader来对Document进行解析,对Spring配置文件中的元素进行解析处理。
public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {//创建Document解析处理器BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();int countBefore = getRegistry().getBeanDefinitionCount();//在BeanDefinitionDocumentReader中解析xml中配置的元素documentReader.registerBeanDefinitions(doc, createReaderContext(resource));return getRegistry().getBeanDefinitionCount() - countBefore;}
总结:简单来说BeanDefinitionReader所做的处理操作是将配置的ApplicationContext.xml解析成为Document对象,接下来会有BeanDefinitionDocumentReader来对Document进行解析。
阅读全文
0 0
- Spring源码学习--Spring配置文件解析BeanDefinitionReader(二)
- 小读spring ioc源码(四)——BeanDefinitionReader
- Spring源码学习--Spring配置文件解析BeanDefinitionDocumentReader(三)
- Spring源码分析-配置文件的解析(二)
- spring 笔记4 BeanDefinitionReader
- spring MVC学习笔记(二) springMVC.xml配置文件解析
- spring源码解析(二)
- Spring源码解析--Spring配置文件解析BeanDefinitionParserDelegate(四)
- Spring源码解析--Spring配置文件解析NamespaceHandler(五)
- spring 读取配置文件源码解析
- 07.Spring Bean 加载 - BeanDefinitionReader
- 学习笔记:springmvc4.3源码学习:spring解析配置文件过程
- Spring源码解析配置文件装载与解析
- Spring源码解析 配置文件装载与解析
- spring ioc 源码解析(二)
- spring源码解析(二)IOC容器
- spring基础学习二(配置文件)
- Spring 框架学习(二):Spring 应用配置文件讲解
- Poj 1679 The Unique MST(次小生成树)
- hibernate bug问题
- Leecode-53. Maximum Subarray
- Link-Cut Tree
- 构造函数初始化列表和构造函数的区别
- Spring源码学习--Spring配置文件解析BeanDefinitionReader(二)
- 003-科学管理|伟大的效率破局
- POJ3422_Kaka's Matrix Travels_最小费用流::拆点、重边
- FreeMarker
- tensorflow中MLP识别mnist手写数字
- shell(bash)基础
- window 下 gvim配置文件
- java使用反射实现对数据库的增删改查
- css实现文章每个段落开头自动缩进两个空格