Spring简介
# Spring简介
# 什么是Spring
Spring (opens new window)[Spring Framework]是于2003年兴起的一个轻量级的Java开发框架,它是为了解决企业级应用开发的复杂度问题而创建的(降低耦合度)。Spring以控制反转(IoC)和面向切面程(AOP)为核心,提供了展现层 Spring MVC 和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库。简单来说,Spring是一个分层的JavaSE/EE full-stack(全栈)轻量级开源框架。
- Spring的主要作用就是为代码“解耦”,降低代码间的耦合度。所以Spring又可以称为胶水框架。
根据功能的不同,可以将一个系统中的代码分为主业务逻辑与系统级业务逻辑(交叉业务逻辑)两类。它们各自具有鲜明的特点:
- 主业务逻辑:主业务代码间逻辑逻辑紧密,有具体的专业业务应用场景,复用性相对较低。例如:银行业务、物流业务、电商业务、在线教育业务等。
- 系统级业务逻辑(交叉业务逻辑):系统级业务相对功能独立,没有具体的专业业务应用场景,主要是为主业务提供系统级服务,如日志、安全、事务、数据库连接等,复用性强。例如:JDBC连接数据库的逻辑(加载驱动、创建连接、开启事务、SQL操作【主业务逻辑】、提交事务、释放连接)。
Spring根据代码的功能特点,将降低耦合的方式分为了两类:IoC与AOP。
- IoC(控制反转):使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由Spring容器统一管理,自动"注入"。
- AOP(面向切面):使得系统级服务得到 了最大复用,且不用再由程序员手工将系统级服务“混杂“到主业务逻辑中了,而是由Spring容器统一完成“织入”。
# Spring发展历程
- 1997年 IBM 提出了EJB的思想; 1998年,SUN 制定开发标准规范EJB1.0; 1999年,EJB 1.1发布; 2001年,EJB 2.0发布; 2003年,EJB 2.1发布; 2006年,EJB 3.0发布;
- Rod Johnson(Spring之⽗)
- Expert One-to-One J2EE Design and Development(2002) 阐述了J2EE使⽤EJB开发设计的优点及解决⽅案
- Expert One-to-One J2EE Development without EJB(2004) 阐述了J2EE开发不使⽤EJB的解决⽅式(Spring雏形)
- ......
- 2017 年 9 ⽉份发布了 Spring 的最新版本 Spring 5.0 通⽤版(GA)
# Spring核心结构
Spring 4.x 的官方文档给出的Spring框架模块介绍:
Spring框架包含组织为约20个模块的功能。这些模块分为核心容器( Core Container),数据访问/集成(Data Access/Integration),Web,AOP(Aspect Oriented Programming,面向方面的编程),检测,消息传递和测试(Test),如下图所示。
注意:暂时未找到官方文档对于Spring 5.x架构的说明,Spring 5.x版本变动较大,更多是使用spring-boot框架,但是可以从Spring 4.x (opens new window)了解Spring大致体系结构。
# Spring核⼼容器(Core Container)
容器是Spring框架最核⼼的部分,它管理着Spring应⽤中bean的创建、配置和管理。在该模块中,包括了Spring bean⼯⼚,它为Spring提供了DI的功能。基于bean⼯⼚,我们还会发现有多种Spring应⽤上下⽂的实现。所有的Spring模块都构建于核⼼容器之上。
# ⾯向切⾯编程(AOP)/Aspects
Spring对⾯向切⾯编程提供了丰富的⽀持。这个模块是Spring应⽤系统中开发切⾯的基础,与DI⼀样,AOP可以帮助应⽤对象解耦。
# 数据访问与集成(Data Access/Integration)
Spring的JDBC和DAO模块封装了⼤量样板代码,这样可以使得数据库代码变得简洁,也可以更专注于我们的业务,还可以避免数据库资源释放失败⽽引起的问题。 另外,Spring AOP为数据访问提供了事务管理服务,同时Spring还对ORM进⾏了集成,如Hibernate、MyBatis等。该模块由JDBC、Transactions、ORM、OXM 和 JMS 等模块组成。
# Web
该模块提供了SpringMVC框架给Web应⽤,还提供了多种构建和其它应⽤交互的远程调⽤⽅案。 SpringMVC框架在Web层提升了应⽤的松耦合⽔平。
# Test
为了使得开发者能够很⽅便的进⾏测试,Spring提供了测试模块以致⼒于Spring应⽤的测试。 通过该模块,Spring为使⽤Servlet、JNDI等编写单元测试提供了⼀系列的mock对象实现。
# Spring的优势
# 非侵入式
所谓非侵入式是指,Spring框架的API不会出现在业务逻辑上出现。由于业务逻辑中没有Spring的API,所以业务逻辑可以从Spring框架快速的移植到其他框架,即与环境无关。
# IoC容器,解耦简化开发
Spring提供的IoC容器,可以管理对象的生命周期、对象与对象之问的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。避免硬编码所造成的过度程序耦合。⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更专注于上层的应⽤。
# AOP编程的⽀持
面向切面编程(AOP,Aspect Orient Programming)是一种编程思想,是对面向对象编程OOP的补充,很多框架都实现了对AOP编程思想的实现。Spring也提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如日志和事务管理)进行开发。应用对象只实现他们应该做的:完成业务逻辑。他们并不负责其他的系统级关注点,例如日志或事务支持。
# 声明式事务
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活的进⾏事务的管理(@Transactional),提⾼开发效率和质量。
# 方便测试
可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的事情。
# ⽅便集成优秀框架
Spring可以降低各种框架的使⽤难度,提供了对各种优秀框架的直接⽀持。
# 降低 JavaEE API的使⽤难度
Spring对JavaEE API(如JDBC、JavaMail、远程调⽤等)进⾏了薄薄的封装层,使这些API的使⽤难度⼤为降低。
# 经典的 Java 学习范例
Spring的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对设计模式灵活运⽤以及对Java技术的⾼深造诣。它的源代码⽆意是Java技术的最佳实践的范例
# JDK要求
- JDK 8+ for Spring Framework 5.x
- JDK 6+ for Spring Framework 4.x
- JDK 5+ for Spring Framework 3.x