Spring是什么?关于Spring家族

news2025/1/13 2:45:48

初识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(){
            //依赖CPU
            Cpu cpu=new Cpu();
            cpu.init();
        }
    }
    //配置CPU
    static 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(){
            //依赖CPU
            Cpu cpu=new Cpu();
            cpu.init();
        }
    }
    //配置CPU
    static 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(){
            //依赖CPU
            cpu.init();
        }
    }
    //配置CPU
    static 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(){
            //依赖CPU
            cpu.init();
        }
    }
    //配置CPU
    static 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(){
            //依赖CPU
            cpu.init();
        }
    }
    //配置CPU
    static 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(){
            //依赖CPU
            cpu.init();
        }
    }
    //配置CPU
    static 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.coloradmin.cn/o/436046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑客网站攻击的主要手段

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 黑客与白帽子 有的童鞋觉得黑客和白帽子是同一回事儿,其实不然;而且,他们的工作方式与目标也有很大的差异。 黑客是指一群专门使用计算机…

9.2 变量的指针和指向变量的指针变量

9.2 变量的指针和指向变量的指针变量 一.指针变量的定义二.指针变量的引用三.整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记 一.指针变量的定义 变量的指针 就是变量的地址。 我们可以定义一个指向 变量 的指针变量。 这种指针变量,我们在定义的时…

信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据)

信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据) 目录 应用背景操作步骤1、筛选2、高级筛选 应用背景 在WPS里,筛选有两种,一种是筛选,另外一种则是高级筛选。 操作步骤 1、筛选 可以根据学号、准考证号、考…

MyBatisPlus基础入门学习

系列文章目录 MyBatisPlus基础入门学习 文章目录 系列文章目录前言一、MyBatisPlus简介1.入门案例2.MyBatisPlus概述 二、标准数据层开发1.标准数据层CRUD功能2.分页功能 三、DQL控制1.条件查询方式2.查询投影3.查询条件设定4.字段映射与表名映射 四、DML控制1.Insert2.Delete…

原创文章生成器在线版-ai写作生成器

随着人工智能技术的迅猛发展,越来越多的人开始意识到,利用AI可以实现许多以前不可能想象的事情。其中,一种最能体现人工智能技术优势的应用就是“ai原创文章生成器”。它可以为营销从业者提供一种全新的营销推广方式。 那么,什么是…

AIGC技术赋能下 CRM将迎来怎样的变革?

今年以来,随着ChatGPT的爆火,人工智能(AI)迎来新一轮的热潮,开始更多地走入人们的视野。如果说2016年“阿尔法狗”(Alpha Go)大战围棋世界冠军还只是人工智能的“昙花一现”,那么Cha…

在 FPGA 上如何实现双线性插值的计算?

作者 | 殷庆瑜 责编 | 胡巍巍 目录 一、概述 二、What?什么是双线性插值? 二、Why?为什么需要双线性插值? 三、How?怎么实现双线性插值? 关键点1 像素点选择 关键点2 权重计算 升级1 通过查表减少…

深入分析Linux网络丢包

1、背景: 从图中你可以看出,可能发生丢包的位置,实际上贯穿了整个网络协议栈。换句话说,全程都有丢包的可能。 在两台 VM 连接之间,可能会发生传输失败的错误,比如网络拥塞、线路错误等;在网卡…

大数据实战 --- 淘宝用户行为

目录 开发环境 数据描述 功能需求 数据准备 数据清洗 用户行为分析 找出有价值的用户 开发环境 HadoopHiveSparkHBase 启动Hadoop:start-all.sh 启动zookeeper:zkServer.sh start 启动Hive: nohup hiveserver2 1>/dev/null 2>…

计算机体系结构基本概念,指令系统

Amdahl定律 这个定律告诉我们去优化系统中最重要(占比最大)的部分,作业有个问题,是系统中有多个部件可以改进,可改进部分比例的分母是整个任务,并不是独属于部件 i i i的任务,因此扩展的Amdahl定…

kubespray 部署 kubernetes 排错细节仅供参考

文章目录 1. TASK [kubernetes/preinstall : Hosts | create list from inventory]2: TASK [container-engine/containerd : containerd Create registry directories]3. TASK [kubernetes/control-plane : kubeadm | Initialize first master]4. reslov.conf 权限无法修改5. i…

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法

LeetCode算法小抄 -- 环检测算法 和 拓扑排序算法 环检测算法(DFS)[207. 课程表](https://leetcode.cn/problems/course-schedule/) 拓扑排序算法(DFS)[210. 课程表 II](https://leetcode.cn/problems/course-schedule-ii/) 环检测算法(BFS)拓扑排序算法(BFS) ⚠申明&#xff1…

第四章-图像加密与解密

加密与加密原理 使用异或运算实现图像加密及解密功能。 异或运算规则(相同为0,不同为1) 运算数相同,结果为0;运算数不同,结果为1任何数(0/1)与0异或,结果仍为自身任何数(0/1)与1异或,结果为另外一个数,即0变1, 1变0任何数和自身异或,结果为0 同理到图像加密解密 加密过程:…

Stable Diffusion成为生产力工具(六):制作一张庆祝五一劳动节的海报

S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装webui《Windows安装Stable Diffusion WebUI及问题解决记录》。…

JS逆向 - 破解oklink加密参数及加密数据

版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 目录 一、JS逆向目标-会当临绝顶二、JS逆向分析-不识庐山真面目三、JS逆向测试-只缘身在此山中四、JS反逆向-柳暗花明又一村五、oklink逆向完整代码下载六、作者Info 一、JS逆向目…

Redis --- 常用命令、Java中操作Redis

一、Redis常用命令 1.1、字符串string操作命令 Redis 中字符串类型常用命令: SET key value 设置指定key的值 GET key 获取指定key的值 SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒 SETNX key value 只有在 key 不…

Java入坑之抽象类、设计模式与接口

目录 一、抽象类 1.1定义 1.2特点 1.3使用场景 1.4抽象方法 1.5抽象类的实现 1.6开-闭原则 1.7匿名类 二、设计模式(了解) 2.1定义 2.2分类 2.3模板设计模式 2.4单例模式 三、接口 3.1定义 3.2语法格式 3.3接口实现 3.4接口类型变量 …

cyberdefenders------------Insider

cyberdefenders------------Insider 防守更聪明,而不是更难 0x01 前言 ​ CyberDefenders 是一个蓝队培训平台,专注于网络安全的防御方面,以学习、验证和提升网络防御技能。使用cyberdefenders的题目来学习恶意流量取证,题目来…

GBDT算法原理及实战

1.什么是GBDT算法 GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它通过构造一组弱的学习器(树),并把多棵决策树的结果累加起来…

手把手教你实现控制数组某一个属性之和不能超过某一个数值变量

大家好啊,最近有个小任务,就是我表格多选后,某一项关于栏目数量之和不能超过其他变量 先看图: 代码就是: 这里有一个点就是我需要累加数量之和,其实遍历循环累加也可以 我这里用的是reduce方法 0代表设置…