什么是spring框架?spring特点与好处,使用spring框架的好处是什么.

article/2025/9/13 0:37:03
 

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

特点:

1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明事物的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
7.Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
好处:
在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处:
Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
使用Spring构建的应用程序易于单元测试。
Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
1.低侵入式设计,代码污染极低
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
简单理解

一.概念:
1. spring是开源的轻量级框架

2 spring核心主要两部分:

(1)aop:面向切面编程,扩展功能不修改源代码实现,详解【http://www.cnblogs.com/landeanfen/p/4782370.html】

(2)ioc:控制反转

    比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象, 把对象的创建不是通过new方式实现,而是交给spring配置创建类对象。

    我用通俗的话给你解释把。首先你不用框架不是每次创建对象都要用关键字“new”呢?对吧。有了spring配置就不用new了,直接拿。举个例子:假如你吃饭,每次你要吃饭时都要自己准备碗和筷子,每次都要自己准备,用了框架后,再 吃饭你只要吃就行了,就不用准备碗和筷子了因为spring已经给你准备好了。这样是不是很方便。spring主要就是不用你自己创建对象,都配置在配置文件中。如果你写好一个项目,你再a类中创建了b类的方法,c类也创建了b类的方法,如果那天要改b类的类名,你就要在a和c中都改,如果有100个类都用了b类呢?那你不是要改死哦!! 如果用了spring,你只要修改配置文件一个位置就好了,是不是很方便维护呢。所以,小项目用不着spring框架。手打好累。。。
ioc:控制反转
 

    ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

也就是说,甲方要达成某种目的不需要直接依赖乙方,它只需要达到的目的告诉第三方机构就可以了,比如甲方需要一双袜子,而乙方它卖一双袜子,它要把袜子卖出去,并不需要自己去直接找到一个卖家来完成袜子的卖出。它也只需要找第三方,告诉别人我要卖一双袜子。这下好了,甲乙双方进行交易活动,都不需要自己直接去找卖家,相当于程序内部开放接口,卖家由第三方作为参数传入。甲乙互相不依赖,而且只有在进行交易活动的时候,甲才和乙产生联系。反之亦然。这样做什么好处么呢,甲乙可以在对方不真实存在的情况下独立存在,而且保证不交易时候无联系,想交易的时候可以很容易的产生联系。甲乙交易活动不需要双方见面,避免了双方的互不信任造成交易失败的问题。因为交易由第三方来负责联系,而且甲乙都认为第三方可靠。那么交易就能很可靠很灵活的产生和进行了。

这就是ioc的核心思想。生活中这种例子比比皆是,支付宝在整个淘宝体系里就是庞大的ioc容器,交易双方之外的第三方,提供可靠性可依赖可灵活变更交易方的资源管理中心。另外人事代理也是,雇佣机构和个人之外的第三方。

 

控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle )

什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。

<img src="https://pic4.zhimg.com/50/v2-c68248bb5d9b4d64d22600571e996446_hd.jpg" data-caption="" data-rawwidth="1562" data-rawheight="186" class="origin_image zh-lightbox-thumb" width="1562" data-original="https://pic4.zhimg.com/v2-c68248bb5d9b4d64d22600571e996446_r.jpg">

这样的设计看起来没问题,但是可维护性却很低。假设设计完工之后,上司却突然说根据市场需求的变动,要我们把车子的轮子设计都改大一码。这下我们就蛋疼了:因为我们是根据轮子的尺寸设计的底盘,轮子的尺寸一改,底盘的设计就得修改;同样因为我们是根据底盘设计的车身,那么车身也得改,同理汽车设计也得改——整个设计几乎都得改!

我们现在换一种思路。我们先设计汽车的大概样子,然后根据汽车的样子来设计车身,根据车身来设计底盘,最后根据底盘来设计轮子。这时候,依赖关系就倒置过来了:轮子依赖底盘, 底盘依赖车身, 车身依赖汽车。

<img src="https://pic1.zhimg.com/50/v2-e64bf72c5c04412f626b21753aa9e1a1_hd.jpg" data-caption="" data-rawwidth="1504" data-rawheight="190" class="origin_image zh-lightbox-thumb" width="1504" data-original="https://pic1.zhimg.com/v2-e64bf72c5c04412f626b21753aa9e1a1_r.jpg">

这时候,上司再说要改动轮子的设计,我们就只需要改动轮子的设计,而不需要动底盘,车身,汽车的设计了。

这就是依赖倒置原则——把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。高层建筑决定需要什么,底层去实现这样的需求,但是高层并不用管底层是怎么实现的。这样就不会出现前面的“牵一发动全身”的情况。

控制反转(Inversion of Control) 就是依赖倒置原则的一种代码设计的思路。具体采用的方法就是所谓的依赖注入(Dependency Injection)。其实这些概念初次接触都会感到云里雾里的。说穿了,这几种概念的关系大概如下:

