介绍
什么是Spring
Spring是一个轻量级框架,是构建企业级应用程序的一站式解决方案。它的目标就是要简化Java企业级开发
Spring是分层的、模块化的,你可以按需引入需要的模块。最核心的模块就是IoC容器,这是Spring的基础,IoC容器用来管理bean的生命周期,在此基础之上,我们可以自行集成Web、消息传递、数据持久化、事务管理等组件。另一大核心是Spring所推崇的AOP(Aspect Oriented Programming,面向切面编程)编程方式,使用AOP编程方法补充了OOP(Object Oriented Programming,面向对象编程),减少了代码的重复,让我们更专注于业务
Spring是开源的,在多年不断的发展和创新中,除了Spring Framework(即我们通常说的Spring框架)之外,Spring家族还有如Spring Boot、Spring Data、Spring Cloud、Spring Batch等项目,几乎涵盖了应用程序所需的所有基础设施(从配置到安全,从web应用程序到大数据),体现着Spring的模块化设计
依赖注入和控制反转
Spring框架体系
(本框架体系描述的是spring 4.x版本)
Spring框架由大约20个模块组成的特性组成。这些模块分为核心容器、数据访问/集成、Web、AOP(面向方面编程)、工具、消息传递和测试。
核心容器
核心容器由spring-core
、spring-beans
、spring-context
、spring-context-support
和spring-expression(Spring Expression Language)
模块组成。
spring-core
和spring-beans
模块提供了框架的基本部分,包括控制反转
(Inversion of Control, IOC)和依赖注入
(Dependency Injection, DI)。BeanFactory是一个复杂的工厂模式实现。它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦,BeanFactory 容器实例化后并不会自动实例化 Bean,只有当 Bean被使用时 BeanFactory 容器才会对该 Bean 进行实例化与依赖关系的装配。spring-context
上下文模块构建在core
和bean
模块之上:它是以一种类似JNDI注册的方式访问对象。Context模块继承Beans模块的特性,并添加了国际化(例如使用资源包)、事件广播、资源加载和透明地创建上下文(例如使用Servlet容器)的支持。context模块还支持EJB、JMX和基本远程处理等JavaEE特性。ApplicationContext是Context模块的核心接口。spring-context-support
支持将常见的第三方库集成到Spring应用程序上下文中,用于缓存(EhCache、Guava、JCache)、邮件(JavaMail)、调度(CommonJ、Quartz)和模板引擎(FreeMarker、JasperReports、Velocity)。spring-expression
模块是统一表达式语言(unified expression language,unified EL)的扩展,用于在运行时查询和操作对象图。该语言支持设置和获取属性值、属性赋值、方法调用、访问数组、集合和索引的内容、逻辑和算术操作符、命名变量,以及从Spring的IoC容器按名称检索对象。还支持列表映射、选择以及常见的列表聚合。AOP 和 Instrumentation
spring-aop
模块提供面向切面的编程实现,允许你定义方法拦截器和切入点对代码干净地解耦分离。使用源码级的元数据功能,还可以将行为信息以类似.NET属性的方式合并到代码中。spring-aspects
模块集成自 AspectJ 框架, 主要是为 Spring AOP 提供多种 AOP 实现方法spring-instrument
模块提供用于某些应用服务器的类instrumentation 支持和类加载器实现。spring-instrument-tomcat
模块用于Tomcat的Spring的instrumentation代理
Messaging
- Spring Framework 4 包含
spring-messaging
模块,来自Spring集成项目的抽象,如Message、MessageChannel、MessageHandler等,用来提供基于消息的基础服务。该模块还包括一组用于将消息映射到方法的注解,类似于基于编程模型的Spring MVC的注解。
数据访问和集成
Data Access/Integration 层由JDBC
、ORM
、OXM
、JMS
和Transaction
模块组成。
spring-jdbc
模块提供了JDBC抽象层,它消除了冗长的JDBC编码和对数据库供应商特定错误代码解析的需要。主要是提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类是 JdbcTemplate、SimpleJdbcTemplate 以及 NamedParameterJdbcTemplatespring-tx
模块支持对实现特殊接口的类和所有pojo(普通旧Java对象)进行编程式和声明式事务管理。spring-orm
模块为流行的 object-relational mapping(对象-关系映射)API(包括JPA、JDO和Hibernate)提供了集成层。使用spring-orm模块,可以结合O/R映射框架与Spring提供的所有其他特性结合,如简单声明性事务管理特性。spring-oxm
模块提供了一个抽象层用于支持 Object/XML mapping (对象/XML映射)的实现,如JAXB、Castor、XMLBeans、JiBX和XStream。spring-jms
模块包含生成和消费消息的功能。从Spring4.1开始,提供了与spring-messaging模块的集成。
Web
Web层由spring-web
、spring-webmvc
、spring-websocket
和spring-webmvc-portlet
模块组成。
spring-web
模块提供了基本的面向web的集成功能。例如多部分文件上传功能,使用Servlet listeners和面向Web的应用程序上下文初始化IoC容器。它还包含HTTP客户端和Spring远程访问web相关的部分的支持。spring-webmvc
模块(也称为Web servlet模块)包含Spring的模型-视图-控制器(model-view-controller,MVC)和Web应用程序的REST Web服务实现。Spring的MVC框架提供了domain model(域模型)代码和web form之间的完全分离,并集成了Spring框架的所有其他特性。spring-websocket
模块主要是与 Web 前端的全双工通讯的协议。spring-webmvc-portlet
模块(也称为Web-Portlet模块)提供了要在Portlet环境中使用的MVC实现,并反映了基于servlet的spring-webmvc模块的功能。(该模块在Spring5中移除)spring-webflux
是一个新的非堵塞函数式 Reactive Web 框架, 可以用来建立异步的、非阻塞、事件驱动的服务,并且扩展性非常好。(Spring5新模块)
Test
spring -test
模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。它提供了Spring ApplicationContext的一致加载和这些上下文的缓存。它还提供了模拟对象,您可以使用这些模拟对象单独测试代码。
Spring 包之间的依赖关系
包列表
spring-core
核心工具类spring-beans
bean支持spring-expression
Spring表达式语言(SpEL)spring-aop
基于代理的AOP支持spring-aspects
基于AspectJ方面spring-context
应用程序上下文运行时,包括调度和远程抽象spring-context-support
支持将公共第三方库集成到Spring应用程序上下文中的类spring-messaging
支持消息传递体系结构和协议spring-instrument
用于JVM引导的插装代理spring-instrument-tomcat
Tomcat的插装代理spring-jdbc
JDBC支持包,包括数据源设置和JDBC访问支持spring-tx
事务基础设施,包括DAO支持和JCA集成spring-orm
对象/关系映射,包括JPA和Hibernate支持spring-oxm
Object/XML Mipmg 对象/ XML映射spring-jms
JMS支持包,包括发送/接收JMS消息的帮助类spring-test
支持单元测试和集成测试Spring组件spring-web
基本的web支持,包括web客户机和基于web的远程处理spring-webmvc
Servlet栈的基于http的模型-视图-控制器和REST端点spring-websocket
WebSocket和SockJS基础架构,包括STOMP消息传递支持spring-webmvc-portlet
要在Portlet环境中使用的MVC实现
依赖关系图
spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging,如果有自己的日志实现如log4j,可以排除对commons-logging的依赖,没有日志实现而排除了commons-logging依赖,编译报错
下图是spring4的jar之间的直接依赖图,在maven中配置spring依赖时不会再混乱了,简洁配置