BeanFactory及其子类构成了Spring容器的体系结构,由于Spring容器体系十分复杂,首先了解BeanFactory继承结构。

1、BeanFactory继承结构

1.1、AutowireCapableBeanFactory继承结构

1.2、HierarchicalBeanFactory继承结构

1.3、ListableBeanFactory继承结构

ApplicationContext是Spring中最为常用的Ioc容器,它在BeanFactory的基础上封装了更多的功能,它主要包括两个接口ConfigurableApplicationContext、WebApplicationContext。

2、ApplicationContext继承结构

2.1、ConfigurableApplicationContext继承结构

2.1.1.1、AbstractRefreshableApplicationContext继续结构

2.1.1.2、GenericApplicationContext继承结构

2.2、WebApplicationContext继承结构

2.3、ApplicationContext详细继承结构

接下来以常用的容器实现类ClassPathApplicationContext为例,展现容器继承的UML类图,以及ApplicationContext在BeanFactory基础上进行封装时,所继承实现的UML类图。

3、ClassPathApplicationContext UML类图

4、ApplicationContext继承UML类图

从UML类图可以看出,ApplicationContext分别继承EnvironmentCapableListableBeanFactoryHierarchicalBeanFactoryMessageSourceApplicationEventPublisherResourcePatternResolver接口。EnvironmentCapable暴露了对Environment这个接口的引用,通过继承EnvironmentCapable,使得所有的应用程序上下文具有EnvironmentCapable的功能,主要用于BeanFactory实例是不是ApplicationContext实例的检查,从而使得与环境交互是可行的。它扩展了MessageSource接口,可以支持国际化,继承ApplicationEventPublisher接口, 在程序上下文中引入了事件机制,这些事件和Bean生命周期相结合,为Bean使命的完成提供了便利。它还继承了ResourcePatternResolver通过ResourceLoader和Resource的支持,ApplicationContext可以加载不同地方的Bean定义资源文件,尤其可以从不同IO途径获取Bean定义信息。可以使用户程序灵活地定义Bean定义信息。

5、BeanFactory接口定义了Spring Ioc容器的基本功能规范,是Spring Ioc容器所遵循的最底层最基本的规范。BeanFactory接口定义的方法如下:

(1)Object getBean(String name) throws BeansException;

    根据要获取bean的名字,获取对象实例。如果在factory中找不到实例,则继续在你工厂中继续查找。

(2)<T> T getBean(String name, Class<T> requiredType) throws BeansException;

    根据要获取bean的名字和指定的类型,直接返回指定类型的实例。如果类型与指定名字的bean类型不一致会抛出BeanNotOfRequiredTypeException,以确保类型完全性。

(3)<T> T getBean(Class<T> requiredType) throws BeansException;

    查找与指定类型匹配的唯一实例,如果存在多个匹配,如接口或者超类,这是不被允许的。

(4)Object getBean(String name, Object... args) throws BeansException;

       指定bean名字和构造函数的参数获取匹配的对象实例。

(5)<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

       指定bean的类型和构造函数的参数获取匹配的对象实例。

(6)boolean containsBean(String name);

       判断容器中是否包含指定名字的bean定义或外部注册的实例,如果给定的是别名,会找到一个与之匹配的权威性的名字;如果factory是hierarchical的,在当前factory中没找到,则会往其父factory中继续查找。如果找到一个与给定名字匹配的bean定义或者单独的实例,则会返回true。返回true并不意味着getBean(String name)就可以获得一个与之匹配的实例。因为匹配的bean是concrete还是abstract,是lazy还是eager, 在不在scope是不确定的。

(7)boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

(8)boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

(9)boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;

   判断容器中指定bean的名字和bean的类型是不是一 一对应的。

(10)Class<?> getType(String name) throws NoSuchBeanDefinitionException;

   返回给定名字bean对应的类型。

(11)String[] getAliases(String name);

   返回指定bean名字对应的别名,如果给定的名字是一个别名,则返回bean的原始名字和其他的别名。

6、ApplicationContext在BeanFactory上进行功能扩展,是最常用的Ioc容器,其源码如下:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    /**
     * 获取applicationContext容器的ID*/
    String getId();

    /**
     * 获取applicationContext容器的名字,即已部署的程序的名字*/
    String getApplicationName();

    /**
     *获取ApplicationContext容器的displayName  
     */
    String getDisplayName();

    /**
     *获取applicationContext容器首次加载的时间
*/ long getStartupDate(); /** * 获取ApplicationContext容器的父容器,如果不存在,则返回null
*/ ApplicationContext getParent(); /**
   *
获取自动装配功能的BeanFactory  */ AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException; }

到此为止,对容器的整个体系结构,有了一个大概的认识,接下来将继续学习,容器加载的整个过程。

备注:本学习笔记参考http://blog.csdn.net/chjttony/article/details/6248682学习思路

posted on 2015-06-12 16:28  天狼群星  阅读(205)  评论(0)    收藏  举报