<img src="https://pic1.zhimg.com/50/v2-ee924f8693cff51785ad6637ac5b21c1_hd.jpg" data-caption="" data-rawwidth="1398" data-rawheight="630" class="origin_image zh-lightbox-thumb" width="1398" data-original="https://pic1.zhimg.com/v2-ee924f8693cff51785ad6637ac5b21c1_r.jpg">

为了理解这几个概念,我们还是用上面汽车的例子。只不过这次换成代码。我们先定义四个Class,车,车身,底盘,轮胎。然后初始化这辆车,最后跑这辆车。代码结构如下:

<img src="https://pic3.zhimg.com/50/v2-8ec294de7d0f9013788e3fb5c76069ef_hd.jpg" data-caption="" data-rawwidth="512" data-rawheight="717" class="origin_image zh-lightbox-thumb" width="512" data-original="https://pic3.zhimg.com/v2-8ec294de7d0f9013788e3fb5c76069ef_r.jpg">

这样,就相当于上面第一个例子,上层建筑依赖下层建筑——每一个类的构造函数都直接调用了底层代码的构造函数。假设我们需要改动一下轮胎(Tire)类,把它的尺寸变成动态的,而不是一直都是30。我们需要这样改:

<img src="https://pic4.zhimg.com/50/v2-64e8b19eeb70d9cf87c27fe4c5c0fc81_hd.jpg" data-caption="" data-rawwidth="534" data-rawheight="154" class="origin_image zh-lightbox-thumb" width="534" data-original="https://pic4.zhimg.com/v2-64e8b19eeb70d9cf87c27fe4c5c0fc81_r.jpg">

由于我们修改了轮胎的定义,为了让整个程序正常运行,我们需要做以下改动:

<img src="https://pic1.zhimg.com/50/v2-82e0c12a1b26f7979ed9241e169affda_hd.jpg" data-caption="" data-rawwidth="1186" data-rawheight="1452" class="origin_image zh-lightbox-thumb" width="1186" data-original="https://pic1.zhimg.com/v2-82e0c12a1b26f7979ed9241e169affda_r.jpg">

由此我们可以看到,仅仅是为了修改轮胎的构造函数,这种设计却需要修改整个上层所有类的构造函数!在软件工程中,这样的设计几乎是不可维护的——在实际工程项目中,有的类可能会是几千个类的底层,如果每次修改这个类,我们都要修改所有以它作为依赖的类,那软件的维护成本就太高了。

所以我们需要进行控制反转(IoC),及上层控制下层,而不是下层控制着上层。我们用依赖注入(Dependency Injection)这种方式来实现控制反转。所谓依赖注入,就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。这里我们用构造方法传递的依赖注入方式重新写车类的定义:

<img src="https://pic1.zhimg.com/50/v2-c920a0540ce0651003a5326f6ef9891d_hd.jpg" data-caption="" data-rawwidth="1338" data-rawheight="1424" class="origin_image zh-lightbox-thumb" width="1338" data-original="https://pic1.zhimg.com/v2-c920a0540ce0651003a5326f6ef9891d_r.jpg">

这里我们再把轮胎尺寸变成动态的,同样为了让整个系统顺利运行,我们需要做如下修改:

<img src="https://pic4.zhimg.com/50/v2-99ad2cd809fcb86dd791ff7f65fb1779_hd.jpg" data-caption="" data-rawwidth="1344" data-rawheight="1424" class="origin_image zh-lightbox-thumb" width="1344" data-original="https://pic4.zhimg.com/v2-99ad2cd809fcb86dd791ff7f65fb1779_r.jpg">

看到没?这里我只需要修改轮胎类就行了,不用修改其他任何上层类。这显然是更容易维护的代码。不仅如此,在实际的工程中,这种设计模式还有利于不同组的协同合作和单元测试:比如开发这四个类的分别是四个不同的组,那么只要定义好了接口,四个不同的组可以同时进行开发而不相互受限制;而对于单元测试,如果我们要写Car类的单元测试,就只需要Mock一下Framework类传入Car就行了,而不用把Framework, Bottom, Tire全部new一遍再来构造Car。

这里我们是采用的构造函数传入的方式进行的依赖注入。其实还有另外两种方法:Setter传递接口传递。这里就不多讲了,核心思路都是一样的,都是为了实现控制反转

<img src="https://pic1.zhimg.com/50/v2-861683acac47577c81f2b7493dd05649_hd.jpg" data-caption="" data-rawwidth="924" data-rawheight="298" class="origin_image zh-lightbox-thumb" width="924" data-original="https://pic1.zhimg.com/v2-861683acac47577c81f2b7493dd05649_r.jpg">

