读书记:Spring框架设计理念<一>

Spring组件概览图



 

一、Spring的核心组件为什么是Bean?

        Spring组件众多,核心组件莫非有三,Context、Core以及Bean。而三者之中最核心的莫过于Bean。其实,Spring本身框架可以理解为面向Bean的编程(Bean Oriented Programming)。Spring作为目前最优秀的框架之一,它最核心的问题在于解决了一个非常关键的一个问题,它可以把对象之间的依赖关系抽离出来通过配置文件进行管理,也就是Spring最核心的理念 依赖注入--DI(Dependency Injection),而这种关系是通过IOC容器实现统一管理。而IOC容器又是什么呢?它其实就是通过Bean包装的各种对象。Spring实现了把通过Bean包装好的对象进行统一管理和额外操作的目的。Spring根据各个Bean设计它的生存环境,并让它在该环境中根据一定的约束不停的运动,达到与环境或者其它个体进行信息交换,这就是Spring的设计理念。

二、Spring的核心组件是如何协同工作的?

       Bean包装的Object,而为Object中的数据提供生存环境,就是Context所要解决的问题,对于Context来讲,它的作用就是发现各个Bean之间的关系,并为这种关系建立良好的维护。所以我们可以理解Context其实就是各种Bean之间的关系集合,这个关系集合我们可以把它称作IOC容器。而在这个过程中,Core有什么作用呢?我们可以把Core当作Util来理解,Core就是在发现、建立、维护每个Bean之间关系所需要用到的一系列工具。举个例子,如果Bean当作一场演出中的各个演员, 那么Context就好比把各个演员串联起来的剧本,而Core则可以理解为这台演出中的各种道具。

三、Bean组件详解

      Bean位于org.sringframework.beans包下,这个包主要解决了三个问题,Bean的定义、Bean的创建以及Bean的解析。对于使用者来说,我们通常只需要关注Bean的创建,其它两个问题在Spring内部自身解决。

     Bean的创建模式是典型的工厂方法, 顶级接口是BeanFactory,它下面有三个子类,而最终的实现方式则都是由DefaultListableBeanFactory来实现,各个子类都有各自的使用场景,主要作用是区分Spring在内部对象的处理时,对数据所作出的限制和约束。

     Bean的定义由beanDefinition描述,Bean的定义需要在配置文件中定义的<bean/>节点详细描述,当Spring成功解析一个Bean节点时,它会自动转化成BeanDefinition对象,以后所有的操作都是基于BeanDefinition来进行的。

    而Bean的解析则相当复杂,因为为了保证足够的灵活性,被扩展的地方很多,以应对可能的变化。

四、Context组件详解

    Context位于org.springframework.context包下,主要作用是维护各个Bean之间的关系集,为Spring提供运行环境。ApplicationContext是context的顶级父类,它基于5个接口,这5个接口扩展的context的功能。比如ResourcesPatternResolver 以及ListableBeanFactory。 ResourcesLoader表明, 在Spring运行的过程中,它可以访问到任何外部资源 ,而BeanFactory则印证了Spring运行的主题就是Bean。

     总体来讲,Context主要完成的功能有以下四点:

      1.标识一个应用环境;

      2.利用BeanFactory创建Bean对象;

      3.保存对象之间的各种关系;

      4.能够监听各种事件;

五、Core组件详解

       core位于org.springframework.core包下,前面我们讲到core包可以理解为一个Utils类,这里我们以资源的访问方式为例进行说明。

      在Resources接口中封装了各种可能的资源类型。它继承了InputStreaSource接口,在该接口中实现了getInputStream方法, 返回的是InputStream类。因此所有的资源都可以通过InputStream类获取,这样实现了屏蔽资源提供者和资源类型的不同。同时对于资源加载的问题, 是通过ResourcesLoader来实现的,屏蔽了资源加载的差异。对于使用者来说,通过一个接口来屏蔽资源的类型以及加载方式,这种设计理念是值得借鉴的。Context在创建运行环境时,把资源的加载、解析和描述工作交给了ReSourcesPatternResolver来完成。它相当于一个接头人,把资源的加载、解析、和定义整合在一起。交给Context使用。

猜你喜欢

转载自marcoxiao.iteye.com/blog/2285802
今日推荐