1. 关于 Spring
Spring 是一个轻量级的开源框架,可以简化企业级应用程序开发,其优点有:
- 方便解耦,简化开发:通过 Spring 提供的 IoC 容器来管理对象间的依赖关系,避免过度耦合
- AOP 编程的支持
- 声明式事务的支持
- 方便程序的测试,相对于 EJB 容器
- 方便集成其他第三方框架和类库
2. Spring 框架结构
之前在网上看到的这张图展示的很清楚了,Spring 框架大致包含了四个模块(其实还有测试框架):IoC 容器、AOP、数据访问及集成以及 Web 模块。其中 IoC 容器属于 Spring 的核心模块。
3. IoC 容器
在 Spring 出现前,传统的编程中,我们需要调用其他类的非静态方法时,通常的做法是 new 一个对象,再调用方法。这样的话,一个类中又引用其他类,耦合度非常高。如果日后需要调整、修改时,则需要修改源代码。而且某些对象会被重复创建,比如:Service 层调用 DAO 层方法时重复创建,没有必要,即使是用单例模式解决了对象重复问题,但也引入了新的问题——项目大时,多个 DAO 则每个 DAO 书写重复的单例模式代码,十分繁琐。
后来 Spring 引入了 IoC 容器,IoC(Inversion of Control),中文称为控制反转,其中控制是指控制对象的创建和依赖关系,反转可以理解为转移,将这种控制权转移给 IoC 容器,由它来管理项目中依赖类之间的创建、拼接、管理、获取等工作。
举个栗子,当 Car 对象需要 Tyre(轮子)对象时,IoC 容器会创建 Tyre 对象直接注入到 Car 对象中,不需要 Car 对象自己去获取(或者自己造轮子)。
Spring 主要的容器:
BeanFacotry
:一般只面向 Spring 本身,更偏向底层的使用,是 Spring 框架的核心接口,它实现了容器的许多核心功能。ApplicationContext
:面向 Spring 框架的开发者,一般在使用的时候都是应该使用它而非BeanFactory
WebApplicationContext
:专门为 Web 应用而准备的容器,允许 Web 应用环境直接访问 Spring 应用上下文;需要 Web 容器(如 Tomcat)才可以完成启动工作
ApplicationContext 容器:
ApplicationContext 有两个常用的实现类
ClassPathXMLApplicationContext
: 从类路径下加载配置文件FileSystemXmlApplicationContext
: 从文件系统中加载配置文件
上面两个类同时实现了ConfigurableApplicationContext
接口,这个接口新增加两个主要方法:refresh() 和 close(),让 ApplicationContext 具有启动、刷新和关闭上下文的能力。
而且 ApplicationContext 容器在初始化上下文的时候就会实例化所有单例模式的 Bean。
4. DI(Dependency Injection)
又称依赖注入,上面的 IoC 可以理解成是 Spring 管理对象的一种设计理念,而 DI 则是 Spring 实现这种理念所使用的具体方法,主要有构造器注入
、属性注入
以及接口注入(资料比较少,说是侵入性比较强,很少使用,有兴趣的可以 Google 下)
。大致思想是通过 IoC 容器 Spring 把众多对象独立创建,然后根据配置好的依赖关系,把被依赖的对象赋值给依赖对象的成员属性。