看到这里你应该能理解什么控制反转和依赖注入了。那什么是控制反转容器(IoC Container)呢?其实上面的例子中,对车类进行初始化的那段代码发生的地方,就是控制反转容器。

<img src="https://pic4.zhimg.com/50/v2-c845802f9187953ed576e0555f76da42_hd.jpg" data-caption="" data-rawwidth="1422" data-rawheight="628" class="origin_image zh-lightbox-thumb" width="1422" data-original="https://pic4.zhimg.com/v2-c845802f9187953ed576e0555f76da42_r.jpg">

显然你也应该观察到了,因为采用了依赖注入,在初始化的过程中就不可避免的会写大量的new。这里IoC容器就解决了这个问题。这个容器可以自动对你的代码进行初始化,你只需要维护一个Configuration(可以是xml可以是一段代码),而不用每次初始化一辆车都要亲手去写那一大段初始化的代码。这是引入IoC Container的第一个好处。

IoC Container的第二个好处是:我们在创建实例的时候不需要了解其中的细节。在上面的例子中,我们自己手动创建一个车instance时候,是从底层往上层new的:

<img src="https://pic2.zhimg.com/50/v2-555b2be7d76e78511a6d6fed3304927f_hd.jpg" data-caption="" data-rawwidth="2430" data-rawheight="168" class="origin_image zh-lightbox-thumb" width="2430" data-original="https://pic2.zhimg.com/v2-555b2be7d76e78511a6d6fed3304927f_r.jpg">

这个过程中,我们需要了解整个Car/Framework/Bottom/Tire类构造函数是怎么定义的,才能一步一步new/注入。

而IoC Container在进行这个工作的时候是反过来的,它先从最上层开始往下找依赖关系,到达最底层之后再往上一步一步new(有点像深度优先遍历):

<img src="https://pic3.zhimg.com/50/v2-24a96669241e81439c636e83976ba152_hd.jpg" data-caption="" data-rawwidth="2522" data-rawheight="354" class="origin_image zh-lightbox-thumb" width="2522" data-original="https://pic3.zhimg.com/v2-24a96669241e81439c636e83976ba152_r.jpg">

这里IoC Container可以直接隐藏具体的创建实例的细节,在我们来看它就像一个工厂:

<img src="https://pic2.zhimg.com/50/v2-5ca61395f37cef73c7bbe7808f9ea219_hd.jpg" data-caption="" data-rawwidth="2448" data-rawheight="524" class="origin_image zh-lightbox-thumb" width="2448" data-original="https://pic2.zhimg.com/v2-5ca61395f37cef73c7bbe7808f9ea219_r.jpg">

我们就像是工厂的客户。我们只需要向工厂请求一个Car实例,然后它就给我们按照Config创建了一个Car实例。我们完全不用管这个Car实例是怎么一步一步被创建出来。

实际项目中,有的Service Class可能是十年前写的,有几百个类作为它的底层。假设我们新写的一个API需要实例化这个Service,我们总不可能回头去搞清楚这几百个类的构造函数吧?IoC Container的这个特性就很完美的解决了这类问题——因为这个架构要求你在写class的时候需要写相应的Config文件,所以你要初始化很久以前的Service类的时候,前人都已经写好了Config文件,你直接在需要用的地方注入这个Service就可以了。这大大增加了项目的可维护性且降低了开发难度。


http://chatgpt.dhexx.cn/article/U4lKkG78.shtml

相关文章

什么是spring框架?spring框架到底有什么用?spring框架到底做了些什么?

什么是spring框架,spring框架究竟有什么用呢?我们可以用spring框架来做些什么呢?这是我今天要说的内容。 当然,百度spring框架会出现一大堆spring框架的介绍,以及IOC和AOP。但是这些官方的语言,看书都有解…

【Spring框架一】——Spring框架简介

系列文章目录 Spring框架简介 系列文章目录前言一、什么是Spring框架?二、Spring框架的优势1.简化开发流程:Spring提供了许多现成的功能,可以使得开发人员在构建应用程序时减少编写重复代码的工作。2.提高可维护性:Spring框架采用…

Spring 框架

Spring 1、概述: Spring是最受欢迎的轻量级的企业级Java应用程序开发框架;Spring框架的 核心特性可以用于开发任何Java应用程序,但是在JavaEE平台上构建Web应 用程序是需要扩展的。Spring框架的目标是使J2EE开发变得更容易使用,通…

Spring框架梳理总结(适合多刷)

目录 前言大纲总结1. 概念详解1.1 IOC与AOP1.2 IOC与DI1.3 接口区别 2. 注入方式2.1 基本类型2.2 复杂类型 3. 配置属性4. 注解注入5. AOP 前言 在看完上一篇文章每个知识点的时候 Spring框架从入门到学精(全) 大部分人对spring还是有些懵懂 可能是知识…

