Spring是什么?关于Spring家族

初识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等。它们都遵循了统一的设计理念和规范,并且相互之间可以方便地集成,使得开发人员可以轻松地适配不同的数据存储解决方案,从而更专注于业务逻辑的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

晒出新高度?2023夏季小红书防晒趋势前瞻

夏日将临,防晒需求激增,进入市场旺季。今年防晒赛道朝着“防护升级,多面兼顾”大势发展。 哪些趋势值得关注?本期,千瓜将通过小红书数据分析和笔记内容洞察,为品牌提供数据支持和方向参考。 月增长高达501.…

QProgressBar详解

QProgressBar详解 [1] QProgressBar详解1.QProgressBar简述2.常用方法3.示例,比较进度条4.设置样式表 [1] QProgressBar详解 原文链接:https://blog.csdn.net/wzz953200463/article/details/125530997 1.QProgressBar简述 QProgressBar提供了一个水平…

分布式锁Redisson对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redisson介绍2 Redisson快速入门3 Redisson可重入锁原理4 Redisson锁重试和WatchDog机制5 Redisson锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff…

创维高安版-E900-Hi3798MV100-强刷卡刷固件包-当贝纯净桌面

创维高安版-E900-Hi3798MV100-强刷卡刷固件包-当贝纯净桌面-内有主板图短接点和教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置…

架构师日记-深入理解软件设计模式 | 京东云技术团队

作者:京东零售 刘慧卿 一 设计模式与编程语言 1.1 什么是设计模式 设计模式(Design pattern) :由软件开发人员在软件开发中面临常见问题的解决方案,是经过长时间的试验积累总结出来的,它使设计更加灵活和…

Ubuntu 安装 Mysql

主要内容 本文主要是实现在虚拟机 Ubuntu 18.04 成功安装 MySQL 5.7,并实现远程访问功能,以 windows 下客户端访问虚拟机上的 mysql 数据库。 1. 切换至 root 用户 ,shell 终端指令均执行在 root 用户下 sudo su 2. 安装并设置 mysql 安…

通用操作日志处理方案

why(目的理念):操作日志是什么需要做哪些事情? 摘自美团博客的操作日志的介绍 操作日志的记录格式大概分为下面几种: * 单纯的文字记录,比如:2021-09-16 10:00 订单创建。 * 简单的动态的文本…

springboot+dubbo+zookeeper 项目实战

现在有一段代码再前台,后台系统中都存在,都需要这段代码,存在这种情况,我们可以选择将这段代码提取出来作为一个服务,让前台和后台系统作为消费者远程调用这段代码,提高了代码的复用性。 springboot集成dub…

【软考备战·希赛网每日一练】2023年5月4日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题三、知识查缺 题目及解析来源:2023年05月04日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 修改Linux文件权限命令:chmod。 第二题 解析: 第三题 解析…

坚持伙伴优先,共创数据存储新生态

4 月 26 日,2023 阿里云合作伙伴大会上,阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示,阿里云的核心定位是一家云计算产品公司,生态是阿里云的根基。让被集成说到做到的核心,是要坚定走向“产品被集成”…

【OpenSSH】无需公网IP使用SSH远程连接服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

Winform从入门到精通(36)——ColorDialog(史上最全)

文章目录 前言一、属性1、AllowFullOpen2、AnyColor3、Color4、FullOpen5、ShowHelp6、SolidColorOnly7、Tag二、事件1、HelpRequest前言 当我们需要设置某个控件的颜色时,并且需要弹出一个可以选择颜色的对话框时,这时候就需要使用ColorDialog 一、属性 1、AllowFullOpen…

Java设计模式-建造者模式

简介 建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。 与其他创建型模式不同,建造者模式强调的是将构建过…

BadUsb使用

1 IDE下载 地址:Software | Arduino 2 开发版驱动安装 linux和mac版本会自动识别提示你安装开发板,驱动貌似不需要额外安装 win需要根据板子型号去下载安装驱动 如 Arduino驱动的安装教程-DFRobot产品资料库 默认会提示你根据你插入的设备进行提示…

Shell+VCS学习3---VCS-lint

lint lintTFIPC-L LINTPCWMlintTFIPC-L(如果有的模块的端口定义了,但是没有连接,用这个选项,编译器会给出哪些端口没有连接) 其中CAWM貌似直接写成lintCAWM,vcs是不认的,得写成lintCAWM-L 不过CAWM的检查规则有点奇怪…

maven从入门到精通 第三章 Maven中形成web对Java工程的依赖

这里写自定义目录标题 一 war永远依赖于jar1. 在web工程的项目2中,加入项目1的路径依赖2 在web工程中,加入测试代码2.1 创建目录2.2 确认依赖junit2.3创建测试类2.4 运行测试2.5 打包2.6 查看依赖列表2.7 树形结构查看 二 测试依赖的范围1 compile的编译过程1.1 com…

快速排序算法

文章目录 一、前言二、快速排序算法的基本思想三、快速排序算法流程四、实现快速排序算法的Java代码五、分析代码实现过程1.partition方法2.quickSort方法3.swap方法4.main方法5.整体串讲 六、对快速排序算法的时间复杂度和稳定性进行讨论七、对快速排序算法的空间复杂度分析比…

USB2.0(一):基础

一、总线标准 USB1.1:支持12Mbps全速率(FullSpeed)和1.5Mbps低速率( HalfSpeed)USB2.0:支持480Mbps高速率(High Speed),兼容1.1USB3.0:支持5Gbps超高速率&am…

asp.net+sqlserver学生学籍管理系统

1.系统登录模块:为了保证系统的安全性和保密性,便于用户的管理,对用户设置权限。 界面上需要输入用户名、密码、验证码以及用户类型。 用户类型:普通用户和管理员用户。 2.用户信息管理模块&…

HarmonyOS版的“抖音”长啥样?有图有真相

“鸿蒙系统实战短视频App 从0到1掌握HarmonyOS”系列课程是面向HarmonyOS实战的视频教程,该课程会通过构建一个真实的短视频App来向读者展示HarmonyOS的全过程。 本节将演示基于HarmonyOS短视频App的核心功能。通过了解该App的功能,也能初步对本课程的内…