死磕Spring系列之四 BeanDefinition接口、BeanFactory接口

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dba10g.blog.51cto.com/764602/1728512

通过前面的介绍,相信大家对bean的解析,注册的整体流程了解了,知道Spring怎么一步步将xml文档内的配置信息纳入容器中。有几个非常重要的接口,不得不谈。

1.BeanDefinition接口

这个接口,可以理解为xml bean元素的数据载体。通过对比xml bean标签的属性列表和BeanDefinition的属性列表一看便知。

我的理解,是解析XML的过程,就是 xml <bean>元素内容 转换为BeanDefinition对象的过程。而且这个接口,支持层级,对应对象的继承。

有一个类BeanDefinitionHolder,BeanDefinitionHolder,根据名称或者别名持有beanDefinition,它承载了name和BeanDefinition的映射信息。

BeanWarpper:

提供对标准javabean的分析和操作方法:单个或者批量获取和设置属性值,获取属性描述符,查询属性的可读性和可写性等。支持属性的嵌套设置,深度没有限制。

AttributeAccessor:接口定义了最基本的对任意对象的元数据的修改或者获取

BeanMetadataElement:用来传输一个可配置的源对象(源码)

ChildBeanDefinition是一种bean definition,它可以继承它父类的设置,即ChildBeanDefinition对RootBeanDefinition有一定的依赖关系(现在spring源码中已不使用了)。ChildBeanDefinition从父类继承构造参数值,属性值并可以重写父类的方法,同时也可以增加新的属性或者方法。(类同于java类的继承关系)。注意:从spring 2.5 开始,提供了一个更好的注册bean definition类GenericBeanDefinition,它支持动态定义父依赖,方法是 GenericBeanDefinition.setParentName(java.lang.String),GenericBeanDefinition 可以有效的替代ChildBeanDefinition的绝大分部使用场合。我发现在spring3.1.2版本中,该类已经不被使用了。

GenericBeanDefinition是一站式的标准bean definition,除了具有指定类、可选的构造参数值和属性参数这些其它bean definition一样的特性外,它还具有通过parenetName属性来灵活设置parent bean definition。

通常, GenericBeanDefinition用来注册用户可见的bean definition(可见的bean definition意味着可以在该类bean definition上定义post-processor来对bean进行操作,甚至为配置parent name做扩展准备)。RootBeanDefinition / ChildBeanDefinition用来预定义具有parent/child关系的bean definition。

  一个RootBeanDefinition定义表明它是一个可合并的bean definition:即在spring beanFactory运行期间,可以返回一个特定的bean。RootBeanDefinition可以作为一个重要的通用的bean definition 视图。

RootBeanDefinition用来在配置阶段进行注册bean definition。然后,从spring 2.5后,编写注册bean definition有了更好的的方法:GenericBeanDefinition。GenericBeanDefinition支持动态定义父类依 赖,而非硬编码作为root bean definition。其中RootBeanDefinition是最常用的实现类,它对应一般性的<bean>元素标签

在 配置文件中可以定义父<bean>和子<bean>,父<bean>用RootBeanDefinition表示, 而子<bean>用ChildBeanDefiniton表示,而没有父<bean>的<bean>就使用 RootBeanDefinition表示。

2.BeanFactory接口

主要是这几个类或接口

ConfigurableBeanFactory:提供配置Factory的各种方法。一般应用用不到,主要为ListableBeanFactory和BeanFactory支持

ListableBeanFactory:根据条件获取bean的配置清单

ConfigurableListableBeanFactory:获取 BeanDefinition 和预先实例化单例 bean 的功能。beanFactory配置清单,指定忽略类型及接口

AutowireCapableBeanFactory:提供自动装配的功能,提供创建,注入,初始化及应用Bean的后处理器

HierarchicalBeanFactory:层级管理

如果,硬性理解这几个类分别有什么含义,有点苦涩。可以逆向思考一下。把这些工厂想象成一个裁缝,会方便理解些。

ConfigurableBeanFactory:你对要求衣服的样式要求

ListableBeanFactory:需求材料清单

AutowireCapableBeanFactory:缝纫机,针线工具

HierarchicalBeanFactory: 套装使用

ConfigurableListableBeanFactory:裁缝的助手

3.ApplicationContext接口

可以说是我们业务系统,主要面对的接口。Spring强大的扩展功能,全在这里实现。通过内部调用BeanFactory初始化,对用户透明。

AbstractRefreshableConfigApplicationContext:指定配置路径

AbstractRefreshableApplicationContext: 支持多次调用refresh.实现了refreshBeanFactory方法,供AbstractApplicationContext调用。

AbstractApplicationContext:模板模式实现初始化过程


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

  publicvoid 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) {

            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;

         }

      }

   }

下面是针对该过程的各步骤分析(来自Spring 深度源代码分析)

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1728512

