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

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


1.BeanDefinition接口

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

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

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

BeanWarpper:

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

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


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接口

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

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

主要是这几个类或接口

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

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

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

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

HierarchicalBeanFactory:层级管理

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

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

ListableBeanFactory:需求材料清单

AutowireCapableBeanFactory:缝纫机,针线工具

HierarchicalBeanFactory: 套装使用

ConfigurableListableBeanFactory:裁缝的助手


3.ApplicationContext接口

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

死磕Spring系列之四 BeanDefinition接口、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 深度源代码分析)




本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1728512,如需转载请自行联系原作者

上一篇:Spring Boot 支持 Https 有那么难吗?


下一篇:提升mysql性能的关键参数之innodb_buffer_pool_size、innodb_buffer_pool_instances