之前从博客、视频断断续续的学到了 Spring 的相关知识,但是都是一个个碎片化的知识。刚好最近在读 《Sprign实战(第四版)》,所以借此机会重新整理下Spring 系列的内容。
Spring 是什么?
Spring 是一个开源框架,它由 Rod Johnson 创建。它是为了解决企业应用开发的复杂性而创建的。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。
Spring 最根本的使命就是 简化Java开发。为了完成这个使命,Spring 采用了如下几种策略:
- 基于 POJO 的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
下面我们来详细讲解下这几种策略。
基于 POJO 的轻量级和最小侵入性编程
很多框架通过强迫应用继承它们的类或实现接口的形式来达到使用功能的目的,这样的方案导致了应用和框架之间的强耦合,如果更换框架的话将花费更多的成本。
而 Spring 竭力避免这种情况的发现,它不会强迫你必须继承 Spring 规范的类或实现其接口,而且你也看不出来使用 Spring 框架的痕迹。最坏的场景也只是类上面多了一些 Spring注解,但是它还是一个 POJO 类。
依赖注入(DI)
依赖是指两个类之间的关联。例如,类A 依赖于 类B。
注入是指在 类A 中获取到 类B 的引用,可以在 类A 中使用 类B 的功能。
依赖注入可以采用向 构造函数 传递参数的方式,或者通过使用 setter 方法将对象注入进去。
面向切面(aop)
一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。比如日志记录和缓存等等。
在 OOP 中模块化的关键单元是类,而在 AOP 中模块化的关键单元是切面。AOP 帮助你将横切关注点从它们所影响的对象中分离出来。
Spring 框架的 AOP 模块提供了面向切面的程序设计实现,可以定义诸如方法拦截器和切入点等,从而使实现功能的代码彻底的解耦出来。
使用模板消除样板式代码
样板式代码最常见的就是 JDBC :
public Employee getEmployeeById(long id){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = dataSource.getConnection();
stmt = conn.prepareStatement("select id,name from employee where id = ?");
stmt.setLong(1,id);
rs = stmt.executeQuery();
Employee employee = null;
if(rs.next()){
employee = new Employee();
employee.setId(rs.getLong("id"));
employee.setName(rs.getString("name"));
}
return employee;
}catch(SQLException e){
} finally{
if(rs != null){
tyr{
rs.close();
} catch(SQLException e){
}
}
}
return null;
}
可以看到除了 SQL 和赋值可能不一样以外,其他的都可以重复,那么我们可以通过模板的方式减少样板式代码:
public Employee getEmployeeById(long id){
return jdbcTemplate.queryForObject("select id,name from employee where id = ?",
new RowMapper<Employee>(){
public Employee mapRow(ResultSet rs,int rowNum) throws SQLException{
Employee employee = new Employee();
employee.setId(rs.getLong("id"));
employee.setName(rs.getString("name"));
return employee;
}
},id);
}
Spring 生态圈
在 Spring 框架之上有一个庞大的生态圈,它将 Spring 扩展到不同的领域,如 WEB 服务、移动开发、NoSQL 等等。
Spring 核心模块
Spring 框架里面的模块按其所属功能可以划分为六类不同的功能:
Spring Portfolio
Spring portfolio 包括多个构建于核心 Spring 框架之上的框架和类库。也就是说,整个 Spring portfolio 几乎为每一个领域的 Java 开发都提供了 Spring 编程模型。
项目名称 | 功能 |
---|---|
Spring Web Flow | 建立于 Spring MVC 框架之上,它为基于流程的会话式 Web 应用提供支持。 |
Spring Web Service | 提供了契约优先的 Web Service 模型,服务的实现都是为了满足服务的契约而编写的。 |
Spring Security | 为 Spring 应用提供了声明式的安全机制。 |
Spring Integration | 提供了多种通用应用集成模式的 Spring 声明式风格实现。 |
Spring Batch | 如果需要开发一个批处理应用,可以通过 Spring Batch,使用 Spring 强大的面向 POJO 的编程模型。 |
Spring Data | 不管你使用文档数据库,如 MongoDB;图数据库,如 Neo4j;还是传统的关系型数据库,Spring Data 都为持久化提供了一种简单的编程模型。这包括为多种数据库类型提供了一种自动化的 Repository 机制,它负责为你创建 Repository 的实现。 |
Spring Social | Spring 的一个社交网络扩展模块。 它更多的是关注连接,而不是社交。它能够帮助你通过 REST API 连接 Spring 应用,其中有些 Spring 应用可能原本并没有任何社交方面的功能目标。 |
Spring Boot | Spring Boot 大量依赖于自动配置技术,它能消除大部分 Spring 配置。它还提供了多个 Starter 项目,不管你使用 Maven 还是 Gradle,这都能减少 Spring 工程构建文件的大小。 |