spring ioc之概念及结构分析(一)

ioc概念

许多非凡的应用都是通过两个或者多个类通过彼此的合作来实现业务逻辑的,spring使用ioc(Inversion of Control​,控制反转)来对这些对象来进行管理,起到通过第三方来管理对象的目的。

为什么叫控制反转?

谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

di概念

spring将大部分的对象都交给了ioc容器来管理,那么我们的应用是怎样取得对象的实例的呢?这里就使用了di(Dependency Injection,依赖注入)的概念,一个对象依赖于另外一个对象,一些简单的配置就可以让ioc容器将他所需要的对象实例注入。

为什么叫依赖注入?

  1. 谁依赖于谁:当然是应用程序依赖于IoC容器;

  2. 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

  3. 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

  4. 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

ioc和di是两个不同的概念

ioc是将创建和管理对象交给了统一的一个容器去做,di是在你的对象中所依赖的其他对象在ioc容器中去寻找,以便于创建和使用该对象。换句话说di是属于ioc这个大功能的一小部分。

spring中的ioc的容器设计结构

我们先来看看spring的ioc容器的接口设计图

下面给出该容器设计结构的分析

  1. BeanFactory是所有容器的父级,BeanFactory实现了容器所具有的基本功能,如:getBean方法,获取容器中注册的bean
  2. 从接口设计图可以看出,从BeanFactory出发,分为两条线路,第一条是BeanFactory-HierarchcalBeanFactory-ConfigurableBeanFactory从源码中我们可以看到HierarchcalBeanFactory较之BeanFactory多了两个方法getParentBeanFactory可以查看双亲的BeanFactory,还有个就是containsLocalBean该工厂是否包含一个bean。ConfigurableBeanFactory主要是对BeanFactory多了一些配置信息,如setParentBeanFactory设置双亲,setBeanClassLoader设置加载beanFactory的类加载器等。
  3. 第二条设计主线是以ApplicationContext应用上下文接口为核心,路线是从BeanFactory-ListabelBeanFactory或者HierarchcalBeanFactory-ApplicationContext再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口,这里可以看出ApplicationContext是个大容器也就是高级容器。

上面只是容器的接口设计图,他的下面还有许多的实现类,也就是具体的ioc容器,下面我们以xmlBeanFactory和XmlWebApplicationContext的实现为例来说明ioc简单的设计原理。

XmlBeanFactory结构介绍

输入图片说明

可以看到XmlBeanFactory的根是BeanFactory,他的上一级是DefaultListableBeanFactory,这个类很重要,是我们经常要用到的一个ioc的实现,比如ApplicationContext时就会用到他,DefaultListableBeanFactory实际上包含了基本ioc容器所具有的重要功能,因此在spring中将DefaultLitableBeanFactory作为一个默认功能完整的ioc容器来使用。

从名字可以看出XmlBeanFactory这是一个和xml相关的BeanFactory,那么它是如何读取解析xml呢?从源码中可以看出是通过XmlBeanDefinitionReader来解析的,其实XmlBeanFactory就是以DefaultLitableBeanFactory为基类,再以XmlBeanDefinitionReader来解析xml格式的一个ioc容器,其他很多类似的ioc容器都是通过持有或者扩展DefaultLitableBeanFactory来获得基本的ioc容器功能,如:ApplicationContext的子类AbstractRefreshableApplicationContext就持有DefaultLitableBeanFactory。

从spring 3.1版本后,通过代码我们可以看到XmlBeanFactory是Deprecated(不推荐使用的)注释为@deprecated as of Spring 3.1 in favor of {@link DefaultListableBeanFactory} and{@link XmlBeanDefinitionReader}意思是推荐我们使用这两个的结合,而不是直接使用XmlBeanFactory,可以这样使用

        Resource resource=new ClassPathResource("spring-mvc.xml");
        BeanDefinitionRegistry factory=new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory);
        reader.loadBeanDefinitions(resource);

其实就是将XmlBeanFactory的构造和初始化给拉出来了而已。

