Spring简介
官网
Spring官网:Spring Framework
GA(General Availability,普遍可用)为稳定版本
SNAPSHOT 为快照版本,不稳定
Github源码:GitHub - spring-projects/spring-framework: Spring Framework
Spring Framework历史版本网址:https://docs.spring.io/spring-framework/docs/
Spring依赖下载路径:repo.spring.io
Spring简介
J2EE
作为一种企业级应用开发平台,其优异表现是我们有目共睹的。但纵使是最为强大的军队,如果没有一个好的指挥官,不知道如何发挥这支军队的强大战斗力,那这支军队也不可能取得太多辉煌的战果。在J2EE
平台的一些早期实践中,就出现了对J2EE
平台所提供的各项服务的滥用,将基于J2EE
平台的企业级开发带入了窘境。
Spring
是于2003年兴起的一个轻量级的Java
开发框架,由Rod Johnson在其著作 《Expert One-on-One J2EE Design and Development》 中阐述的部分理念和原型衍生而来。它的最初目的主要是为了 简化Java EE的企业级应用开发,相对于过去EJB1时代 重量级 的企业应用开发而言,Spring框架的出现为曾经阴霾的天空带来了灿烂的阳光。
Spring 是一套分层的 full-stack
(全栈) 轻量级开源框架,以 IoC
和 AOP
为内核,提供了展现层 Spring MVC
和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,已经成为使⽤最多的 Java EE
企业应⽤开源框架。在 Java
社区中特别流行,基本上完全代替了企业级JavaBeans
(EJB)模型。
Spring特性
核心技术:依赖注入,AOP,事件,资源,i18n国际化,数据验证,数据绑定, 类型转换, SpEL。
测试支持:mock数据, TestContext框架, Spring MVC 测试, WebTestClient。
数据访问:事务管理, DAO层支持, JDBC, ORM, Marshalling XML。
Web框架:Spring MVC ,Spring WebFlux。
集成能力:远程处理, JMS, JCA, JMX, 邮件, 任务, 调度, 缓存。
语言支持:Kotlin, Groovy, 其他动态语言。
核心结构
Spring是⼀个分层⾮常清晰并且依赖关系、职责定位⾮常明确的轻量级框架,主要包括⼏个⼤模块:数据处理模块、Web模块、AOP(Aspect Oriented Programming)/Aspects模块、Core Container模块和 Test 模块,如下图所示,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
等模块组成。 - 网页支持 该模块提供了
SpringMVC
框架给Web
应⽤,还提供了多种构建和其它应⽤交互的远程调⽤⽅案。SpringMVC
框架在Web
层提升了应⽤的松耦合⽔平。 - 测试支持 为了使得开发者能够很⽅便的进⾏测试,
Spring
提供了测试模块以致⼒于Spring
应⽤的测试。 通过该模块,Spring
为使⽤Servlet
、JNDI
等编写单元测试提供了⼀系列的mock
对象实现。Test模块
支持使用JUnit
或TestNG
测试Spring
组件。它提供一致的Spring
ApplicationContexts
加载和这些上下文的缓存。它还提供了可用于单独测试代码的模拟对象。
核心思想
Core核心 : 整个Spring框架构建在Core核心模块之上,它是整个框架的基础。
组成整个Spring框架的各种服务实现被划分到了多个相互独立却又相互依赖的模块当中。这些模块组成了Spring生命之树的枝和干,说白了也就是它们组成了Spring框架的核心骨架。抓住了这副骨架,也就抓住了Spring框架的学习主线。
依赖注入(Dependency Injection Containers)
IoC是轻量级容器(Lightweight Container)兴起而逐渐被很多人提起的一个名词,它的全称为 Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。《Expert Spring MVC and Web Flow》 和 《Expert One-on-One J2EE without EJB》 等书中都将依赖注入看作是IoC的一种方式。
面向切面编程(Aspect-Oriented Programming)
OOP:Object Oriented Programming,OOP作为面向对象编程的模式,获得了巨大的成功,OOP的主要功能是数据封装、继承和多态。
而AOP是一种新的编程方式,它和OOP不同,OOP把系统看作多个对象的交互,AOP把系统分解为不同的关注点,或者称之为切面(Aspect)。
AOP织入
在Java平台上,对于AOP的织入,有3种方式:
编译期:在编译时,由编译器把切面调用编译进字节码,这种方式需要定义新的关键字并扩展编译器,AspectJ就扩展了Java编译器,使用关键字aspect来实现织入;
类加载器:在目标类被装载到JVM时,通过一个特殊的类加载器,对目标类的字节码重新“增强”;
运行期:目标对象和切面都是普通Java类,通过JVM的动态代理功能或者第三方库实现运行期动态织入。
Spring的AOP实现就是基于JVM的动态代理。由于JVM的动态代理要求必须实现接口,如果一个普通类没有业务接口,就需要通过CGLIB或者Javassist这些第三方库实现。
使用场景
Spring各模块的依赖关系
核心容器模块
名称 | 功能 |
---|---|
spring-core | 提供IoC和DI等功能 |
spring-beans | 提供Bean容器等功能 |
spring-context | 基于core和beans模块构建,扩展了功能 |
spring-expression | 提供SpEL表达式支持 |
AOP模块
名称 | 功能 |
---|---|
spring-aop | 提供AOP(面向切面编程)支持 |
spring-aspects | 提供AspectJ的集成 |
spring-instrument | 提供类植入和类加载器的实现 |
数据访问模块
名称 | 功能 |
---|---|
spring-jdbc | 提供JDBC抽象层来代替原生JDBC功能 |
spring-orm | 提供主流的ORM框架API支持 |
spring-oxm | 提供支持对象和XML映射抽象层 |
spring-tx | 提供编程式和声明式事务管理 |
Web模块
名称 | 功能 |
---|---|
spring-web | 提供Web功能支持 |
spring-webmvc | 提供Web应用程序的MVC和REST Web Services支持 |
spring-webflux | 提供基于响应式编程的Web框架 |
spring-websocket | 提供Web Socket支持 |
测试模块
名称 | 功能 |
---|---|
spring-test | 提供JUnit或TestNG等主流单元测试框架的集成 |
集成模块
名称 | 功能 |
---|---|
spring-context-support | 支持整合第三方工具 |
spring-messaging | 提供消息功能支持 |
spring-jms | 提供支持JMS消息功能支持 |
spring-jcl | 提供日志框架适配器 |
Spring优势
- ⽅便解耦,简化开发
通过Spring
提供的IoC
容器,可以将对象间的依赖关系交由Spring
进⾏控制,避免硬编码所造成的过度程序耦合。⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更专注于上层的应⽤。
- AOP编程的⽀持
通过Spring的AOP功能,⽅便进⾏⾯向切⾯的编程,许多不容易⽤传统OOP
实现的功能可以通过AOP
轻松应付。
- 声明式事务的⽀持 @Transactional
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活的进⾏事务的管理,提⾼开发效率和质量。
- ⽅便程序的测试
可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的事情。
- ⽅便集成各种优秀框架
Spring
可以降低各种框架的使⽤难度,提供了对各种优秀框架(Struts
、Hibernate
、Hessian
、Quartz
等)的直接⽀持。
- 降低JavaEE API的使⽤难度
Spring
对JavaEE API(如JDBC
、JavaMail
、远程调⽤
等)进⾏了薄薄的封装层,使这些API
的使⽤难度⼤为降低。
- 源码是经典的 Java 学习范例
Spring
的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对Java设计模式灵活运⽤以及对Java
技术的⾼深造诣。它的源代码⽆意是Java
技术的最佳实践的范例。
Spring 入门案例
下载 Spring5 依赖
访问repo.spring.io , 右侧选择release-com-org-springframework-spring
创建普通 Maven 工程
1 | ## 使用cmd 或 git bash |
pom.xml
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
创建普通类和方法
1 | package pers.fulsun.pojo; |
Spring配置创建的对象
创建beans的配置文件spring-bean.xml
1 | <beans xmlns="http://www.springframework.org/schema/beans" |
测试代码的编写
1 | package spring.test; |