简介

是什么让java世界变得更好,程序员变得更友爱,秃头率变得不是那么的高,让程序员不必再每天996,有时间找个女朋友?

是Spring。

是什么让企业级java应用变得简单易懂,降低了java程序员的进入门槛,导致了现在遍地都是java程序员的窘境?

是Spring。

是什么从无冕之王变成了事实上的企业标准,让规则制定者也要颤抖几分?

是Spring。

简单的说,Spring满足了你们对于java程序的所有想象。是个java程序员都会投入Spring的怀抱。

今天这篇文件就是对Spring基础的总结。文末附有小彩蛋,欢迎大家向后拉!

Spring基础

Spring是在2003年,作为对之前的复杂的J2EE规范而产生的。有些人认为Spring和J2EE是竞争关系,实际上他们是互补的。

Spring最新版本是5.3.0, 通过使用Spring,我们可以很方便的创建企业级应用程序。同时Spring还提供了对groovy和Kotlin的支持。在Spring5.1之后,需要JDK8以上才能正确运行。

更多内容请访问www.flydean.com

狭义的Spring指的是Spring基础,如下图所示的Spring Framework Runntime:

广义的Spring是指整个Spring家族,包括Spring Boot,Spring Cloud等等项目。

这里我们探讨的是狭义上的Spring Framework。它可以分为下面几个模块:

  1. Core - Core是Spring得以运行的核心,主要包括IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP等内容。
  2. Testing - 测试是Spring中非常重要的一个模块,主要包括Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient等内容。
  3. Data Access - 这一部分是对数据库的访问相关,包括Transactions, DAO Support, JDBC, O/R Mapping, XML Marshalling等内容。
  4. Web Servlet - 传统的对Web Servlet的支持,包括Spring MVC, WebSocket, SockJS, STOMP Messaging等内容。
  5. Web Reactive - 这是Spring5新增的对于响应式系统的支持,包括Spring WebFlux, WebClient, WebSocket等。
  6. Integration - 是对第三方系统的支持,包括Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Caching等常用的第三方系统。
  7. Languages - 最后是对其他JVM语言的支持,包括Kotlin, Groovy等动态语言。

Spring Framework被分成了很多个模块,我们在构建应用程序的时候可以自由选择使用哪个模块。最核心的模块是核心容器:包括配置模块和依赖注入机制。除此之外,Spring Framework提供了对不同应用架构的基础支持,包括消息,交易数据,存储和网站。他还包括了Servlet-based Spring MVC web framework和最新的响应式Spring WebFlux reactive web framework。

Core核心技术

Spring的核心技术是Spring中最为重要的内容,而Core中最最中的就是Spring框架的反转控制(IOC)容器。

通过在Spring中使用面向方面编程(AOP)技术,IOC在Spring中得到了全面的应用。并且Spring搭建了自己的AOP框架,同时Spring还提供了对第三方AOP框架AspectJ的集成,从而满足不同需求的用户的使用。

IOC也称为依赖注入(DI)。它是指对象仅通过构造函数参数、工厂方法的参数或从工厂方法构造或返回对象实例后,通过在其上设置的属性来定义其依赖项(即与之一起工作的其他对象)的过程。当容器在创建bean时将会注入这些依赖项。

这个过程跟bean自己控制实例化,或者通过直接构造类或服务定位器模式来定位其依赖项的方式相反(因此称为控制反转)。

Bean在Spring中就是一个业务组件,我们通过创建各种Bean来完成最终的业务逻辑功能。

在容器内部,每个bean的定义可以被表示为BeanDefinition,通过BeanDefinition可以获得bean的很多信息包括:包名,bean的作用域,生命周期,bean的引用和依赖等。

从最开始的面向过程编程,到后面的面向对象编程,程序的编写方式发生了重大的变化,面向对象编程将业务逻辑封装成一个一个的对象,所有的操作都转换为对对象的操作。

面向对象编程现在使用的非常普遍,一般来说只要是高级语言都支持,但是它也有缺点,比如如果我们想做一些横跨对象的操作(如统计各个对象里面某个方法的执行时间),这时候面向对象可以能力有不逮。我们可能需要在每个对象里面都添加一些统计时间的代码,那么有没有更好的方法来处理这个问题呢?

