二、Spring组装BeanDefinition详情(1)

以下是Spring加载Xml,封装BeanDefiniton的概要代码

主要有这些类

*XmlBeanDefinitionReader

*DefaultBeanDefinitionDocumentReader

*BeanDefinitionParserDelegate

1)[AbstractApplicationContext] ConfigurableListableBeanFactory obtainFreshBeanFactory()

refreshBeanFactory();

2) [AbstractRefreshableApplicationContext] refreshBeanFactory()

DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory()

loadBeanDefinitions(beanFactory);

3)[AbstractXmlApplicationContext] loadBeanDefinitions(DefaultListableBeanFactory beanFactory)

XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

loadBeanDefinitions(beanDefinitionReader);

4)[AbstractXmlApplicationContext] loadBeanDefinitions(XmlBeanDefinitionReader reader)

String[] configLocations = getConfigLocations();

reader.loadBeanDefinitions(configLocations);

5)[AbstractBeanDefinitionReader] loadBeanDefinitions(String... locations)

for (String location : locations) {counter += loadBeanDefinitions(location);}

6)[XmlBeanDefinitionReader] doLoadBeanDefinitions(InputSource inputSource, Resource resource)

Document doc = this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware());

return registerBeanDefinitions(doc, resource); ->

[DefaultDocumentLoader] Document loadDocument(InputSource inputSource, EntityResolver entityResolver,ErrorHandler errorHandler, int validationMode, boolean namespaceAware)

javax.xml.parsers.DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder docBuilder = factory.newDocumentBuilder(); docBuilder.setEntityResolver(entityResolver); return docBuilder.parse(inputSource);

7)[XmlBeanDefinitionReader] registerBeanDefinitions(doc, resource);

BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();[DefaultBeanDefinitionDocumentReader]

documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

8)[XmlBeanDefinitionReader]  XmlReaderContext createReaderContext(Resource resource)

namespaceHandlerResolver=new DefaultNamespaceHandlerResolver(getResourceLoader().getClassLoader());

return new XmlReaderContext(resource, this.problemReporter, this.eventListener,this.sourceExtractor, this, this.namespaceHandlerResolver);

9)[DefaultBeanDefinitionDocumentReader] registerBeanDefinitions(doc,readerContext)

Element root = doc.getDocumentElement();

doRegisterBeanDefinitions(root);

10)[DefaultBeanDefinitionDocumentReader] doRegisterBeanDefinitions(root)

BeanDefinitionParserDelegate delegate = new BeanDefinitionParserDelegate(readerContext, environment); parseBeanDefinitions(root, this.delegate);

11)[DefaultBeanDefinitionDocumentReader] parseBeanDefinitions(rElement root, BeanDefinitionParserDelegate delegate)

NodeList nl = root.getChildNodes();

for (int i = 0; i < nl.getLength(); i++) {Node node = nl.item(i);Element ele = (Element) node;

if (delegate.isDefaultNamespace(ele)) {parseDefaultElement(ele, delegate);}

else {delegate.parseCustomElement(ele);}  }

[return "http://www.springframework.org/schema/beans".equals(node.getNamespaceURI());]

12)[DefaultBeanDefinitionDocumentReader]parseDefaultElement(ele, delegate)

if (delegate.nodeNameEquals(ele, "import")) {importBeanDefinitionResource(ele);}

else if (delegate.nodeNameEquals(ele, "bean")) {processBeanDefinition(ele, delegate);}

时间: 2024-10-06 02:15:57

二、Spring组装BeanDefinition详情(1)的相关文章

Spring3.x教程(二) Spring AOP

一.Spring AOP介绍 开发其实就是在不断的重构,抽象重复代码,然后进行封装.从最原始的模块化编程到面向对象编程,代码的封装越来越整齐清晰,但是依然存在重复的代码,而这些重复代码几乎都是与业务逻辑无关的系统逻辑代码.比如在数据操作类中的插入.更新.删除数据等方法中都存在数据库事务的处理,重要业务逻辑方法中都有日志记录的逻辑等等.每个应用系统都存在着这种系统级的重复逻辑代码,而我们并没有更好的方法去将这些代码抽象出来并进行管理.然而AOP的出现弥补了这一缺陷,AOP可以在不改变原有业务逻辑代

[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.

Android学习笔记十四.深入理解fragment(二) 之《图书详情》实战

深入理解fragment(二) 之<图书详情>实战 通过上一篇博文<深入理解fragment一>,我们学习了Android-Fragment的核心知识点.现在在此基础上,利用Fragment技术开发一款适用于大屏幕手机/平板的查找图书详情的应用软件.该项目主要在于两方面,一是Activity.Fragment的源码实现:二是,布局界面资源文件的实现. 1.res/../BookListFragment.java: 自定义类,继承于ListFragment,无需实现OnCreateV

Spring IOC BeanDefinition解析

Spring IOC BeanDefinition解析 IOC(Inversion of Control)即控制反转,是说创建对象的控制权进行了转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权利转移到Spring IOC容器.许多非凡的应用,都是由两个或者多个类通过彼此的合作依赖来实现业务逻辑的,在Spring中,这些依赖关系可以通过把对象的依赖注入交给IOC容器来管理,这样在解耦代码的同时提高了代码的可测试性. 1.    加载bean 加载bean的流程: (1)     封

(二)Spring MVC 搭建

一.导包 1.添加Spring的核心包 2.添加Spring MVC的核心包 二.在WEB-INFO/web.xml中配置前端控制器DispatcherServlet 1 <?xml version="1.0" encoding="utf-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.su

Spring 事务管理详情介绍

一.事务管理介绍 事务是现代数据库理论中的核心概念之一,是逻辑上的一组操作,这组操作要么全都成功,要么全都失败.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态.分别是:提交事务(调用commit()方法).回滚事务(失败提交-调用rollBack()方法).有如下优点: 1.为不同的事务API提供一致的编程模型,如JTA,JD

spring 之 BeanDefinition &amp; BeanDefinitionParser

xml bean factory 的解析过程的 堆栈大概是这样的: at org.springframework.beans.factory.xml.NamespaceHandlerSupport.findParserForElement(NamespaceHandlerSupport.java:84) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.ja

十二.Spring AOP面向切面编程

什么是AOP? AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP的第一个案例 要求:使用AOP实现日志记录功能,核心模块和增强单独开发,运行时组装 1.创建接口HelloDao.HelloService. 创建接口类HelloDaoImpl.HelloServiceImpl并实现dao层接口 public interface IHolleDao { public void print

SpringBoot学习(二)--&gt;Spring的Java配置方式

二.Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @Bean Spring的Java配置方式是通过 @Configuration 和 @Bean 这两个注解实现的: 1.@Configuration 作用于类上,相当于一个xml配置文件: 2.@Bean 作用于方法上,相当于xml配置中的<bean>: 2.示例 该示例演示了通过Java配置的方式进行配置Spring,并且实现了Spring IO