Spring框架知识整理
Spring框架主要构成
Spring框架主要有7个模块:
1.Spring AOP:面向切面编程思想,同时也提供了事务管理。
2.Spring ORM:提供了对Hibernate、myBatis的支持。
3.Spring DAO:提供了 对Data Access Object模式和JDBC的支持。实现业务逻辑与数据库访问代码分离,降低代码耦合度。
4.Spring Web:提供了Servlet监听器的Context和Web应用的上下文。
5.Spring Context:提供了Spring上下文环境,以及其他如国际化、Email等服务。
6.Spring MVC:提供了MVC设计模式的实现。
7.Spring core:提供了Spring框架基本功能(IOC功能),如BeanFactory以工厂模式创建所需对象、通过读取xml文件实例化对象、管理组件生命周期等。
IOC
Inverse of Control控制反转或叫依赖注入,是一种降低对象之间耦合关系的设计思想。
一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行, 即调用者依赖于被调用者。
而通过 IoC 方式, 使得上层不再依赖于下层的接口,即通过采用一定的机制来选择不同的下层实现, 完成控制反转, 使得由调用者来决定被调用者。
IoC 通过注入一个实例化的对象来达到解耦和的目的。使用这种方法后,对象不会被显式地调用,而是根据需求通过 IoC 容器( Spring)来提供。
举个例子来说IOC
采用 IoC 机制能够提高系统的可扩展性, 如果对象之间通过显式的调用进行交互, 那么会导致调用者与被调用者存在着非常紧密的联系, 其中一方的改动将会导致程序出现很大的
改动。
例如,要为一家卖茶的商店提供一套管理系统,在这家商店刚开业的时候只卖绿茶(Green Tea) ,随着规模的扩大或者根据具体销售量,未来可能会随时改变茶的类型,例如红
茶(Black Tea)等,传统的实现方法会针对茶抽象化一个基类,绿茶类只需要继承自该基类即可。
采用该实现方法后,在需要使用 Green Tea 的时候,只需要执行以下代码即可:Abstract Teat = new Green Tea(),当然,这种方法是可以满足当前设计要求的。但是该方法的可扩展
性不好,存在着不恰当的地方。
例如,当商家发现绿茶的销售并不好,决定开始销售红茶(Black Tea) 时, 那么只需要实现一个 Black Tea 类, 并且让这个类继承自 Abstract Tea 即可。
但是,在系统中所有用到 Abstract Tea t = new Green Tea()的地方,都需要被改为 Abstract Teat = new Black Tea(),而这种创建对象实例的方法往往会导致程序的改动量非常大。
那么怎样才能增强系统的可扩展性呢?此时可以使用设计模式中的工厂模式将创建对象的行为包装起来。
可以把创建对象的过程委托给 TeaFatory 来完成,在需要使用 Tea 对象的时候,只需要调用 Factory 类的 get Tea 方法即可,具体创建对象的逻辑在 TeaFactory 中来实现, 那么当商家需要把绿茶替换为红茶的时候, 系统中只需要改动 TeaFactory 中创建对象的逻辑即可。当采用了工厂模式后,只需要在一个地方做改动就可以满足要求,从而增强了系统的可扩展性。
虽然说采用工厂设计模式后增强了系统的可扩展性, 但是从本质上来讲, 工厂模式只不过是把程序中会变动的逻辑移动到工厂类里面了, 当系统中的类较多的时候, 在系统扩展时
需要经常改动工厂类中的代码。而采用 IoC 设计思想后,程序将会有更好的可扩展性。
Spring 容器将会根据配置文件来创建调用者对象(Sale) ,同时将被调用的对象(AbstractTea 的子类)的实例化对象通过构造方法或 set 方法的形式注入到调用者对象中。
当需要把 Blue Tea 改为 Black Tea 时,只需要修改上述配置文件即可,而不需要修改代码。
IOC特点
具体而言,IoC 主要有以下几个方面的优点:
1)通过 IoC 容器,开发人员不需要关注对象是如何被创建的,同时,增加新类也非常方便,只需要修改配置文件即可实现对象的热插拔。
2)IoC 容器可以通过配置文件来确定需要注入的实例化对象,因此,非常便于进行单元测试。
尽管如此,IoC 也有自身的缺点,具体表现为如下两点:
1)对象是通过反射机制实例化出来的,因此,会对系统的性能有一定的影响。
2)创建对象的流程变得比较复杂。