zoukankan      html  css  js  c++  java
  • Spring篇:什么是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基于IoC的基础,是OOP的有益补充。

    “一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了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体系结构

    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模块

    Spring支持Junit和TestNG测试框架,而且还额外提供一些基于Spring的测试功能,比如在测试Web框架时,模拟Http请求的功能。

     

    参考

    Spring详解(概述、组件详解、加载流程)

    Spring框架总结【无比详细】

    Spring框架入门教程

    Java中最强大的框架spring

    Spring框架详解

    【Spring】详解Spring全家桶

    struts和struts2的区别

    SSH和SSM区别

     

    碎碎念:有时候做一件事情并不一定花费太多时间,尤其在你坚决不碰手机的前提下

    当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
  • 相关阅读:
    HDU1029 Ignatius and the Princess IV
    UVA11039 Building designing【排序】
    UVA11039 Building designing【排序】
    POJ3278 HDU2717 Catch That Cow
    POJ3278 HDU2717 Catch That Cow
    POJ1338 Ugly Numbers(解法二)
    POJ1338 Ugly Numbers(解法二)
    UVA532 Dungeon Master
    UVA532 Dungeon Master
    POJ1915 Knight Moves
  • 原文地址:https://www.cnblogs.com/liwxmyself/p/15058210.html
Copyright © 2011-2022 走看看