Spring是什么?关于Spring家族

news/2024/11/8 15:04:11/

初识Spring

什么是Spring?

Spring是一个开源的Java企业级应用程序开发框架,由Rod Johnson于2003年创建,并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型,支持开发各种类型的应用程序,包括Web应用、移动应用、消息传递应用、批处理应用等等。

Spring框架是一个轻量级的框架,其核心原则是面向接口编程控制反转(IoC)。

通过使用Spring框架,可以简化应用程序的开发、部署和测试,并提高应用程序的可维护性和可扩展性,总而言之使用Spring的根本目的就是为了简化Java开发

一句话概括Spring就是:Spring是包含了众多工具方法的IoC容器

Spring的优点?

  1. 方便解耦,简化开发:Spring框架实现了控制反转(IoC)和依赖注入(DI)等特性,可以将对象的创建和依赖关系交给Spring容器管理,从而大大简化了开发过程。
  2. AOP编程的支持:Spring提供了面向切面编程(AOP)的支持,可以方便地实现对程序进行权限拦截、运行监控等功能。
  3. 声明式事务的支持:Spring的事务管理机制可以通过配置来实现,从而实现声明式事务的效果,降低了手动编码的复杂性。
  4. 方便程序的测试:Spring对Junit4支持,可以通过注解方便地测试Spring程序。
  5. 方便集成各种优秀框架:Spring可以与各种优秀的开源框架无缝集成,如Struts、Hibernate、MyBatis等。
  6. 降低Java EE API的使用难度:Spring提供了许多方便的API和工具类来简化Java EE API的使用,从而降低了使用难度。

什么是容器?

我们说Spring是包含了众多工具方法的IoC容器。那么,什么是容器?

容器是用来容纳某种物品的装置。在Java中,容器就是用来容纳某种对象的装置

之前我们曾接触到的容器有:线程池、Map、队列、Tomcat......

什么是IoC?

IoC的全称为:Inversion of Control。也就是:控制反转

IoC是一个面向对象编程的设计原则,也是Spring框架的核心思想之一

IoC的基本思想是将对象的创建和依赖关系的维护交给容器来管理,从而使得程序更加松耦合、可维护和可扩展

举一个例子:

如果我们要做一个电脑。我们的基本思路是这样子的:

制作一个电脑,电脑的运行需要电脑配置,配置有软件和硬件配置,这里我们只选取了硬件配置。而硬件配置中我们选取了CPU。最终的程序实现代码如下:

import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;public class NewComputer {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer();computer.init();}//电脑对象static class Computer{public void init(){//依赖配置Configuration configuration=new Configuration();configuration.init();}}//配置对象static class Configuration{public void init(){//依赖硬件Hardware hardware=new Hardware();hardware.init();}}//配置硬件static class Hardware{public void init(){//依赖CPUCpu cpu=new Cpu();cpu.init();}}//配置CPUstatic class Cpu{private String model = "Intel的酷睿core系列";public void init(){System.out.println("CPU型号——>"+model);}}
}
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;public class NewComputer {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer();computer.init();}//电脑对象static class Computer{public void init(){//依赖配置Configuration configuration=new Configuration();configuration.init();}}//配置对象static class Configuration{public void init(){//依赖硬件Hardware hardware=new Hardware();hardware.init();}}//配置硬件static class Hardware{public void init(){//依赖CPUCpu cpu=new Cpu();cpu.init();}}//配置CPUstatic class Cpu{private String model = "Intel的酷睿core系列";public void init(){System.out.println("CPU型号——>"+model);}}
}

上面代码的运行效果如下:

那如果,这个时候我们定制电脑的顾客不想要这个型号的CPU,想换个型号使用。那么,这个时候我们需要该的东西就变得很多了。

如下:

public class NewComputers {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer("AMD的锐龙Ryzen系列");computer.run();}//电脑对象static class Computer{private Configuration configuration;public Computer(String model){configuration=new Configuration(model);}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (String model){hardware=new Hardware(model);}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (String model){cpu=new Cpu(model);}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}public class NewComputers {//制作一个电脑public static void main(String[] args) {Computer computer=new Computer("AMD的锐龙Ryzen系列");computer.run();}//电脑对象static class Computer{private Configuration configuration;public Computer(String model){configuration=new Configuration(model);}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (String model){hardware=new Hardware(model);}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (String model){cpu=new Cpu(model);}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}

