Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一篇告诉你什么是Spring

一篇告诉你什么是Spring

原创
作者头像
JavaPub
修改于 2020-07-06 02:38:46
修改于 2020-07-06 02:38:46
1.2K0
举报
文章被收录于专栏:JavaPubJavaPub

阅读全文大概需要7分钟

前言

大多数文章讲"什么到Spring?"上来就是控制反转(IoC)或依赖注入(DI)和面向切面编程(AOP),拿着官网文档直译 copy。对小白来说并不友好,看完可能还是一头雾水。下面是我利用业余时间整理的一些资料、书籍和自己的理解,致力于更容易理解方式讲 Spring。

什么是Spring ?

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/EE full-stack(一站式) 轻量级开源框架。

简单来说,它是一个容器框架,用来装 javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把 Struts 和 hibernate 粘合在一起运用。简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

如果你现在还有点疑惑,通读全文,你一定有所收获

Spring 模块

以下内容都是基于 Spring 4 及以上的

Spring 官网图片

  • Spring Core:Spring核心模块,主要提供 ioC 依赖注入、
  • Spring Context:向Spring框架提供上下文信息、
  • Spring AOP:面向切面编程,为基于 Spring 的应用程序中的对象提供了事务管理服务、
  • Spring JDBC:Java数据库连接、
  • Spring JMS:Java消息服务、
  • Spring ORM:用于支持 MyBatis、Hibernate 等 ORM 工具、
  • Spring Web:为创建Web应用程序提供支持、
  • Spring Test:提供了对 JUnit 和 TestNG 测试的支持、
  • Spring Aspects:该模块为与AspectJ的集成提供支持。
  • Spring Web:Spring框架支持与Struts集成,为基于web的应用程序提供了上下文。

Spring的优点

  • 方便解耦,简化开发 (高内聚低耦合)

Spring就是一个大工厂(容器),可以将所有对象创建和依赖关系维护,交给Spring管理,spring工厂是用于生成bean

  • AOP编程的支持

Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

  • 声明式事务的支持

只需要通过配置就可以完成对事务的管理,而无需手动编程

  • 方便程序的测试

Spring对Junit4支持,可以通过注解方便的测试Spring程序

  • 方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持

  • 降低JavaEE API的使用难度

Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大降低

我对 Spring IoC 和 AOP 理解

Spring 中最重要的概念 IoC 和 AOP

IoC(Inversion of Control)控制反转

IoC 需要 DI(依赖注入)的支持为什么呢?因为没有 DI 的注入 Spring 创造出的对象都是空值是无法使用的,所以说 IoCDI 多数是同时出现人们眼前的。

IOCInversion of Control 的缩写,多数书籍翻译成“控制反转”。为了解决对象之间的耦合度过高的问题,软件专家 Michael Mattson 提出了 IOC 理论,用来实现对象之间的解耦

2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由 IOC 容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现 IOC 的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入 IOC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

背景介绍完了,讲讲我的理解

IoC 就是依赖倒置原则的一种设计思路,就是将原本在程序中自己手动创建对象的控制权,交由 Spring 框架来管理。Spring 框架负责控制对象的生命周期对象之间的关系。IoC 在其他语言中也有应用,并非 Spirng 特有。ioc 容器实际上就是个 map(key,value),里面存的是各种对象(在xml里配置的bean节点||repository、service、controller、component)。

Spring IOC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 IOC 容器负责创建对象,将对象连接在一起,配置这些对象,并从创建中处理这些对象的整个生命周期,直到它们被完全销毁。

在实际项目中一个 Service 类如果有几百甚至上千个类作为它的底层,我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IOC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

推荐阅读:

https://www.zhihu.com/question/23277575/answer/169698662

IoC容器的初始化过程可以分为三步:

  1. Resource 定位(Bean的定义文件定位)、
  2. 将 Resource 定位好的资源载入到 BeanDefinition、
  3. 将 BeanDefiniton 注册到容器中

IoC 源码:

https://javadoop.com/post/spring-ioc

AOP(Aspect-OrientedProgramming)面向切面编程

什么是 AOP?

AOP(Aspect Oriented Programming 面向切面编程),在程序开发中主要用来解决一些系统层面上的问题,比如日志收集,事务管理,权限,缓存,对象池管理等。

AOP 可以说是 OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP 引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过 OOP 允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性

Spring AOP

Spring AOP就是基于动态代理的,底层实现有俩种方式:一种是 JDK 动态代理(JDK Proxy),另一种是 CGLib(Code Generation Library(基于字节码操作)) 的方式。

