什么是 Spring 框架?

Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。

我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。

Spring 官网列出的 Spring 的 6 个特征:

  • 核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。

  • 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。

  • 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。

  • Web支持 : Spring MVC和Spring WebFlux Web框架。

  • 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。

  • 语言 :Kotlin,Groovy,动态语言。

列举一些重要的Spring模块

下图对应的是 Spring4.x 版本。目前最新的5.x版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。

  • Spring Core: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。

  • Spring Aspects : 该模块为与AspectJ的集成提供支持。

  • Spring AOP :提供了面向切面的编程实现。

  • Spring JDBC : Java数据库连接。

  • Spring JMS :Java消息服务。

  • Spring ORM : 用于支持Hibernate等ORM工具。

  • Spring Web : 为创建Web应用程序提供支持。

  • Spring Test : 提供了对 JUnit 和 TestNG 测试的支持。

使用 Spring 框架的好处是什么?

 **轻量:**Spring 是轻量的,基本的版本大约 2MB。

 **控制反转:**Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建

或查找依赖的对象们。

 **面向切面的编程(AOP):**Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务

分开。

 **容器:**Spring 包含并管理应用中对象的生命周期和配置。

MVC 框架:Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的一个很好的替代品。

 **事务管理:**Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事

务(JTA)。

 **异常处理:**Spring 提供方便的 API 把具体技术相关的异常(比如由 JDBC,HibernateorJDO

抛出的)转化为一致的 unchecked 异常.

开发中主要使用 Spring 的什么技术 ?

①. IOC 容器管理各层的组件
②. 使用 AOP 配置声明式事务
③. 整合其他框架

@RestController vs @Controller

Controller 返回一个页面

单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。

@RestController 返回JSON 或 XML 形式数据

@RestController只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHbg6VWb-1596269487952)(https://maye-1300649446.cos.ap-chengdu.myqcloud.com/%E5%85%B3%E4%BA%8ESpring%E9%82%A3%E4%BA%9B%E4%BA%8B%28%E4%B8%80%29/SpringMVCRestController.png)]

@Controller +@ResponseBody 返回JSON 或 XML 形式数据

如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用@Controller 并结合@ResponseBody注解,也就是说@Controller +@ResponseBody= @RestController(Spring 4 之后新加的注解)。

@ResponseBody 注解的作用是将 Controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。

Spring IOC & AOP

谈谈自己对于 Spring IoC 和 AOP 的理解

IoC

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spring 特有。 IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 在实际项目中一个 Service 类可能有几百甚至上千个类作为它的底层,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。

Spring IoC的初始化过程:

AOP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码降低模块间的耦合度,并有利于未来的可拓展性和可维护性

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:

当然你也可以使用 AspectJ ,Spring AOP 已经集成了AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。

使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。

Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。

Spring bean

Spring 中的 bean 的作用域有哪些?

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
  • session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
  • global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话

Spring 中的单例 bean 的线程安全问题了解吗?

大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

关于Spring那些事(一)相关推荐

  1. Spring 一二事(8) - annotation 形式的 MVC

    1 <!-- 2 component:把一个类放入到spring容器中,该类就是一个component 3 在base-package指定的包及子包下扫描所有的类 4 --> 5 < ...

  2. Spring 一二事(4) - 单例

    spring bean配置后再默认情况下是单例的,如果需要配置可以选择 prototype, request, session和global session 在配置spring mvc的action时 ...

  3. 【关于Spring那些事】——与君初相识

    第一个Spring程序 Spring是一个轻量级开源框架,由一个叫Rod Johnson的程序员在 2002 年提出并创建. 1.创建maven工程 2.添加Spring依赖 在maven项目的pom ...

  4. Spring Boot登录选项快速指南

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 在本文中 ...

  5. Spring事务配置实例

    事务 一个使用 MyBatis-spring 的主要原因是它允许MyBatis 参与到 Spring 的事务管理中.而 不是给 MyBatis 创建一个新的特定的事务管理器,MyBatis-Sprin ...

  6. 全网最全Spring面试题之基础篇整理总结(共69题,附超详细解答)

    [Java架构师面试网]收集整理了一些spring面试的问题,这些问题可能会在你下一次技术面试中遇到.但是想成为Java架构师,这些都是不可避免也是必须要掌握的,对于其他spring模块,我后续也将单 ...

  7. 程序员面试备战篇:69个经典Spring面试专题解析(干货分享答案)

    我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的知识和面试经验,为将来进入更好的公司做好充分的准备! 在本场 Chat 中,会讲到如下内容: 什么是 Spring 的 ...

  8. 史上最全的69个经典Spring面试专题解析(干货分享答案)

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. 微信公众号:慕容千语的架构笔记.欢迎关注一起进步. ​ Spring 概 述 1. 什 么 ...

  9. spring_Spring Boot登录选项快速指南

    spring "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验 ...

最新文章

  1. OpenWrite的渠道顺序你说了算!来支持你最喜欢的技术类平台吧!
  2. JavaWeb(三)——Maven的安装、配置及在IDEA中的使用
  3. 修改之前的myshell使之支持输入输出重定向
  4. git commit命令
  5. c++ 协程_Python3 协程(coroutine)介绍
  6. 使用shell测试cdn状态
  7. git tag — 标签相关操作
  8. OpenCV-图像处理(19、Canny边缘检测)
  9. 如何学习摸具设计?怎样学习摸具设计?学习摸具设计的方法。
  10. 楚门的世界/The Truman Show (1998)
  11. android小程序_测试大佬是如何进行百度/微信小程序自动化测试的?
  12. 【CS229笔记】协方差矩阵概念快速回顾
  13. 面试题:如何测试微信朋友圈
  14. 5. C++ 抽象类
  15. 水滴IP告诉你,IP地址是如何划分的
  16. 如何通过安装包安装应用到手机
  17. 【RL-TCPnet网络教程】第30章 RL-TCPnet之SNTP网络时间获取
  18. BTG遭遇51%攻击,幕后黑手竟是他!
  19. 1116: [POI2008]CLO
  20. transform: scale() 图片文字模糊的原因

热门文章

  1. python xlrd_【记录】Python中安装xlrd模块
  2. 越南的生活之第一顿中餐
  3. Flutter学习:高德地图flutter插件增加中英文切换
  4. Unity2020.3.19f1 简单的第三人称相机跟随
  5. 【老生谈算法】matlab实现IIR滤波器算法源码——IIR滤波器算法
  6. [深度神经网络简述与 Capsule 介绍]
  7. 西南交通大学计算机相关专业考研科目及概述
  8. 女裤裤兜如何影响工业设计?
  9. 女生适合linux运维吗,女生适不适合做Linux运维开发工程师?
  10. 胃溃疡跟胃胀有关系吗?