XmlWebApplicationContext的结构介绍

输入图片说明其中XmlWebApplicationContext是ApplicationContext中的实现接口 Application除了能够提供前面XmlBeanFactory提供的基本的ioc容器功能,还提供了以下附加功能

  1. 这里是列表文本继承MessageSource接口,使得ApplicationContext支持不同的信息源,这些信息源的扩展功能可以支持国际化的实现,为开发多语言版本的应用提供服务。
  2. 继承ResourcePattemResolver接口,ApplicationContext可以访问资源,具体体现在Reource和ResourceLoader的支持上,这样我们可以从不同的地方得到Bean定义的资源。上面我们所说的XmlBeanFactory中Resource resource=new ClassPathResource("spring-mvc.xml");实际上是直接实例化Resource,在ApplicationContext子类中我们使用Resource getResource(String location);这个方法来使得容器加载资源,不论是类路径还是文件路径都可以识别。如果写类路径就和我们直接实例化ClassPathResource使用同一个类。
  3. 支持应用事件,继承了ApplicationEventPublisher接口,从而在上下文中引入了事件机制,这些事件机制和Bean的生命周期的结合为Bean的管理提供了便利
  4. 在ApplicationContext中提供的附加服务,这些服务使得基本的ioc容器的功能更加丰富,使得ApplicationContext与简单的BeanFactory相比,对它的使用是一种面向框架的使用风格,所以一般建议在开发应用时使用ApplicationContext作为ioc容器的基本形式。

DefaultListableBeanFactory相关类功能介绍

几乎所有的beanFactory都是以DefaultListableBeanFactory为基类或者持有该类来作为ioc容器因此有必要了解相关类的作用

——AliasRegistry:公用的别名管理接口

——SimpleAliasRegistry别名公用管理的简单实现类,基本上关于BeanRegistry的实现类都会继承该类

——BeanDefinitionRegistry持有bean定义的接口,通常由内部是AbstractBeanDefinition层次结构的beanFactory实现,如:DefaultListableBeanFactory

——SingletonBeanRegistry手动注册单例对象的接口,一般不推荐使用,因为没有spring官方说这是不被正式支持的,这样做可能会引起并发访问异常,在容器中的与/或状态不一致

——BeanFactory是spring bean容器的根接口,包含所有bean容器基本的操作,如getBean

——DefaultSingletonBeanRegistry继承SimpleAliasRegistry类,实现了SingletonBeanRegistry接口的类,因此就是一个默认的手动注册单例对象的实现类,增加了对别名的管理

——HierarchicalBeanFactory表明这些bean是有继承关系的一个接口

——ListableBeanFactory定义了一些获取有相似属性的bean列表

——FactoryBeanRegistrySupport支持基类的单例注册并且对DefaultSingletonBeanRegistry的一些单例进行管理,还可以处理一些FactoryBean的操作

——ConfigurableBeanFactory在基类的基础上添加一些对beanFactory的一些配置

——AbstractBeanFactory是一个完全实现了ConfigurableBeanFactory的,可作为拥有bean定义,获取后端资源功能的beanFactory的实现类的基类的抽象类

——AutowireCapableBeanFactory是一个扩展beanFctory的接口由能够自动装配的beanFactory实现,前提是他们要为现有的bean实例开放此功能

——AbstractAutowireCapableBeanFactory抽象beanFactory的父类,实现了缺省bean的创建和AutowireCapableBeanFactory接口的方法以及AbstractBeanFactory的createBean(java.lang.Class<T>)方法 ,拥有RootBeanDefinition类的完整功能,

——ConfigurableListableBeanFactory配置接口由大多数可列出的beanFactory实现,除了ConfigurableBeanFactory外它还提供一些可以分析修改bean定义以及单例预实例化的工具

——DefaultListableBeanFactory是ListableBeanFactory和BeanDefinitionRegistry接口的默认实现,基于bean 定义对象的beanFactory的完整实现

转载于:https://my.oschina.net/u/2609727/blog/779803

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值