面向方面编程(AOP)通过提供对程序结构的另一种思考方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而AOP中模块化的单元是方面。方面支持跨多个类型和对象的关注点(如事务管理)的模块化。(在AOP文献中,这种关注通常被称为“横切”关注。)

通常来说一个Bean包含一个默认的无参构造函数,和属性的get,set方法。

org.springframework.beans 包里面有个很重要的类叫做BeanWrapper接口和他的实现BeanWrapperImpl,BeanWrapper提供了设置和获取属性值(单个或批量)、获取属性描述符和查询属性的功能,以确定它们是可读的还是可写的。

此外,BeanWrapper还支持嵌套属性,允许将子属性的属性设置为无限深度。BeanWrapper还支持添加标准JavaBeans属性PropertyChangeListeners和VetoableChangeListeners,而不需要在目标类中支持代码。最后,BeanWrapper提供了对设置索引属性的支持。BeanWrapper通常不直接由应用程序代码使用,而是由DataBinder和BeanFactory使用。

Spring提供了很方便的事件的处理机制,包括事件类ApplicationEvent和事件监听类ApplicationListener。 他实现的是设计者模式,如果实现了ApplicationListener接口的bean部署到Spring容器中,则每次ApplicationEvent发布到ApplicationContext时,都会通知该bean。

SpEL的全称叫做Spring Expression Language。通常是为了在XML或者注解里面方便求值用的,通过编写#{ }这样的格式,即可使用。

Spring定义了Resource接口用来对资源的访问,一般来说资源有两种形式,一种是URL的形式从外部链接加载,一种是File的形式从系统本身查找。

Testing测试

Spring团队提倡测试驱动开发(TDD)。 Spring团队发现正确使用控制反转(IoC)肯定会使单元测试和集成测试更容易(因为类的setter方法和适当的构造函数的存在使得它们更容易在测试中连接在一起而不必设置服务定位器注册表和类似结构)。

例子待续...

Data Access

通过Spring可以方便的进行事物管理,并且为各种数据访问技术(例如JDBC,Hibernate或JPA)提供了一致性的DAO接口,从而可以轻松地在上述持久性技术之间进行切换,不需要考虑对各种数据访问技术的适配问题。

例子待续...

Web Servlet

Spring提供了Spring MVC框架来实现对web的支持,与其他许多Web框架一样,Spring MVC围绕前端控制器模式进行设计,在该模式下,中央Servlet DispatcherServlet提供了用于请求处理的共享算法,而实际工作是由可配置的委托组件执行的。 该模型非常灵活,并支持多种工作流程。

与任何Servlet一样,都需要根据Servlet规范使用Java配置或在web.xml中声明和映射DispatcherServlet。 反过来,DispatcherServlet使用Spring配置发现请求映射,视图解析,异常处理等所需的委托组件。

Web Reactive

除了对于传统的Web Servlet的支持以外,Spring还引入了WebFlux框架和响应式WebClient,实现了对reactive系统的支持。

WebFlux框架是非阻塞的,需要在并在Netty,Undertow和Servlet 3.1+容器等服务器上运行。

例子待续...

总结

曾经的我很幼稚的花了几个月的时间,一句话一句话的来翻译官方的Spring 5.x文档,现在这里奉献给大家,欢迎大家下载,可以的话大家关注我一下,给我点个赞,谢谢了:

Spring Framework 5.x中文指南

不想下载的朋友可以通过这个链接直接阅读 Spring-Framework-Documentation中文文档阅读链接

