小宋最近写的博客会比较多,可能又爱上了写博客。
这篇博客我会带大家加深对Spring的理解,不会有什么代码,有些问题是我之前遇到过有记录的,有些是在使用 Spring 的过程中也并没有注意,临时查阅了资料和书籍加上的。希望大家看了能有帮助。

文章目录

  • 什么是 Spring 框架?
  • 列举一些重要的Spring模块?
  • @RestController vs @Controller
    • Controller
    • RestController
    • @Controller +@ResponseBody
  • Spring IOC和AOP
    • IoC
    • AOP
      • Spring AOP 和 AspectJ AOP 有什么区别?

什么是 Spring 框架?

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

官网链接: Spring 官网.

我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。这些模块是:Core核心容器、DAO数据访问/集成,、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 WebFlx 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 测试的支持。

@RestController vs @Controller

Controller

Controller 返回一个页面

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

RestController

@RestController 返回JSON 或 XML 形式数据

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

@Controller +@ResponseBody

@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

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 注解配置就慢慢开始流行起来。

推荐阅读:IOC深入理解

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的相关知识,接下来的Spring系列文章会继续带大家深入了解Spring的相关知识,谢谢大家的观看,希望能给各位同学带来帮助。如果觉得博主写的还可以的,可以点赞关注。

微末--Spring系列之初入Spring(一)相关推荐

  1. Spring Cloud之初入篇

    本篇博客讲解Spring Cloud的简单理论知识. 什么是Spring Cloud SpringCloud是一系列框架的有序集合.它利用Spring Boot的开发便利性很巧妙地简化了分布式系统基础 ...

  2. 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解

    本文我们来梳理一下Spring的那些注解,如下图所示,大概从几方面列出了Spring的一些注解: 如果此图看不清楚也没事,请运行下面的代码输出所有的结果. Spring目前的趋势是使用注解结合Java ...

  3. Spring系列(九)- Spring Web MVC 框架

    文章目录 MVC设计模式简介 Spring MVC 工作流程 Spring MVC接口 需求的配置 Spring MVC视图解析器 Controller 注解类型 Spring MVC的转发与重定向 ...

  4. Spring系列教程四:Spring对Bean的管理细节

    2019独角兽企业重金招聘Python工程师标准>>> 一.Spring创建bean的三种方式 ①使用默认构造函数创建 在spring配置文件中使用bean标签,配以id和class ...

  5. Spring系列教程八: Spring实现事务的两种方式

    2019独角兽企业重金招聘Python工程师标准>>> 一. Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的 ...

  6. Spring系列(五)Spring的多线程

    1. 多线程 Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThredPoolTaskExecutor可以实现基于线程池的TaskExecutor. 为了实现异步任 ...

  7. 知客亭--多线程系列之初入

    因为答应了一位粉丝要好好讲一下多线程并发的相关知识,小宋这个专题的博客又没有更新什么内容,所以考虑了一下,小宋还是决定义不容辞的带大家了解一下多线程并发的相关知识,例如线程,进程和多线程等.本章节,先 ...

  8. 夯实Spring系列|总览介绍

    文章目录 系列文章 番外篇 1.文章说明 2.整理目的 3.Spring 核心特性 4.数据存储(Data Access) 5.Web 技术 6.技术整合 7.测试(Testing) 8.Java 版 ...

  9. Spring系列中文文档

    Spring系列中文文档 Spring源码 中文手册 Spring Core上 Spring Core下 Spring容器扩展点(Container Extension Points) Factory ...

最新文章

  1. PHPer常见的面试题总结
  2. 搜索Maven的仓库
  3. hell 12 21 filename重定向的含义和区别
  4. css3图片垂直居中
  5. 3.深度学习练习:Planar data classification with one hidden layer
  6. python怎么安装request_【python】如何安装requests
  7. gradle mysql依赖关系,如何在gradle中找到\删除未使用的依赖关系
  8. oracle-DECODE()函数
  9. TwinCAT与台达伺服驱动器连接调试控制电机正反转
  10. mGBA-0.9.2 免费开源的gba模拟器
  11. ibm量子云计算机,IBM量子云的16个量子比特全被纠缠起来了!
  12. win7计算机出现空白图标,Win7系统桌面图标显示异常变未知白色图标解决方法大全...
  13. foxmail连接163邮箱服务器,Foxmail怎么接收163邮箱? foxmail添加163邮箱的方法
  14. 移动开发程序员的悲哀是什么?
  15. c语言中puts的作用,c语言中puts的用法
  16. KKT条件和二阶条件和凸度优化(六)
  17. 光伏发电站|太阳能电池板辐照度(4G)无线直流电压汇集电流测量采集监控技术方案
  18. PC格局已改变 联想未来的短板在哪里?
  19. UGUI射线检测或触碰检测
  20. 阿里云TSDB时空数据库实战(一):数据入库与导出

热门文章

  1. 怎么让一天有36小时
  2. 骂人的到底是些什么人
  3. Revit复制轴网和标高
  4. Android人脸识别和证件识别
  5. 入门级:GitHub和Git超超超详细使用教程!
  6. ecshop mysql 30秒_ecshop数据库字段说明汇总
  7. 记忆力很差怎么学计算机,九个方法增强记忆力 学生记忆力很差怎么办
  8. maven项目集成swagger3生成json和yaml格式的openapi文件
  9. 卡牌系统psv游戏推荐_PSV精品游戏推荐之一,让你的小V再次发挥余热吧!
  10. 惠头条自媒体如何产生爆文