不难看出,在我们更改底层某个参数后,以次向上我们需要更改很多代码。

如何解决这个问题呐?

我们只需要把原来由自己创建的下级类,改为传递的方式(即注入的方式),这样就完成了程序的解耦。

程序的解耦是指将程序中各个模块之间的依赖关系降低,使得不同的模块相互独立、耦合度低,从而达到易于维护、易于修改、易于扩展的目的。

控制反转

我们说Spring的其中一个优点是:Spring框架实现了控制反转(IoC)依赖注入(DI)等特性,可以将对象的创建和依赖关系交给Spring容器管理,从而大大简化了开发过程。

那么,什么是控制反转,什么是依赖注入?

还是上面的代码,我们将其创建子类的方式,改为注入传递的方式来理解何为控制反转。

public class IocNewComputers {//制作一个电脑public static void main(String[] args) {Cpu cpu=new Cpu("AMD的锐龙Ryzen系列");Hardware hardware=new Hardware(cpu);Configuration configuration=new Configuration(hardware);Computer computer=new Computer(configuration);computer.run();}//电脑对象static class Computer{private  Configuration configuration;public Computer(Configuration configuration){this.configuration=configuration;}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (Hardware hardware){this.hardware=hardware;}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (Cpu cpu){this.cpu=cpu;}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}public class IocNewComputers {//制作一个电脑public static void main(String[] args) {Cpu cpu=new Cpu("AMD的锐龙Ryzen系列");Hardware hardware=new Hardware(cpu);Configuration configuration=new Configuration(hardware);Computer computer=new Computer(configuration);computer.run();}//电脑对象static class Computer{private  Configuration configuration;public Computer(Configuration configuration){this.configuration=configuration;}public void run(){//依赖配置configuration.init();}}//配置对象static class Configuration{private Hardware hardware;public Configuration (Hardware hardware){this.hardware=hardware;}public void init(){//依赖硬件hardware.init();}}//配置硬件static class Hardware{private Cpu cpu;public Hardware (Cpu cpu){this.cpu=cpu;}public void init(){//依赖CPUcpu.init();}}//配置CPUstatic class Cpu{private String model;public Cpu(String model){this.model=model;}public void init(){System.out.println("CPU型号——>"+model);}}
}

这个时候如果我们需要更改CPU的选择只用在main方法里更改参数值就好了。

此时制作电脑的流程就改变了:

我们可以看到传统的代码是由Computer来控制并创建子类,依次类推。而IoC则是由将下级对象注入到当前对象中,下级的控制权此时不在由上级类控制。

传统的Java SE程序设计中,我们通过new关键字在对象内部直接创建和控制依赖对象,而在IoC设计中,我们将对象交给IoC容器来管理和控制,IoC容器负责创建、配置和管理bean,也就是它管理着bean的生命周期,因此控制权在IoC容器中。

DI

DI是依赖注入(Dependency Injection)的缩写。

依赖注入是一种设计模式,它可以通过将依赖关系的创建和维护交给外部容器来管理,以降低组件之间的耦合度,提高代码的可维护性和可扩展性。通常情况下,我们使用DI将一个对象的依赖关系注入到另一个对象中,而不是在对象内部创建和控制依赖对象。

IoC是一种思想,而DI是这种思想的一种具体实现。

Spring家族的主要成员

Spring Framework

Spring Framework 是一个开源框架,用于创建 Java 应用程序的全栈式企业级应用程序开发的基础设施。它提供了一系列库和工具,可以方便地解决 Java 开发中的常见问题,例如面向切面编程、IoC(控制反转)、DI(依赖注入)和集成 JPA 和 Hibernate 等 ORM 工具。Spring Framework 的目标是让 Java 开发变得更加简单、快速、高效并且完整。

Spring Boot

Spring Boot降低了开发生产级Spring应用的门槛。

Spring Boot是一个基于Spring Framework的快速开发框架,可以用来快速构建独立的、生产级别的、基yuSpring的应用程序。它采用约定优于配置的方式,通过自动配置和准备好的模板,将开发人员从繁琐的配置中解放出来,使得开发人员可以更加专注于业务逻辑的实现。

