Spring(一)开篇
1、Spring 介绍
在早期 J2EE 时代,开发一个应用程序非常繁琐,先不说对象的创建及管理,如其它数据库访问、提供 Web 服务等都需耗费我们大量时间。当时一位名为 Rod Johnson 的澳大利亚人率先对这种 J2EE 系统框架臃肿、低效的种种现状提出了质疑,之后 Rod Johnson 编写《Expert one on one J2EE design and development》一书,通过书中阐述的部分理念和原型创建了Spring Framework 。(PS:Rod Johnson 居然是音乐学博士???)
Spring Framework 是一个轻量级的 Java开源框架,主要是为了解决企业应用开发的复杂性而创建。它的核心是帮助我们管理对象及其依赖关系,但还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力,还集成了大量的第三方框架,如数据库访问框架 Hibernate ,mybatis、Web 服务框架 Struts 、自身提供的SpringMVC,还有任务调度、Redis 缓存,Mq等。
Spring Framework 还致力于 J2EE 应用的各层解决方案,在表现层、业务层及持久层都集成了相应的功能框架,可以说 Spring 是企业应用开发的“一站式”解决方案。
但其实 J2EE 和 Spring 并不对立,Spring 是 J2EE 的补充,它将 J2EE 的各个规范集成在一起:
- Servlet API(JSR 340)
- WebSocket API(JSR 356)
- 并发实用程序[(JSR 236)
- JSON绑定API(JSR 367)
- Bean验证(JSR 303)
- JPA(JSR 338)
- JMS(JSR 914)
- 依赖注入(JSR 330)
- 通用注释(JSR 250)
可以说 Spring 是“借鉴了”他山之石,来逐步实现自身的生态系统。
2、Spring 框架的演变
Spring 第一个版本于2002年10月发布,至今十几年间, Spring 框架的核心功能、社区支持等各方面都发展迅猛,所以有必要回顾一下Spring 每个里程碑版本所带来的重要特性。
- Spring 0.9:这是该框架第一个公开发布的版本,以《Expert One-on-One: J2EE Design and Development》一书为基础,提供了 bean 配置基础、AOP 支持、JDBC 抽象框架、抽象事务支持等。该版本没有官方参考文档,但可以在SourceForge 上找到现有的源代码和文档。
- Spring 1.x:这是发布的第一个带有官方参考文档的版本。由七个模块组成。
- Spring Core、Spring Context、Spring DAO、Spring ORM、Spring AOP、Spring Web、Spring Web MVC
- Spring 2.x:该版本由六个模块组成,Spring Context 模块融入了 Spring Core 中,Spring Web MVC 融入了 Spring Web 中。
- 支持 AOP 开发的 @AspectJ 注解。
- 完全支持异步JMS 消息驱动的POJO。
- 为调度任务而引入的 TaskExecutor 抽象。
- Java 5 注解支持,特别是 @Transactional、@Required 和 @AspectJ。
- Spring 2.5.x:该版本包含以下功能。
- 新增 @Autowired 注解以及对 JSR-250 注解(@Resource、@PostConstruct 和 @PreDestroy)的支持。
- 新增注册 Bean 的相关注解:@Component、 @Repository、@Service 和 @Controller。
- 除了Spring MVC @Controller 注解,还添加了 @RequestMapping、@RequestParam 和@ModelAttribute 注解,从而支持通过注解配置进行请求处理。
- Spring 3.0.x:这是基于Java 5 的 Spring 第一个版本,旨在充分利用 Java5 的功能,如泛型、可变参数。
- 支持 Java5 功能,例如泛型、可变参数。
- 全面支持 REST。
- 新的 MVC XML 名称空间和其他注解,例如 SpringMVC 中的 @CookieValue 和 @RequessHeaders。
- 验证增强功能和 JSR-303 (Bean 验证)支持。
- Spring 3.2.x:该版本包含以下功能。
- 支持基于 Servlet 3.0 的异步请求处理。
- 新的 SpringMVC 注解 @ControllerAdvice。
- Spring 4.x:这是一个重要的 Spring 版本,也是第一个完全支持 Java 8 的版本。虽然仍然可以使用较旧的版本,但弃用的类和方法己被删除。
- 全面支持 Hibernate ORM 5.0 。
- JMS 和 Web 改进。
- 对 WebSocket 消息传递的改进。
- 引入了AopTestUtils 实用工具类,允许访问 Spring 代理的底层对象。
- Spring 5.x:这是一个主要版本,整个框架都基于Java 8。
- 充分利用Java 8 的强大功能,从而在性能上得到极大的改进。
- 支持 JMS2.0+ 和 JPA 2.1+。
- 引入了 Spring Web Flux,这是一个用于替代 SpringMVC 的项目,构建在反应式基础之上,完全是异步和非阻塞的。
- Web 和核心模块适用于反应式编程模型。
3、Spring 整体架构
到了 Spring 5.0 时代,其模块大约有 20 个,如图:
这些模块被总结为以下几部分。
Core Container
Core Container(核心容器)包含 Core 、Beans 、Context 和 Expression Language 四个模块。
- Core 模决主要包含 Spring 框架的核心工具类,是其他组件的基本核心。如动态代理相关的 asm、cglib,以及各种 Utils,StringUtils、CollectionUtils。
- Beans 模块包含访问配置文件、创建和管理 bean 以及进行 IoC/DI 操作相关的所有类。如:BeanFactory、BeanDefinitions 等。
- Context 模块构建于 Core 和Beans 模块基础之上,其继承了 Beans 的特性,为Spring 核心提供了大量扩展。ApplicationContext 接口是 Context 模块的核心。
- Expression Language 模块提供了强大的表达式语言。就是在远古 JSP 时期使用的 EL 表达式。
Data Access/Integration
Data Access/Integration 包含 JDBC 、ORM 、OXM、JMS 和 Transaction 模块。
- JDBC 模块提供了一个JDBC 抽象层,用来适配所有的数据库厂商。这个模块包含了 Spring 对 JDBC 数据访问进行封装的所有类。
- ORM 模块提供了几种常用的对象关系映射框架,如 JPA 、Hibernate 、iBatis 。
- OXM 模块提供了一个对ObjecνXML 映射实现的抽象层。
- JMS (Java Messaging Service)模块主要包含一些生产和消费消息的特性。
- Transaction 模块支持编程和声明性的事务管理。
Web
Web 层包含了Web 、Servlet 、WebSocket、Porlet 模块。
- Web 模块:提供了基础的面向Web 的集成特性。例如,多文件上传。
- Servlet 模块:该模块包含Spring 的model-view-controller (MVC)实现。
- WebSocket 模块:提供 WebSocket 协议支持。
- Porlet 模块:提供了用于 Portlet 环境和 Servlet 模块的 MVC 的实现
AOP
AOP 模块提供了一个符合 AOP 联盟标准的面向切面编程实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。
- Aspects 模块提供了对AspectJ 的集成支持。
- Instrumentation 模块提供了class instrumentation 支持和classloader 实现,使得可以在特定的应用服务器上使用。
- Messaging 模块:对消息通信集成提供了广泛的支持,及提供简化 JMS API 的使用到异步接收消息的完整基础结构。
Test
Test 模块支持使用 JUnit 和TestNG 对 Spring 组件进行测试。
最后
Spring 背景及架构就介绍到这,接下来将对 Spring 核心容器、AOP、事务这三部分内容展开一系列的讨论。
注:该系列文章使用的 Spring 版本是 5.0+。
以上就是本章内容,如果文章中有错误或者需要补充的请及时提出,本人感激不尽。
参考:
《Spring 源码深度解析(第二版)》
《Spring5 高级编程》
《SpringBoot 编程思想》
https://baike.baidu.com/item/spring/85061#2
https://docs.spring.io/spring/docs/5.2.2.RELEASE/spring-framework-reference/overview.html#overview
Spring(一)开篇的更多相关文章
- 玩转spring boot——开篇
很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...
- spring帝国-开篇
spring简介: spring是一个开源框架,spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Dev ...
- spring boot + vue + element-ui全栈开发入门——spring boot后端开发
前言 本文讲解作为后端的spring boot项目开发流程,如果您还不会配置spring boot环境,就请点击<玩转spring boot——快速开始>,如果您对spring boot还 ...
- Spring Boot 直接用jar运行项目
概述 在Spring Boot 开篇-创建和运行一文中,介绍了如何创建一个Sprint Boot项目并且运行起来.但是运行的方式是在IDEA中直接Run起来的.还有另一中方式可以可以把Spring B ...
- 【Spring实战】----开篇(包含系列目录链接)
[Spring实战]----开篇(包含系列目录链接) 置顶2016年11月10日 11:12:56 阅读数:3617 终于还是要对Spring进行解剖,接下来Spring实战篇系列会以应用了Sprin ...
- Spring Cloud Eureka(一): 开篇说明及目录汇总
开篇简述 基于Spring Boot 和 Spring Cloud 的微服务应用,本人在工作中已经使用两年有余了,伴随着个人学习计划的实施,希望借助博文的方式,将工作中使用到的技术点体系化的总结出来, ...
- spring boot + vue + element-ui全栈开发入门——开篇
最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...
- 深入理解Spring系列之一:开篇
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483810&idx=1&sn=a2df14fdb63 ...
- Spring源码解析(一)开篇
前言 Spring源码继承结构比较复杂,看过以后经常会忘记.因此,记录一下源码分析的过程,方便以后回顾.本次分析的Spring源码版本为3.2.15. 另外,一提Spring就是IOC.DI等等,我们 ...
- Spring Boot☞HelloWorld开篇
目录结构 POM.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
随机推荐
- iptables在我们的网络机房实现NAT共享上网
工作环境:上层代理192.168.60.6(4480),只授予教师机(192.168.62.111)使用该代理的权限 目标:不使用squid代理上网,而是使用NAT的方式上网 方法: 1) 确保停止教 ...
- Python--day46--今日概要
- html设置<input type="text">内的内容自动为大写
添加css样式:text-transform:uppercase;可以实现自动转换为大写样式. 但是input 的value还是小写的,因为它是CSS样式. <input type=" ...
- spring security自定义指南
序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...
- java 标准流
标准输入流: System.in 默认表示的是键盘录入 标准输出流: System.out 默认表示的是屏幕输出 Eg: package june6D; import java.io. ...
- LINUX内核参数调优集锦
1.linux内核参数注释 2.两种修改内核参数方法 3.内核优化参数生产配置 1.linux内核参数注释 以下表格中红色字体为常用优化参数 根据参数文件所处目录不同而进行分表整理 下列文件所在目录: ...
- Git用在公司项目上的操作
修改代码后再次提交 搭档优化好他自己的代码后,我想在vscode上看看他优化后的结果 此时直接git pull origin就可以看到了 j接下来的一些指令,慢慢了解... 分支本身已经在我上面 以下 ...
- js 中日期2013-08-30或2019-08-24 12:30:00 转换成时间戳,和2019-08-29T02:15:08.000+0000转化为2019-08-29T02:15:08
js 中日期2019-08-24 或2019-08-24 12:30:00 转换成时间戳 首先将它转成date日期类型,然后获取毫秒形式时间戳 let date=new Date("2019 ...
- ASP.NET Core 连接 GitLab 与 MatterMost 打造 devops 工具
在现代化开发工具链里面就包含了自动化的通讯工具,而日志写代码我是推到 Gitlab 平台上,我今天听了郭锐大佬的分享之后,感觉我现在的团队的自动化做的远远不够.我在他的课程上学到的最重要一句话就是做工 ...
- 【Linux】grep笔记
Linux grep命令用于查找文件里符合条件的字符串. 参数: -a 或 --text : 不要忽略二进制的数据. -A<显示行数> 或 --after-context=<显示行数 ...