一、什么是 Spring
Spring框架是一种轻量级解决方案,是构建企业级应用程序的一站式解决方案。然而,Spring是模块化的,允许您只使用需要的部分,而不必引入其他部分。您可以使用IoC容器,上面可以使用任何web框架,但是也可以只使用Hibernate集成代码或JDBC抽象层。Spring框架支持声明式事务管理、通过RMI或web服务远程访问逻辑,以及用于持久化数据的各种选项。它提供了一个功能齐全的MVC框架,使您能够透明地将AOP集成到软件中。
1、介绍
Spring的设计是非侵入性的,这意味着您的域逻辑代码通常不依赖于框架本身。在集成层(例如数据访问层)中,将存在一些对数据访问技术和Spring库的依赖。但是,应该很容易将这些依赖项与代码库的其他部分隔离开来。
Spring框架是一个Java平台,它为开发Java应用程序提供了全面的基础设施支持。Spring处理基础设施,这样您就可以专注于您的应用程序。
Spring使您能够从“普通的旧Java对象”(pojo)构建应用程序,并将企业服务非入侵地应用于pojo。此功能适用于Java SE编程模型以及完整和部分Java EE。
2、依赖注入和控制反转
Java应用程序(一个松散的术语,它运行从受约束的嵌入式应用程序到n层的服务器端企业应用程序)通常由协作形成应用程序的对象组成。因此,应用程序中的对象相互依赖。
尽管Java平台提供了丰富的应用程序开发功能,但是它缺乏将基本构建块组织成一个连贯的整体的方法,这就把这个任务留给了架构师和开发人员。虽然可以使用设计模式,例如工厂,抽象工厂,建筑,装饰,和服务定位器组成的各种类和对象实例应用程序组成,这些模式是:最佳实践给出一个名字,有什么模式的描述,如何应用它,它解决的问题,等等。模式是形式化的
Spring Framework Inversion of Control (IoC)组件通过提供一种形式化的方法,将不同的组件组合成一个完全可用的应用程序,从而解决了这个问题。Spring框架将形式化的设计模式编码为一级对象,您可以将其集成到自己的应用程序中。许多组织和机构以这种方式使用Spring框架来设计健壮的、可维护的应用程序。
二、Spring框架体系
(本框架体系描述的是spring 4.x版本)
Spring框架由大约20个模块组成的特性组成。这些模块分为核心容器、数据访问/集成、Web、AOP(面向方面编程)、工具、消息传递和测试。
1、核心容器
核心容器由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容器按名称检索对象。还支持列表映射、选择以及常见的列表聚合。
2、AOP 和 Instrumentation
spring-aop
模块提供面向切面的编程实现,允许你定义方法拦截器和切入点对代码干净地解耦分离。使用源码级的元数据功能,还可以将行为信息以类似.NET属性的方式合并到代码中。spring-aspects
模块集成自 AspectJ 框架, 主要是为 Spring AOP 提供多种 AOP 实现方法spring-instrument
模块提供用于某些应用服务器的类instrumentation 支持和类加载器实现。
spring-instrument-tomcat
模块用于Tomcat的Spring的instrumentation代理
3、Messaging
- Spring Framework 4 包含
spring-messaging
模块,来自Spring集成项目的抽象,如Message、MessageChannel、MessageHandler等,用来提供基于消息的基础服务。该模块还包括一组用于将消息映射到方法的注解,类似于基于编程模型的Spring MVC的注解。
4、数据访问和集成
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模块的集成。
5、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新模块)
6、Test
spring -test
模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。它提供了Spring ApplicationContext的一致加载和这些上下文的缓存。它还提供了模拟对象,您可以使用这些模拟对象单独测试代码。
三、Spring 包之间的依赖关系
1.包列表
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实现
2.依赖关系图
spring-core依赖了commons-logging,而其他模块都依赖了spring-core,所以整个spring框架都依赖了commons-logging,如果有自己的日志实现如log4j,可以排除对commons-logging的依赖,没有日志实现而排除了commons-logging依赖,编译报错
下图是spring4的jar之间的直接依赖图,在maven中配置spring依赖时不会再混乱了,简洁配置