Spring篇:什么是Spring
1、 什么是Spring
Spring是目前主流的Java Web开发框架,是分层的Java SE/EE一站式轻量级开源框架,以IoC(Inverse of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为内核。
1.1 Spring全家桶
Spring自诞生以来一直备受青睐,它包括许多框架,例如Spring framework、SpringMVC、SpringBoot、Spring Clound、Spring Data、Spring Security等,所以有人将它们亲切地称之为:Spring全家桶。
-
Spring framework:也就是我们经常说的spring框架,包括了IoC依赖注入,Context上下文,Bean管理,SpringMVC等众多功能模块,其他的Spring框架比如spring boot也会依赖于Spring framework。
-
Spring boot:它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring clound联合部署。Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。
-
Spring Data:是一个数据访问及操作的工具集,封装了多种数据源的操作能力,包括:jdbc、Redis、
-
Spring Cloud:是一整套完整的微服务解决方案,是一系列不同功能的微服务框架的集合,Spring Cloud基于Spring Boot,简化了分布式系统的开发,继承了服务发现、配置管理、消息总线、负载均衡、断路器、数据监控等各种服务治理能力。比如sleuth提供了全链路追踪能力,Netfix套件提供了hystrix熔断器、zuul网关等众多的治理组件。config组件提供了动态配置能力,bus组件支持使用RabbitMQ、kafka、Activemq等消息队列,实现分布式服务之间的时间通信。
-
Spring Security:主要用于快速构建安全的应用程序和服务,在Srping Boot和Spring Security OAuth2的基础上,可以快速实现常见安全模型,如单点登录,令牌中继和令牌交换。oauth2授权机制和jwt认证方式的关系:oauth2是一种授权机制,规定了完备的授权、认证流程;JWT全称是JSON Web Token,是一种把认证信息包含在token中的认证实现,oauth2授权机制中就可以应用jwt来作为认证的具体实现方法。
1.2 MVC框架
在MVC模式中,M是指业务模型,V是指用户界面,C则是控制器。MVC框架指MVC模式的某种框架,它强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分为三个核心部件:模型、视图、控制器。其中模型负责内部数据模型,控制器负责请求的分发控制,视图负责返回给用户展示的视图。
常见的MVC框架包含:
-
JSP + javabean + servlet
-
SSH:Structs2、Spring、Hibernate
-
SSM:SpringMVC、Spring、Mynatis
其中SSH组合已经逐渐被SSM组合替代,一方面原因是structs对几次安全漏洞的处理,让大家对structs的信息受到影响;另一方面,Spring MVC更加地灵活,不需要额外配置,不存在和Spring整合等问题,使用更加方便。
1.3 一些基本概念
1.3.1 Ioc(Inversion of control) 控制反转
控制权由对象本身转向容器,容器根据配置文件创建实例并创建各个实例之间的依赖关系。
即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用spring之后,可以由spring完成对象的创建和关系的注入。反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建。
1.3.2 AOP(Aspect Oriented Programming)
也就是
“一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。”
“这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。”
“AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。”
“面向方面编程就是一种让人在需要的时候随意地加入代码的方式,是一种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想。”
1.3.3 DI Dependency Injection 依赖注入
Spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给Spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器直接索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件。
1.3.4 关于耦合性的思考
关于面向对象编程的三大特征:封装、继承、多态。继承的好处是抽取了重复代码,加强了类之间的联系,但坏处也是加大了耦合性。面向对象编程追求高内聚,低耦合,那么耦合性高有什么不好?我举个例子。
当你有个实例--轮子,这个轮子是个独立模块,你调用它就可以跑,里面要改什么都很方便。 当你有个继承自生物类->哺乳类->狗->哈士奇的实例,或许父类中定义好了方法(譬如跑、吃饭……)可以很方便地继承,但是哪天你想给哈士奇这个类增加(睡觉)的方法,你就要往上考虑怎么改,改狗类?狗类下其他子类怎么改?改哺乳类?哺乳类的子类怎么改?哺乳类的子类的子类怎么改?改了会有什么问题?……这就是高耦合性。
有时候你会觉得继承给你提供了方便,但是耦合性太高也会引发各种问题。一个低耦合的独立模块你想改什么拆下来改改,只要原有的方法依旧能跑通,装回去就能继续用。高耦合性的模块之间的更改则要慎重得多。
1.4 Spring框架的特点
-
方便解耦,简化开发:Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给Spring管理。
-
方便集成各种优秀框架:其内部提供了对各种优秀框架(如Structs2、Hibernate、MyBatis等)的直接支持。
-
降低Java EE API的使用难度:Spring对Java EE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装、使这些API应用的难度大大降低。)
-
方便程序的测试:Spring支持Junit4,可以通过注解方便地测试Spring程序。
-
AOP编程的支持:Spring提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
-
声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程。
2 Spring体系结构
参考
Spring框架采用分层的理念,根据功能的不同划分成多个模块,这些模块大体可分为Data Access/Integration(数据访问与继承)、Web、AOP、Aspects、Instrumentation(检测)、Messaging(消息处理)、Core Container(核心容器)和Test。如下图所示(以下是Spring Framework 4.x版本后的系统架构图)。
上图包含了Spring框架的所有模块,这些模块可以满足一切企业级应用开发的需求,在开发过程中可以根据需求有选择地使用所需要的模块。下面分别对这些模块的作用进行简单介绍。
2.1 Data Access/Integration(数据访问/集成)
数据访问/集成层包括JDBC、ORM、OXM、JMS和Transactions模块。具体介绍如下。
-
JDBC模块:提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。
-
ORM模块:提供与流行的“对象-关系”映射框架无缝集成的API,包括JPA、JDO、Hibernate和MyBatis等。而且还可以使用Spring事务管理,无需额外控制事务。
-
OXM模块:提供了一个支持Object/XML映射的抽象层实现,如JAXB、Castor、XMLBeans、JiBX和XStream。将Java对象映射成XML数据,或者将XML数据映射成Java对象。
-
JMS模块:指Java消息服务,提供一套“消息生产者、消息消费者”末班用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
-
Transactions事务模块:支持编程和声明式事务管理。
2.2 Web模块
Spring的Web层包括Web、Servlet、WebSocket和Portlet组件,具体介绍如下。
-
Web模块:提供了基本的Web开发集成特性,例如多文件上传功能、使用的Servlet监听器的IOC容器初始化以及Web应用上下文。
-
Servlet模块:提供了一个Spring MVC Web框架实现。Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。
-
WebSocket模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建WebSocket Server,从而实现双向通讯。
-
Portlet模块:提供了在Portlet环境中使用MVC实现,类似Web-Servlet模块的功能。
2.3 Core Container(Spring的核心容器)
Spring的核心容器是其他模块建立的基础,由Beans模块、Core核心模块、Context上下文模块和SpEL表达式语言模块组成,没有这些核心容器,也不可能有AOP、Web等上层的功能。
-
Beans模块:提供了框架的基础部分,包括控制反转和依赖注入
-
Core核心模块:封装了Spring框架的底层部分,包括资源访问、类型转换以及一些常用的工具类。
-
Context上下文模块:建立在Core和Beana模块的基础之上,继承Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生成周期、事件传播等。ApplicationContext接口是上下文模块的焦点。
-
SpEL模块:提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
2.4 AOP、Aspects、Instrumentation和Messaging
在Core Container之上是AOP、Aspects等模块,具体介绍如下:
-
AOP模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态地把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
-
Aspects模块:提供与AspectJ的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
-
Instrumentation模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
-
messaging模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。
2.5 Test模块
参考