如果要被代理的对象是个实现类,那么 Spring 会使用 JDK动态代理来完成操作(Spirng 默认采用JDK动态代理实现机制);如果要被代理的对象不是个实现类那么,Spring 会强制使用 CGLib 来实现动态代理。

推荐阅读:https://www.jianshu.com/p/5b9a0d77f95f

当然,也可以使用 AspectJ ,AspectJ 可以做Spring AOP干不了的事情,它是 AOP 编程的完全解决方案。

Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强;而 AspectJ 是编译时增强。Spring AOP 只能在运行时织入,AspectJ 运行时织入不可用,支持编译时、编译后和加载时织入。

AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单。

Spring 的 bean

bean 的作用域有哪些 ?

Spring bean 单例与线程安全问题

线程安全一直是代码编写的重地,我们大多时候在系统开发中不会使用多线程。单例 bean 存在线程安全问题,当多个线程操作同一个对象的时候,这个对象的非静态成员变量会存在线程安全问题。

解决方法:

  1. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式,这也是常用一种);

2.在Bean对象中尽量避免定义可变的成员变量。

Spring bean 的生命周期

在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了。一旦bean不再被使用,则由Java自动进行垃圾回收。

相比之下,Spring管理Bean的生命周期就复杂多了,正确理解Bean 的生命周期非常重要。一个Bean的构造过程:

谈谈对 Spring MVC 的理解

说到了 Spring ,那一定提一下 Spring MVC,各种讲 SSM 的技术博客大家应该都见了很多。

在我初学时 Java,那时讲的是 “Java Bean(Model) + JSP(View) + Servlet(Controller)” 这种开发模式,这是早期的 JavaWeb MVC。

Spring MVC 是一款很优秀的 MVC 框架。可以让我们的开发更简洁,而且它和 Spring 是无缝集成,是 Spring 的一个子模块,是我们上面提到 Spring 大家族中 Web 模块。

Spring MVC 框架主要由 DispatcherServlet 、处理器映射、处理器(控制器)、视图解析器、视图组成。

Spring MVC 流程图很重要:

Spring 事务声明

事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。

  1. 编程式事务,在代码中硬编码。(不推荐使用)
  2. 声明式事务,在配置文件中配置(推荐使用)

声明式事务又分为两种:

  1. 基于XML的声明式事务
  2. 基于注解的声明式事务

比较重要的一点是

@Transactional(rollbackFor = Exception.class)注解

@Transactional 注解中如果不配置 rollbackFor 属性,那么事物只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor=Exception.class ,可以让事物在遇到非运行时异常时也回滚。

后记

scope 是范围的意思,在绝地求生中 scope 意为瞄准镜,如果你的队友是个老外你就和他说 i want this 4times scope 他就明白了。

下篇结合代码一块讲解

声明:参考来源互联网,有任何争议可以留言。站在前人的肩上,我们才能看的更远。

本教程纯手打,致力于最实用教程,希望多多转发支持,对我真的很重要。 欢迎来我公众号,希望可以结识你,更多原创PDF,微信搜索:JavaPub,回复:【666】,也可以催更。