本文链接:http://www.flydean.com/spring5/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新的更多相关文章

  1. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  2. Spring mvc 4系列教程(三)—— Spring4.X的新特性

    1.Spring4.0的新特性 从2004年Spring的1.0发布后,后面又发布了很多重要的版本:Spring2.0提供了XML命令空间和AspectJ的支持:Spring2.5提出了注解驱动(an ...

  3. Spring mvc 4系列教程(二)——依赖管理(Dependency Management)和命名规范(Naming Conventions)

    依赖管理(Dependency Management)和命名规范(Naming Conventions) 依赖管理和依赖注入(dependency injection)是有区别的.为了将Spring的 ...

  4. Spring mvc 4系列教程(一)

    一.Spring框架概览 Spring框架是一种轻量级.一站式解决企业级应用的解决方案.不仅如此,Spring的模块化的特点,可以使你只引用所需要的部分,而无需引用全部.你可以使用控制反转容器(IoC ...

  5. Spring Data Jpa系列教程--------实体解析和关联关系

    Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...

  6. spring源码系列(一):使用Gradle构建spring5源码的一些坑和步骤

    源代码github:  https://github.com/spring-projects/spring-framework.git 一 修改项目配置文件中gradle版本和地址 替换成本地安装的版 ...

  7. WebApi学习总结系列第三篇(Http)此篇持续更新...

    越了解Http对WebApi开发就越有帮助,因为WebApi就是建立在Http基础之上的. 一.Http: 通过 <ASP.NET Web API 2 框架揭秘>一书中 了解到 什么叫We ...

  8. springboot系列教程导学篇

    spring boot2.0系列教程学习之导学篇 springboot 2.0深度学习系列教程. Spring Boot 虽然凯哥从2015年年初开始就接触了spring boot.但是在之后的公司中 ...

  9. Spring-Cloud-Alibaba系列教程(一)Nacos初识

    前言 在2020年即将开启SpringCloudAlibaba的专题,希望2020年共同学习进步. 学习资料 文档 Naco文档 程序猿DD Spring Cloud Aliabab专题 专题博客 视 ...

  10. Linux Shell系列教程

    学习Linux Shell知识,就来Linux大学网(Linuxdaxue.com)! 本系列适合Linux初学者,属于Linux入门级教程,主要介绍了Shell的分类.语法格式以及脚本的使用和编写格 ...

随机推荐

  1. 名校AI课推荐 | MIT6.S191《深度学习导论》

    "连续开设5年,对新手友好.易于上手,参加课程的多数学生来自非计算机科学领域--" 推荐一门AI课程--MIT官方深度学习入门课程6.S191<深度学习导论(2022)> ...

  2. JAVA对象的生命周期(二)-对象的创建

    目录 对象创建的几种方式 类加载检查. 内存分配 初始化零值 设置对象头 执行init方法 对象创建的几种方式 new clone newInstance 反序列化 String s = " ...

  3. 【Azure Developer】解答《美丽的数学》一书中P120页的一道谜题:寻找第四个阶乘和数

    一道谜题 在观看<美丽的数学>一书中,在120页中有一道谜题: 数字145被称为一个阶乘和数, 因为它具有以下有趣的属性,如果我们将它的各位数字的阶乘相加,会得到该数字本身 1! +4! ...

  4. 【Azure 应用服务】"App Service"如何能判断自身网路没有问题?

    问题描述 当创建了一个App Service服务后,如何能判断服务自身网络链路路没有问题? 如果是用VM,通常用Ping可以判断.但是"网站应用App Service" 的Kudu ...

  5. 掌握pandas cut函数,一键实现数据分类

    pandas中的cut函数可将一维数据按照给定的区间进行分组,并为每个值分配对应的标签.其主要功能是将连续的数值数据转化为离散的分组数据,方便进行分析和统计. 1. 数据准备 下面的示例中使用的数据采 ...

  6. P2251 质量检测(分块线段树RMQ单调队列)

    P2251 质量检测 正解应该是ST表和单调队列,不过对于这道题来说只有查询没有修改,这里我还是想用线段树和分块来写,不得不说分块是真好,优雅的暴力 线段树版本: #include <bits/ ...

  7. XSS漏洞原理整理

    一.通常使用XSS脚本来获取浏览器版本信息,alert(navigator.userAgnet )  ,浏览器的UserAgent是可以伪造的,比方火狐或者很多扩展都可以屏蔽或者自定义浏览器发送的Us ...

  8. C++入门编程----C++运算符(8)

    什么是运算符 运算符是让程序执行特定的数学或逻辑操作的符号,用来表示针对数据的特定操作,也称之为操作符.C++运算符分别有算术运算符.关系运算符.逻辑运算符.赋值运算符.位运算符.移位运算符.size ...

  9. JS3-高级事件

    获取事件和处理事件的第二种方式:事件监听 如何获取和处理鼠标与键盘的基本事件? 事件监听方式 eventTarget.addEventListener(type,listener[,useCaptur ...

  10. aardio 嵌入 其他应用程序

    aardio 嵌入 其他应用程序 需求 这个chrome壳不能进行拖拽和缩放,所以再套一个壳,可以再分屏的时候用 import win.ui; /*DSG{{*/ winform = win.form ...