概述
Spring 是一个开源的轻量级 Java SE/Java EE开发应用框架
其目的是用于简化企业级应用程序开发
- Spring 是一个容器
- 通过反转控制( IoC )和依赖注入( DI )来实现高内聚、低耦合的应用
- 整合很多第三方框架
- 提供面向切面编程( AOP )的能力
- 对数据库事务的管理尤其方便
优点
Spring 容器
- Spring 容器是非侵入式的(不需要依赖任何 Spring 特定类).
- 完全采用 POJOs 进行开发,使应用程序更容易测试、更容易管理
- 不需要依赖任何应用服务器,可以部署在任何环境( Java SE 或 Java EE )
AOP
面向切面编程:从另一个角度来考虑程序结构以完善面向对象编程( OOP )
即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。
Web 层支持
Spring 本身提供一套非常强大的 MVC 框架,而且可以非常容易的与第三方 MVC 框架集成,比如 Struts JSF等。
数据库支持
JDBC 抽象及 ORM (对象关系映射)框架支持:
- Spring 使 JDBC 更加容易使用;提供 DAO(数据访问对象)支持
- 非常方便集成第三方 ORM 框架,比如 Hibernate JPA 等
- 并且完全支持 Spring 事务和使用 Spring 提供的一致的异常体系
简化各种技术集成
提供对 Java Mail 、任务调度、 JMX 、 JMS 、 JNDI 、 EJB 、动态语言、远程访问、 Web Service 等的集成。
核心容器
- Core 模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。
- Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。
其中 BeanFactory 是容器核心,本质是“工厂设计模式”的实现
无需编程实现“单例设计模式”,单例完全由容器控制,提倡面向接口编程
所有应用程序对象及对象间关系由框架管理
所有这些依赖关系都由 BeanFactory 来维护 - Context 模块:
以 Core 和 Beans 为基础,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、 Java EE 支持、容器生命周期、事件传播等;
核心接口是 ApplicationContext 。 - EL 模块:
提供强大的表达式语言支持,支持访问和修改属性值,方法调用
支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算
支持从 Spring 容器获取 Bean, 它也支持列表投影、选择和一般的列表聚合等
IoC 容器
- IoC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖
- 应用程序无需直接在代码中 new 相关的对象,应用程序由 IoC 容器进行组装
- Spring IoC 容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配
Spring 配置元数据
Spring IoC 容器完全由实际编写的配置元数据的格式解耦。有下面三个重要的方法把配置元数据提供给 Spring 容器:
- 基于 XML 的配置文件
- 基于注解的配置
- 基于 Java 的配置
DI依赖注入
即由容器动态的将某个依赖关系注入到组件之中
Spring IoC容器注入依赖资源主要有以下两种基本实现方式:
- 构造器注入:通过配置构造器参数实现,构造器参数就是依赖
包括实例工厂方法参数注入依赖,但静态工厂方法参数不允许注入依赖;
构造器注入可以根据参数索引注入、参数类型注入或Spring3支持的参数名注入 - setter注入:通过setter方法进行注入依赖;
是通过在通过构造器、静态工厂或实例工厂实例好Bean后,通过调用Bean类的setter方法进行注入依赖
setter注入方式只有一种根据setter名字进行注入
setter注入的方法名要遵循“JavaBean getter/setter 方法命名约定”
除了测试程序的代码外,也就是程序入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring—非入侵。
客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改—低耦合。
自动装配
- @Autowired注解
使用byType进行装配
可以在属性中使用 @Autowired 注释来除去 setter 方法
可以在 setter 方法中使用 @Autowired 注释来除去元素 - @Qualifier注解
使用byName进行装配 - @Required
应用于 bean 属性的 setter 方法,
它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中 - 自动检测配置
<context:component-scan base-package="">
base-package属性指定要自动检测扫描的包