Spring框架是一个开源轻量级的J2EE框架
轻量级:引入的jar包非常少
开源:免费的源代码
框架:用于解决企业应用开发的复杂性
-
Spring的特性
-
非侵入式:使用Spring Framework开发应用程序时,Spring对应用程序本身的结构影响非常小,对领域模型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化,使得开发应用程序时结构清晰、简洁优雅
-
DI:依赖注入,指依赖的对象不再需要手动调用setXX方法来设置,而是用过配置赋值
-
容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期
-
组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在Spring中可以使用XML和Java注解组合这些对象
-
一站式:在IOC和AOP的基础上,可以整合各种企业应用的开源框架和优秀的第三方类库
-
IOC:控制反转
把创建对象的过程交给Spring管理
-
AOP:面向切面编程
不修改源代码的情况下,进行功能的扩展或增强
-
-
Spring框架的优点
-
低入侵式设计,代码污染小:基于Spring开发的应用中的对象可以不依赖于Spring的API
-
方便解耦、简化开发:依赖注入的方式,不再需要手动调用来注入,直接通过配置或者注解的方式实现
-
IOC控制反转:使用控制反转,将对象的创建权交给Spring创建,使用Spring之前,对象的创建都是由我们自己在代码中new的
-
AOP编程支持:使用注解的方式完成切面业务工作。
-
方便程序测试:一个单元模式中是有组织的,即使包和类的数量非常大,只要担心业务本身,其他可以忽略,测试也是如此
-
方便和其他框架整合:Spring自身也集成了一些现有技术框架,例如:ORM、日志、Quartz框架等,也可以自己集成一些框架
-
方便进行事务管理:提供了一致的事务管理接口,可向下扩展到本地事务(使用单一的数据库)并扩展到全局事务(JTA)
-
降低API的开发难度:Spring封装了一些非常难用的API(JDBC、JavaMail、远程调用等)
-
Spring的四大核心组成:IOC、AOP、JDBC、WEB
Spring的组件
下图来源于Spring官网,但是依旧是V4的版本图,在5中做了一系列的改动,例如:移除了portlet组件、增加了jcl日志管理组件,新增了WebFlux模块等
Test模块
Spring支持Junit和TestNG测试框架,而且还额外提供了一些基于Spring的测试功能,比如在测试Web框架时,模拟Http请求的功能
**Test模块(spring-test)**主要包含:
-
Mock Objects
-
TestContent Framework
-
Spring MVC Test
-
WebTestClient
源码包
Core Container模块
Core Container是Spring的核心容器,由Beans模块、Core模块、Context上下文模块和SpEL表达式语言模块组成
Beans模块(spring-beans):提供了框架的基础部分,包括控制反转和依赖注入
Core核心模块(spring-core):封装了Spring框架的底层部分,包括资源访问、类型转换及一些常用的工具类
Context模块(spring-context、spring-context-xxx):建立在Core和Beans模块的基础之上,集成Beans模块功能并添加资源绑定、数据验证、国际化、JavaEE支持、容器生命周期、事件传播等。ApplicationContext接口时上下文模块的焦点
SpEL模块(spring-expression):提供了强大的表达式语言支持,支持访问和修改属性值,方法调用、支持访问及修改数组、容器和索引器、命名变量、支持算数和逻辑运算、支持从Spring容器中获取Bean,它也支持列表投影、选择和一般的列表聚合等
对应的源码模块
AOP、Aspect、Instrumentation和Messaging模块
建立在Core Container模块之上是AOP、Aspect等模块,主要是用于提供一些开发框架
AOP模块(spring-aop):提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合
Aspect模块(spring-aspects):提供与AspectJ的集成,是一个功能强大且成熟的面向切面编程的框架
Instrumentation模块(spring-instrument):提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用
message模块(spring-messaging):Spring4.0以后新增了消息模块,该模块提供了对消息传递体系结构和协议的支持
jcl模块(spring-jcl):Spring 5.x中新增了日志框架集成的模块
对应的源码模块
Data Access/Integration模块
数据访问/集成层包括JDBC、ORM、OXM、JMS和Transactions模块,用于提供持久层框架
JDBC模块(spring-jdbc):提供了一个JDBC的样例模版,使用这些模版能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处
ORM模块(spring-orm):提供与流行的对象关系映射框架无缝集成的API,包括JPA、JDO、Hibernate和Mybatis等。而且还可以使用Spring事务管理,无需额外控制事务
OXM模块(spring-oxm):提供了一个支持Object/XML映射的抽象层实现,如:JAXB、Castor、XMLBeans、JiBX和XStream。将Java对象映射成为XML数据,或者将XML数据映射为Java对象
JMS模块(spring-jms):指Java消息服务,提供一套生产者/消费者消息模版,用于简单的使用JMS。JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信
Transactions事务模块(spring-tx):支持编程和声明式事务管理
对应源码模块
Web模块
Spring的Web层包括Web、Servlet、WebSocket和WebFlux组件
Web模块(spring-web):提供了基本的Web开发集成特性,比如多文件上传功能、使用的Servlet监听器的IOC容器初始化以及Web应用上下文。
Servlet模块(spring-webmvc):提供了SpringMVC Web框架实现,SpringMVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等以及一套非常易用的JSP标签,完全无缝与Spring其他技术协作
WebSocket模块(spring-websocket):提供了简单的接口,用于只要实现响应的接口就可以快速搭建WebSocket Server,从而实现双向通讯。
WebFlux模块(spring-webflux):Spring WebFlux是Spring Framework 5.x中引入的新的响应式web框架。与SpringMVC不同,它不需要Servlet API,是完成异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux用于创建基于事件循环执行模型的完成异步且非阻塞的应用程序。
对应的源码模块
Spring 5.x移除的模块:
Portlet模块:提供了在Portlet环境中使用MVC实现,类似Web-Servlet模块的功能