Spring 模块化设计(Modular)
spring的模块化设计和java9的模块化设计不是完全对等的, 不过spring的模块化确实可以应用到java9的模块化里面去, 这是为什么呢? 因为spring在某个版本开始将它的模块划分成更细粒度的一些小的JAR包, 这些JAR包可以运用按需分配的方式来依次的依赖.本节讨论目前这林林总总20个模块的一些特性以及使用情况.
从PPT可以看到有20个模块, 这些模块的来源可以参考spring的git上的情况:
https://github.com/spring-projects/spring-framework
截的是官网 5.2.16版本, 可能与ppt的有所不同
每个模块都是一个单独的目录
放在老版本之前不是这个样子的, 以前所有东西都被放在一起.
• spring-aop
顾名思义就是面向切面编程.
使用基于AOP 的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。
外部依赖spring-core, (spring-beans,AOP Alliance, CGLIB,Commons Attributes)
• spring-aspects
spring对aspects支持相关
• spring-beans
这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion ofControl / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了.
外部依赖spring-core,(CGLIB)
spring-beans和spring-context合起来就是Spring IoC的一个重要的核心的实现.
而无论spring-beans还是spring-context, 都需要spring-core来进行支持.
• spring-context-indexer
虽然类路径扫描非常快,但是Spring内部存在大量的类,添加此依赖,可以通过在编译时创建候选对象的静态列表来提高大型应用程序的启动性能.
但是在此模式下,作为组件扫描目标的所有模块都必须使用此机制。才可以.
需要spring5以上才能使用
• spring-context-support
包含支持缓存Cache(ehcache)、JCA、JMX、 邮件服务(Java Mail、COS Mail)、**任务计划Scheduling(Timer、Quartz)**方面的类.
外部依赖spring-context.
• spring-context
这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。
外部依赖spring-beans, (spring-aop)
Sping IoC 的另一个核心实现
• spring-core
这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
外部依赖Commons Logging, (Log4J)
• spring-expression
Spring表达式语言, 从spring3开始引入的, 类似JSP里面的EL语言.
• spring-instrument
spring2开始引入, 对 Java装配 的支持, 就是 java的agent 的支持.
Spring3.0对服务器的代理接口
• spring-jcl
新模块, 从spring5开始支持.
因为之前有其他模块, 关于 commons-logging, 统一了 java的log 和 log4j, 之后又出现了一个新型的日志框架叫做 Logback,
又用到了 SLF4J, 来将 java的log 和 log4j 和 Logback 进行统一.
spring为了解决整合日志API这个问题, 就有了 spring-jcl 来统一其日志管理.
由此可见spring 的日志是依赖的外部 API, 因为外部API会不断发生变化, 因此需要统一的方式进行维护.
外部依赖commons-logging, java的Logging, log4j, Logback, SLF4J
• spring-jdbc
这个jar 文件包含对Spring 对 JDBC 数据访问进行封装的所有类。
外部依赖spring-beans,spring-dao
• spring-jms
这个jar包提供了对 JMS(Java Message Service) 的支持. 比如Apache的 ActiveMQ 或者其他传统的java的消息中间件.
JMS过去是希望通过一套标准的API来统一比如说 MQ, WebLogic MQ, WebSphere MQ, 而 spring的野心更大, 从下面一个包可以看出来.
另外像RabbitMQ, RocketMQ这种不是 JMS 协议的不在这里支持.
外部依赖spring-beans,spring-dao,JMS API
此外,还有下面这些以spring-j*
开头的包,本人还没用过。spring-jmx.jar这个jar包提供了对JMX 1.0/1.2的支持类。
外部依赖spring-beans,spring-aop, JMX API。spring-jca.jar对JCA 1.0的支持。
外部依赖spring-beans,spring-dao, JCA API。spring-jdo.jar对JDO 1.0/2.0的支持。外部依赖spring-jdbc, JDO API, (spring-web)。spring-jpa.jar对JPA 1.0的支持。
外部依赖spring-jdbc, JPA API, (spring-web)。
• spring-messaging
spring-messaging模块为集成messaging api和消息协议提供支持, 针对spring想统一一下消息服务的一个实现,
那么这里就提供了对如 Kafka, RabbitMQ, RocketMQ, 等消息中间件的支持. 但是也支持 JMS.
所以这里体现了spring 比 JMS 更大的一个野心
• spring-orm
包含Spring对DAO特性集进行了扩展,使其支持 myBatis、JDO、OJB、TopLink, 因为Hibernate已经独立成包了,现在不包含在这个包里了。
这个jar文件里大部分的类都要依赖spring-dao.jar里的类,用这个包时你需要同时包含spring-dao.jar包
• spring-oxm
Spring 对 Object/XML 的映射支持,可以让Java与XML之间来回切换.
就是 marshal 和 unmarshal 这么一个东西. 也就是XML里面的 序列化 和 反序列化
• spring-test
对Junit等测试框架的简单封装.
如前面讲的 Mock对象, TestContext, springMVC的测试, WebClient 的测试
• spring-tx
以前是在这里org.springframework.transaction
为 JDBC、Hibernate、JDO、JPA、Beans等提供的一致的声明式和编程式事务管理支持
面试重点.
借鉴了JDBC的事务实现以及 Java EE 尤其是 EJB的一个事务实现, 做了一个统一封装.
这里后面会讲, spring Framework的框架来源于, 其作者 Rod Johnson 写过一本书,
《Expert One-on-One J2EE Development without EJB》, 有中文版, 就是不用EJB来开发JavaEE, 里面讲的一个特点是, 由于事务的重现, 比如说测试性或者是可易用性, 一定要依赖某一个容器, 所以这个方便度肯定不高, 所以 Spring 提供了一个 TX(Transaction)的一个抽象, 方便我们来进行使用.
• spring-web
为什么一个web还分了下面四个部分? 其实也反映了 spring 想统一的思想. 在Java EE 时代, web有两个方面进行呈现, 一个是传统的 Servlet API, 另一方面是 JAX-RS, java标准的注解方式驱动来开发REST服务, spring以这两个为基础, 开发出了 spring WebMVC 和 WebFlux.
所以可以看到 springMVC 和 spring WebFlux 里面的一些注解和 JAX-RS 非常像.
这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web ApplicationContext 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。
外部依赖spring-context, Servlet API, (JSP API, JSTL,Commons FileUpload, COS)。
org.springframework.web.portlet SpringMVC的增强。
org.springframework.web.servlet 对J2EE6.0的Servlet3.0的支持。
org.springframework.web.struts Struts框架支持,可以更方便更容易的集成Struts框架
• spring-webflux
• spring-webmvc
这个jar 文件包含Spring MVC 框架相关的所有类.
包括框架的Servlets,Web MVC框架,控制器和视图支持.
当然,如果你的应用使用了独立的MVC 框架,则无需这个JAR 文件里的任何类.
外部依赖spring-web, (spring-support,Tiles,iText,POI)
• spring-websocket
spring 对 websocket 上面的提升可以体现在这里, 比如 webSocket API 它觉得不好用, 就做了一些新的封装, 来帮助你来管理它的 Session, 管理它的消息.