Spring Boot提供了丰富的功能和库,包括Web应用、安全性、数据访问和集成测试等。它还有很好的可扩展性,并且可以轻松地与其他Spring项目(例如Spring Cloud)集成,以支持在云环境中构建和部署应用程序。

Spring Boot提供的起步依赖很好解决了Spring应用的依赖管理困难;Spring Boot的另一大亮点是自动配置,该功能减少了Spring应用的配置量

Spring Cloud

Spring Cloud 是一个开源的、用于构建分布式系统的框架。它基于 Spring Boot,提供了一套简单易用的工具,可以帮助开发人员快速地构建和部署云原生应用程序,并解决云原生应用程序中常见的问题,例如注册和发现服务、配置管理、负载均衡、熔断器、智能路由等。Spring Cloud 基于微服务架构,提供分布式系统中诸多核心功能组件,可以为企业级应用的云原生化提供全方位的支持。

Spring Data

Spring Data 是 Spring Framework 的一个子项目,它为数据访问提供了一致的编程模型和简化的编码技巧。Spring Data 旨在简化与关系型数据库、NoSQL 数据库、MapReduce 框架和云数据库等不同类型的数据库进行交互的工作。Spring Data 的主要目标是提供一种简单的编程模型,以减少数据访问代码的重复性,并通过提供通用接口来减少开发人员需要编写的样板代码。

Spring Data 提供了一些常用的技术,包括Spring Data JPA、Spring Data MongoDB、Spring Data Redis等。它们都遵循了统一的设计理念和规范,并且相互之间可以方便地集成,使得开发人员可以轻松地适配不同的数据存储解决方案,从而更专注于业务逻辑的实现。


http://www.ppmy.cn/news/42790.html

相关文章

气象历史数据和空气质量历史数据资源汇总免费

气象数据和空气质量数据资源汇总 1.全球气象数据资源 WorldClim 网址:Global climate and weather data — WorldClim 1 documentation WorldClim是一个全球高分辨率气候数据分享平台。截止2021年03月,其包括以下数据: •Climate数据&am…

帆软FineReport学习篇(四)——父子格设置

帆软FineReport学习篇(四)——父子格设置 1.概念 子单元格设置父单元格后,子单元格随父单元格进行扩展 简易的说,子单元格根据父单元格分组显示2 对比示意图 2.1 左父格对比示意图 2.2 上父格对比示意图 3 制作分组报表 3.1 新建普通报表WorkBook2.cpt 3.1.1 点击文件➡点…

SpringMVC基础解析之Restful

1.简介 REST:Representational State Transfer 表现层资源状态转移 a>资源 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念, 所以它…

大数据-玩转数据-oracle的锁查询及处理

一、Oracle死锁原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功&#xf…

第15章_File类与IO流

第15章_File类与IO流 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. java.io.File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。 一个File对…

电池连接接触电阻的优化研究

金属与金属接触处的接触电阻主要受以下因素影响: 表面结构机械负载 表面结构可以通过表面平整度、表面氧化和吸水性进一步描述。 电池组中的这些接头将采用焊接或螺栓连接方式。最初最容易想到的是螺栓母线接头。 螺栓扭矩可用于估算力,从而估算接触压…

欧拉回路问题

文章目录 欧拉回路程序设计程序分析欧拉回路 有一条名为Pregel的河流经过Konigsberg城。城中有7座桥,把河中的两个岛与河岸连接起来。当地居民热衷于一个难题:是否存在一条路线,可以不重复地走遍7座桥。这就是著名的七桥问题。它由大数学家欧拉首先提出,并给出了完美的解答…

【千题案例】TypeScript获取两点之间的距离 | 中点 | 补点 | 向量 | 角度

我们在编写一些瞄准、绘制、擦除等功能函数时,经常会遇到计算两点之间的一些参数,那本篇文章就来讲一下两点之间的一系列参数计算。 目录 1️⃣ 两点之间的距离 ①实现原理 ②代码实现及结果 2️⃣两点之间的中点 ①实现原理 ②代码实现及结果 3…