Spring学习之旅(一)--初始Spring
之前从博客、视频断断续续的学到了 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 工程构建文件的大小。 |
Spring学习之旅(一)--初始Spring的更多相关文章
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- Spring学习之旅(十)--MockMvc
在之前的 Spring学习之旅(八)--SpringMVC请求参数 我们是通过在控制台输出来验证参数是否正确,但是这样做实在是太耗时间了,我们今天来学习下 MockMvc,它可以让我们不需要启动项目就 ...
- spring 学习(五):spring 事务
spring 学习(五):spring 事务 事务概要 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同 ...
- Spring学习之旅(二)--容器
在 Spring 应用中,所有的对象都在 Spring 容器(container) 里,容器负责对象的创建.配置.装配并管理它们的整个生命周期. Spring 容器 Spring 容器 并不是只有一个 ...
- Spring学习总结(六)——Spring整合MyBatis完整示例
为了梳理前面学习的内容<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>,做一个完整的示例完成一个简 ...
- Spring学习总结(五)——Spring整合MyBatis(Maven+MySQL)一
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中. 使用这个类库中的类, Spring 将会加载必要的MyBatis工厂类和 session 类. 这个类库 ...
- Spring学习总结(三)——Spring实现AOP的多种方式
AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术.AOP是OOP的补充,是Spring框架中的一个 ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- Spring学习笔记(二)Spring基础AOP、IOC
Spring AOP 1. 代理模式 1.1. 静态代理 程序中经常需要为某些动作或事件作下记录,以便在事后检测或作为排错的依据,先看一个简单的例子: import java.util.logging ...
随机推荐
- [小米OJ] 7. 第一个缺失正数
思路: 参考这个思路 即:将每个数字放在对应的第几个位置上,比如1放在第1个位置上,2放在第2个位置上. 注意几个点:将每个数放在它正确的位置,前提是该数是正数,并且该数小于序列长度,并且交换的两个数 ...
- Catalan公式
f(n)=f(1)*f(n-1)+f(2)*f(n-2)+f(3)*f(n-3)+......+f(n-1)*f(1) 例用:一个长度为n的无重复序列入栈的所有出栈方式
- 【git】Github上面的开源代码怎么在本地编译运行
最近才发现Github是一个好东西,可以从上面学到很多东西,不说了,赶快写完去学习去... 1.首先你可以看看这个开源项目的README.md,一般一般这里都会有项目的使用方式以及一些注意的点 2.你 ...
- 《VR入门系列教程》之8---GearVR
高端移动虚拟现实设备---三星GearVR Oculus Rift也许是虚拟现实头显的典范,但是它还是存在许多问题.首先,它需要基于一个具有强大图形计算能力的计算机,而使用一般的笔记本.苹果A ...
- java练习---12
public class L1106 { public static void main(String[] args) { // TODO Auto-generated method stub Tes ...
- JDK容器类Map源码解读
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...
- Windows 使用 helm3 和 kubectl
简介: 主要原因是,我不会 vim ,在 linux 上修改 charts 的很蹩脚,所以就想着能不能再 windows 上执行 helm 命令,将 charts install linux 上搭建的 ...
- 终极CRUD-2-用lombok提高开发效率
目录 1 lom介绍与基本使用 2 lombok 注意点 2.1 lombok自动生成方法可以混合自己写的方法 2.2 尽量不要使用@Data 2.3 属性不要使用基本类型 2.4 小心@ToStri ...
- Git 的常用的命令
之前一直在使用SVN作为版本管理工具,现在项目要求使用Git,下面简单记录一下一些常用的命令.关于原理和使用方式的详细说明,具体教程参考的廖雪峰的git教程. 1. github 账号的申请. 2. ...
- dz6.0的一个sql注入漏洞
今天开始着手分析第一个漏洞,找了一上午靶机,发现一个含有成人内容的违法网站是用dz6.0搭的,今天就看看dz这个版本的洞了 问题函数位置:my.php第623行 if(is_array($descri ...