Spring技术内幕笔记(一)------BeanFactory和ApplicationContext

    xiaoxiao2022-07-08  205

    BeanFactory的应用场景

    BeanFactory接口定义了IoC容器最基本的形式,并且提供了IoC容器应该遵守的最基本的服务起源,同时也是我们使用IoC容器BeanFactory为我们提供了以下操作 通过接口方法containsBean让用户能够判断容器是否含有指定名字的Bean通过接口方法isSingleton来查询指定名字的Bean是否是Singleton类型的Bean。对于Singleton属性,用户可以在BeanDifinition中指定通过接口方法isPrototype来查询指定名字的Bean是否是prototype类型的。与Singleton属性一样,这个属性也可以由用户在BeanDifinition中指定通过接口方法isTypeMatch来查询指定了名字的Bean的Class类型是否是指定的Class类型。这个Class类型可以由用户指定通过接口方法getType来查询指定名字的Bean的Class类型通过接口方法getAliases来查询指定了名字的Bean的所有别名,这些别名都是用户在BeanDefinition中定义。

    我们可以看到,这里定义的是一系列接口方法,我们可以通过这一系列的接口方法,很方便的从IoC容器中获取我们所需要的bean,忽略具体的IoC容器实现

    BeanFactory容器的设计原理

    BeanFactory接口提供了使用IoC容器的规范。在这个基础上Spring还提供了一些符合这个规范的一系列容器供用户使用 书中说道,XmlBeanFactory是一个简单IoC容器的最底层实现,它与应用中用到的上下文相比有一个明显的特点:它只提供最基本的IoC容器的功能,由此我们可以得到一个结论,直接的BeanFactory实现的是IoC容器的基本形式,而各种ApplicationContext的实现是IoC容器的高级表现形式。 在Spring中,实际上是把DefaultListableBeanFactory作为一个默认的功能完整的IoC容器来使用的。XmlBeanFactory在继承DefaultListableBeanFactory的同时,又增加了新的功能 由Xml可知,这个BeanFactory中存在读取Xml文件的功能,这个功能是在XmlBeanFactory中实现了一个XmlBeanDefinitionReader直接完成的。如果我们需要读取Xml文件的信息,我们就需要知道这个文件在哪,也就是指定这个文件的来源。要让Spring知道这个来源,我们需要使用Resource类来完成。Resource类是Spring用来封装IO操作的类,通过Resoruce类实例化出一个具体的对象,比如ClasspathResource构造参数传入Xml文件名,然后将实例化好的Resource传给BeanFactory的构造参数,这样Spring就可以方便地定位到需要的BeanDefinition信息来对Bean完成容器的初始化和依赖注入过程总结一下:BeanFactory是一个容器,BeanDefinition是用来处理Bean的定义和Bean之间关系,Resource是定义资源文件位置 编程式使用IoC容器 ClassPathResource res = new ClassPathResource("Bean.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinition(res);

    这样我们就可以通过factory这个对象来时用DefaultListableBeanFactory这个IoC容器了

    创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息创建一个BeanFactory,这里使用DefaultListableBeanFactory创建一个载入BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入Xml形式的BeanDefinition,通过一个回调配置给BeanFactory从定义好的资源位置读入配置信息,具体的解析过程交给XmlBeanDefinitonReader来完成。完成整个载入和注册Bean定义之后,需要的Ioc容器就建立起来了

    ApplicationContext的应用场景

    相比于BeanFactory来说,ApplicationContext是对BeanFactory的一种增强,不仅能提供BeanFactory所提供的的基本功能外,还为用户提供了一些附加服务

    支持不同的信息源。ApplicationContext扩展了MessageSource接口,这些信息源的扩展功能支持国际化的实现,为开发多语言版本的应用提供服务。访问资源。这一特定体现在对ResourceLoader和Resource的支持上,这样我们可以从不同地方的到Bean定义的资源。支持应用事件。继承了接口ApolicationEventPublisher,从而在上下文中引入了事件机制。这些事件和Bean的生命周期的结合为Bean的管理提供了便利。在ApplicationContext中提供的附加服务,使得基本的IoC容器更加丰富。

    ApplicationContext容器的设计原理

    作为一个应用的上下文,只需要实现和它自身设计相关的两个功能

    如果应用直接使用FileSystemXmlApplicationContext,对于实例化这个应用上下文的支持,同时启动IoC容器的refresh()过程。refresh()过程牵涉到IoC容器启动的操作,但是不同容器的启动都是类似的,所有这个方法在基类中已经封装好了,在这里只是调用,为在文件系统读取BeanDefinition做准备,因为不同的应用上下文实现对应这不同的读取BeanDefinition的方式。
    最新回复(0)