Spring框架高级介绍

选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。

什么是Spring框架

这个问题的古老答案是,“Spring 是一个依赖注入框架”。实际上,它远不止于此。

Spring 是最流行的 Java 企业应用程序开发框架,它带有许多工具和库来解决 Java 世界中的几乎所有问题。无论是微服务还是简单的数据库驱动的企业应用程序,Spring 都有必要的工具来帮助您入门。目前很难解释 Spring技术栈中可用的所有功能和库,随着您的进步,您将逐渐了解它们。

您会遇到两个新关键字,Dependency 和 Dependency Injection,让我们一一了解。

什么是依赖注入?

依赖注入是一种使类的创建独立于其依赖关系的技术。这基本上是将对象使用与其创建解耦。我将用一个例子来解释这一点。

在下面的代码中,PDFReader 需要一个 FileProcessor 对象。 PDFReader 直接依赖于 FileProcessor 类,这是两个类之间的紧密耦合。

public class PDFReader {
  private FileProcessor fileProcessor;
  
  public PDFReader(){
    this.fileProcessor = new FileProcessor();
  }
}

我们可以将上面的类重写为松散耦合的类,如下面的代码,其中 FileProcessor 在构造函数中传递。这种实现代码的方式称为依赖注入。

public class PDFReader {
  private FileProcessor fileProcessor;
  public PDFReader(FileProcessor fileProcessor){
    this.fileProcessor = fileProcessor;
  }
}

大家能看出这两种实现方式的区别吗?

1、第一个实现中,FileProcessor的创建由PDFReader控制,它们之间形成了强烈的耦合。

2、第二个实现中,PDFReader没有控制FileProcessor的创建,而是通过构造器注入实现的,它们之间是松耦合的。

 

Spring框架的核心模块

Spring Framework 由几个模块组成,每个模块都包含单独的功能。根据项目需要,您可以使用必要的模块作为 Maven/Gradle 依赖项。

各种 Spring 模块可以组合在一起分为以下几类。

1、Spring 核心模块——IoC 容器、事件、资源、i18n、验证、数据绑定、类型转换、SpEL、AOP。

2、Spring 测试模块——模拟对象、TestContext 框架、Spring MVC 测试、WebTestClient。

3、数据访问模块——事务、DAO 支持、JDBC、O/R 映射、XML 编组。

4、Web Servlet 模块——Spring MVC、WebSocket、SockJS、STOMP 消息传递。

5、响应式 Web 模块 – Spring WebFlux、WebClient、WebSocket。

6、集成模块——远程处理、JMS、JCA、JMX、电子邮件、任务、调度、缓存。

版权声明:著作权归作者所有。

相关推荐

[译]iOS开发可复用框架入门(实例)

当你编写一个iOS应用程序时,你通常会什么都不想就导入Foundation或UIKit框架。 如果要使用字符串,日期,文件系统或线程,可以导入Foundation。如果要使用UITableViewController或UIAlertController,则可以导入UIKit。 如果你导入了UIKit,那么可以完全忽略Foundation,因为UIKit在后台会导入它。关键是这些

GPU架构学习资源

这里收藏了gpu学习的网站,pdf等等资源:http://courses.cms.caltech.edu/cs179/http://www.amd.com/Documents/GCN_Architecture_whitepaper.pdfhttps://community.arm.com/graphics/b/bloghttp://cdn.imgtec.com/sdk-documentation/

Go语言日志框架logrus封装

logrus在github上是一个star数比较高的go日志框架,简单封装如下:package log import ( "fmt" "github.com/Sirupsen/logrus" "runtime" "strings" ) var logger = logrus.New() // 封装logrus.Fields type Fields logrus.Fields func SetLog

Go日志框架logrus的基本用法

以package级别方式使用logruspackage main import ( "os" log "github.com/sirupsen/logrus" ) func init() { // 设置日志格式 log.SetFormatter(&log.JSONFormatter{}) // 设置输出 log.SetOutput(os.Stdout) // 设

JPA架构(JPA - Architecture)

今天我们来学习一下JPA的架构,首先问一个问题,大家学习理解一个架构有什么好的方法呢?对于我自己来说,我觉得架构图是理解架构最好的方式以上就是JPA的架构图,我们可以知道,JPA的主要部分包括五个类: 第一个类EntityManagerFactory,我们可以称为实体管理器工厂类,很显然,这个类的作用是创建和管理多个实体管理器类,因此,我们可以大胆猜测,实体管理器工厂类和实体管理器是一对

微前端架构【译】

作者:Muhammad Anser来自🇵🇰的软件工程师,作家,演讲者和喜欢编写技术的技术极客。 在深入研究微前端技术之前,我们必须了解什么是微服务架构,因为微前端的概念隐约受到微服务的启发并以微服务命名。根据官方文档,微服务(也称为微服务架构)是一种架构风格,它将应用程序构建为一组服务,这些服务是:高度可维护和可测试松散耦合可独立部署围绕业务能力进行组织小团队微服务架构支持快速、频繁

干净架构(Clean Architecture)故事【译】

干净架构概念已经存在了一段时间,并不断出现在一个或另一个地方,但它并没有被广泛采用。 在这篇文章中,我想以一种不太传统的方式介绍这个主题:从客户的需求开始,经过各个阶段,提出一个足够清晰的解决方案,以满足上述博客(或同名书籍)中的概念。观点为什么我们需要软件架构?它到底是什么?在敏捷世界有点出乎意料的地方可以找到广泛的定义——来自 TOGAF 的企业架构定义。系统在其环境中的基本概念或属性体现在其

RxJs高阶运算——mergeMap

上一节我们介绍了第一个高阶运算concatMap,今天我们开始学习第二个高阶运算mergeMap。同样的道理,为了掌握mergeMap,我们先了解merge。mergeMap动态图我们知道concatMap是顺序执行,有的时候我们可能需要并行执行,此时我们就要用到merge.Observable Merge代码举例onst series1$ = interval(1000).pipe(map(va

RxJs高阶运算——switchMap

上一节我们学习了mergeMap的相关知识,我们知道了在并发执行的时候,我们可以使用mergeMap来达到效果。今天我们学习另一个高阶运算符switchMap。同样的道理,我们想要学习理解switchMap,我们首先得知道什么是switch?Observable Switchingswitch的概念更接近于merging而不是concatenation,因为我们不等待任何 Observable 终

RxJs高阶运算——exhaustMap

上一节我们介绍了switchMap的特点,只要一个新的Source Observable到来,我们就订阅新的Observable,那么可能会有另一种情况就是,我们订阅第一个Source Observable,只有当这个Observable都完成的时候,如果之前有新的Observable到来,我们都忽略,这种情况就是我们今天介绍的exhaustMap.为了学习exhaustMap,我们先得理解Exh