学习Spring框架这一篇就够了

1. spring概述 1.1 Spring是什么(理解) Spring是分层的 Java SE/EE应用 full-stack(全栈的) 轻量级开源框架,以 IOC(Inverse Of Control:控制反转)和 AOP(Aspect Orient…

【QT学习】实现MVC框架的简易封装(一文读懂)

文章目录 前言一、MVC框架简介1.核心部件2.使用目的3.MVC优点 二、具体封装步骤1.文件管理2.创建模型3.创建控制器4.MVC实现(用户登录验证为例) 总结 前言 MVC(Model-View-Controller)框架作为一种软件设计模式,已经被…

MVC框架以及实例

MVC框架 MVC(model,view,controller),一种将业务逻辑、数据、界面分离的方法组织代码的框架。在改进界面及用户交互的同时,不需要重写业务逻辑。MVC将传统的输入、处理和输出分离。 Model:模型,逻辑部分,也是表示应用程序的核心,比…

MVC框架流程图

MVC框架流程图 MVC的概念其实就那么简单,这些概念其实早已深入我们的内心,而我们所缺乏的是将其本质挖掘出来。我们来看看下面这幅图,这是一副流行了很多年的讲述MVC模型的图: 在这幅图中,MVC三个框框各司其职&#x…

了解MVC模式与MVC框架

MVC MVC的概念模型(Model)控制器(Controller)视图(View) MVC工作流程Java MVC框架Struts1框架Struts2框架Spring MVC框架JSF框架Tapestry框架 MVC的概念 MVC全名是Model View Controller,M是指数据模型,V是指用户界面,C是控制器。使用MVC最直…

Qt5 MVC框架

1、MVC 设计模式 起源于smalltalk的一种与用户界面设计相关的设计模式。 作用:实现数据与用户界面分离; 组成:模型model(表示数据)、视图view(表示用户界面)及控制controller(定义了用户在界面上的操作&am…

MVC框架概述

2014.11.8我们完成为时两月的中级软考准备,没有多余的时间去放松、娱乐,紧接着迎来了我进入提高班以来真正的一次项目实践--高效平台。 我做的是基础系统,就是一个算是幕后英雄的角色吧!考试系统、评教系统需要我们的数据、同时新生入学系统由我们来维护,所以说任务艰巨而…

C# .Net MVC框架实现最简单的登陆

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言C#.net实现最简单登陆 一、C#,.net是什么,相比较于C,java二、C# .net创建一个MVC框架工程1.步骤 实现结果 前言 C#.net实现最简单登陆 提示&#…

ASP.NET - MVC框架及搭建教程

一、MVC简介 MVC:Model-View-Controller(模型-视图-控制器),MVC是一种软件开发架构模式。 1、模型(Model) 模型对象是实现应用程序数据域逻辑的应用程序部件。 通常,模型对象会检索模型状态并…

PHP实现简易的MVC框架

目录 一、前言二、哪些框架使用到了mvc架构?三、框架结构简介四、框架实现第一步(解析路由)4.1 写入口文件4.2 定义Core核心类 五、框架实现第二步(MVC的实现)5.1 控制器的实现5.2 视图的实现5.3 模型的实现 六、总结 …

Unity MVC框架之见解

Unity MVC框架之见解 MVC框架认识构架图案例无框架,普通逻辑代码脚本主UI脚本角色UI脚本摄像机显示脚本脚本的放置 MVC框架的运用Model脚本View脚本主界面的View脚本角色View脚本 Controller脚本主界面的Controller脚本角色Controller脚本 控制主界面的显示脚本脚本…

asp.net mvc框架

#mvc基础 (model view controller) 是模型—视图—控制器的缩写,一种用于开发web应用程序的软件架构模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化…

MVC框架简介

MVC的全拼为Model-View-Controller,最早由TrygveReenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式,是为了将传统的输入(input)、处理(processing)、输出(output)任务运用到…

PHP笔记-自定义MVC框架

膜拜 膜拜下黑马大佬程序员的项目,学习到了这样的手写MVC框架的方式,受益匪浅,感觉自己在C/C和Java方面,还有许多要学习的地方,看看能不能抄下这个php自己撸一个C/C的MVC框架。 下面记录下PHP自定义MVC框架。 项目结…

搭建一个简单的MVC框架

背景 为何要用MVC框架?首先我们知道不用框架的话,在javaweb项目中每个请求都要写一个servlet,并且要在web.xml中对每个servlet类的映射作配置,不方便开发,因此引入MVC框架。 工作原理 简单的说MVC框架就是为了简化开…

Android MVC框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、MVC是什么?二、写个简单的例子1.bean2.callback3.interfaces4.model5.ui 优缺点总结 前言 提示:很多教程讲解框架感觉都像说天书一…