有任何问题都可以来谈谈 !

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇带你进入Spring的世界
我们上学期开了一门网络编程课,讲了servlet+jsp,不过那个老师就喜欢扯东扯西的讲一大堆无关紧要的东西,好家伙重点全跳过,我就索性就没听过了。所以jsp学的不好的同学无所谓,不过建议Servlet学习透彻些,毕竟现在的Java WEB都还是围绕着Servlet的,这些框架也都是封装的Servlet。
东边的大西瓜
2022/05/05
2780
一篇带你进入Spring的世界
Spring基础小结
Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。
WindCoder
2018/09/19
5960
Spring基础小结
Spring框架源码分析之Spring核心思想讲解
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
杨不易呀
2023/09/20
4820
Spring框架源码分析之Spring核心思想讲解
Spring 学习笔记(1) Spring 核心功能和概念
首先来介绍一下 Spring , 打开 Spring 官网我们可以看到 Spring 有众多框架,比如 SpringMVC、 SpringBoot、 Spring Cloud 等等,它是这些框架的集合,而 Spring Framework 是 Spring 里面的一个开源框架,并且 Spring 框架是其它框架的核心和基础。
归思君
2023/10/16
3920
Spring 学习笔记(1) Spring 核心功能和概念
Spring系列一:Spring基础篇
一句话概括:Spring 是一个轻量级、非入侵式的控制反转 (IoC) 和面向切面 (AOP) 的框架。
叶秋学长
2022/07/20
9390
Spring系列一:Spring基础篇
Spring框架-面试题核心概念
Spring是一个开源框架,主要为了简化企业级应用的开发。它是一个IOC和AOP的容器框架。核心功能如下:
用户10175992
2023/10/17
2010
Spring框架-面试题核心概念
Spring面试题(2020最新版)
Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…
Java架构师必看
2020/04/10
1.7K0
Spring 学习笔记(一)——Spring 基本概念和体系概览
简而言之,Spring 是一个轻量级的IoC(控制反转)和AOP(面向切面)的容器框架。
Rekent
2018/09/04
4590
Spring 学习笔记(一)——Spring 基本概念和体系概览
Spring全家桶之Spring核心篇,深度分析IoC以及AOP
👨‍🎓作者:Java学术趴 🏦仓库:Github、Gitee ✏️博客:CSDN、掘金、InfoQ、云+社区 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。 👋大家好!我是你们的老朋友Java学术趴。最近小编又在整了Spring全家桶笔记,笔记会每天定时的进行发放。小编会每天分享的呦。Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以
Java学术趴
2022/05/06
6020
Spring全家桶之Spring核心篇,深度分析IoC以及AOP
Java面试题 - 02前言:一、JavaWeb高级:二、数据库:三、框架篇:
前言: 接着《Java面试题 - 01》,继续聊聊剩下的内容。 一、JavaWeb高级: 1. 什么叫监听器(listener)? 答:监听器主要是用来监听特定对象的创建或销毁、属性的变化的,是一个
贪挽懒月
2018/12/13
7460
Java面试题 - 02前言:一、JavaWeb高级:二、数据库:三、框架篇:
Java Web框架篇之Spring「建议收藏」
可以看出,这种方式有两个问题: (1)业务代码与单例/工厂模式的模板代码放在一个类里,耦合性较高; (2)大量重复的单例/工厂模式的模板代码,需要自己管理对象间复杂的依赖关系
全栈程序员站长
2022/09/08
4440
Spring MVC系列-(1) Spring概述
本章主要介绍Spring中的体系结构和常见概念,比如bean、控制反转(Inverse of Control,IoC)等。
码老思
2023/10/19
2150
Spring MVC系列-(1) Spring概述
Spring概述「建议收藏」
Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系。
全栈程序员站长
2022/08/04
5280
Spring概述「建议收藏」
Spring面试题总结的很全面,附带超详细答案
Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。Spring框架的目标是使得Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格。
李红
2019/08/27
9.8K0
【Spring】 ——初识Spring
Spring是一个开源的Java应用框架,它提供了一套全面的解决方案,用于开发企业级Java应用程序。Spring框架旨在简化Java开发,并提供了一种灵活且非侵入式的编程模型,帮助开发人员构建可扩展、模块化和可维护的应用程序。
终有救赎
2023/10/16
4130
【Spring】 ——初识Spring
总结了下关于Spring框架的重要问题
所有的核心模块,从基础的Spring功能(如Spring Beans)到上层的Spring MVC框架,文章中都会进行简短的讲解。 1.什么是Spring? Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。Spring框架的目标是使得Java EE应用程序的开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格。 2.Spring有哪些优点? • 轻量级:Spring在大小和透明性方
MonroeCode
2018/02/09
1.3K0
Spring框架专题
我们一般说的Spring框架指的都是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访问/集成,Web、AOP(面向切面编程)、工具、消息和测试模块。
Steve Wang
2022/05/10
6210
Spring框架专题
2021年Spring面试题70道「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
5990
Spring常见面试题整理
1.什么是Spring? Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性。 Spring框架的目标是使得Java EE应用程序的开发更加简捷,通过使用POJO(简单java对象,也就是javabean)为基础的编程模型促进良好的编程风格。 2.Spring有哪些优点? 轻量级,Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。 控制反转(IOC),Spr
张俊怡
2018/04/24
2.3K0
深入了解 Spring Boot 核心特性、注解和 Bean 作用域
Spring Boot 是基于 Spring Framework 构建应用程序的框架,Spring Framework 是一个广泛使用的用于构建基于 Java 的企业应用程序的开源框架。Spring Boot 旨在使创建独立的、生产级别的 Spring 应用程序变得容易,您可以"只是运行"这些应用程序。
小万哥
2023/07/30
4040
深入了解 Spring Boot 核心特性、注解和 Bean 作用域
相关推荐
一篇带你进入Spring的世界
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档