时间: 2024-10-29 06:50:25

死磕Spring系列之四 BeanDefinition接口、BeanFactory接口的相关文章

死磕Spring系列之一:准备阅读Spring源码环境

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dba10g.blog.51cto.com/764602/1726509 死磕Spring系列前言 死磕spring系列博客,是对Spring进行源码级阅读.工作以来,一直接触spring框架,可以说对spring框架的配置使用已经非常熟练了.个人感觉:Spring技术非常强大,简单的xml标签配置,就可以开启非常强大的支持功能,囊括J2EE企业应用的方方面面.使用归使用,但是却

死磕Spring系列之二,bean标签的解析和BeanDefinition的注册

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dba10g.blog.51cto.com/764602/1726519 书接上回.到现在环境已经配置完毕,已经可以跑一个简单的HELLOWORLD了.正式进入源码阅读的阶段.使用过Spring的都知道,我们只需要在配置文件中配置好对象规则(比如类,依赖,属性...),然后我们就可以在程序中使用对象了. 我们可以做一个假设,如果让我们写一个程序,根据XML配置信息,生成想要的对象

死磕Spring系列之三,XML解析相关

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dba10g.blog.51cto.com/764602/1728020 通过第2章的介绍,应该知道Spring如何从XML一步步解析成BD对象并注册到容器中,这一过程有个概要认识了. 接下来开始详细分析与XML相关的那些事. 首先看一下使用的XML文档. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Spring系列,第1部分: Spring框架简介

在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级的.强壮的 J2EE 应用程序.developerWorks 的定期投稿人 Naveen Balani 通过介绍 Spring 框架开始了他由三部分组成的 Spring 系列,其中还将介绍 Spring 面向方面的编程(AOP)和控制反转(IOC)容器. Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个

ASP.NET企业开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上)

DataProvider是日常编程中最常用的Provider,它为项目提供了与数据库交互的能力,使程序人员能 够方便.快捷的获得SQL结构,简化了程序代码,增强程序可读性.它共有8个类库,100多个方法,包括 配置.功能和枚举三部分,以下是它的基本类关系: 开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上)-"> 图3.4公共接口 图3.5文件操作 图3.6 数据库操作与数据容器接口

Spring系列,第4部分: Spring JMS消息处理1-2-3

快速了解使用 Spring JMS 框架和 IBM WebSphere MQ 5.3 进行 JMS 消息处理的基础知识. 在 Spring 系列 的第 4 期也是最后一期中,我将介绍 Spring JMS(Java 消息服务)框架的特性.JMS PG 定义了 Java 应用程序通过面向消息的中间件(MOM)创建和交换消息的标准途径. 就像在这个系列前面的文章中一样,我将使用一个简单的示例来演示 Spring JMS 的特性.您将随我一道开发一个点对点的(P2P)基于消息的系统,使用 Spring

Spring系列,第2部分: 当Hibernate遇上Spring

Naveen Balani 继续他的 Spring 系列,介绍把 Hibernate 事务与 Spring 面向方面编程(AOP)集成的知识.结果是一个可以依靠的持久性框架. 在这个系列的 前一期中,我介绍了 Spring 框架的 7 个模块,包括 Spring AOP 和控制反转(IOC)容器.然后我用一个简单的示例演示了 IOC 模式(由 Spring IOC 容器实现)如何用松散耦合的方式集成分散的系统. 现在,我从我上次结束的地方开始,采用与上次类似的示例,演示 Spring AOP 和

[基础知识]Linux新手系列之四_unix linux

上 给Linux新手 [系列之四] OK,要讲硬盘分区了.在讲这个问题之前,我先来讲讲概念问题,什么是概念问题呢?你还记得第一次,绝对的第一次听到A:盘,B:盘,C盘时候的感觉么?在那之前自己也许知道计算机有个存储数据的地方,因为在电视上或者广告上看到过磁带机(我一直不知道为什么到了很久很久那种一个傻姑娘在一个磁带柜前面操作一个现在看来是垃圾的磁带设备会不停的成为电视台播放电脑题材节目的缺省背景)或者硬盘的图象.但是你并没有一个概念计算机究竟怎么使用这些设备,直到你第一次打出dir a:或者打开

黎学宁死磕“代驾租车”疑与行业不正当竞争有关

中国汽车租赁行业普遍开展的"代驾服务"从3月份被某国内知名汽车租赁公司宣称违法后,网络出现大量水军针对另一家汽车租赁企业展开大规模的舆论攻击.4月,宣称"代驾服务"违法的知名汽车租赁企业高调宣布收购"代驾"业务为主的第三方汽车租赁公司,截至目前该公司未停止被收购公司的"代驾"业务,也未就缘何收购其宣称的"违法"企业给出公开解释.5月,一位自称"公益律师"的人士再次染指"代驾服务