Spring中的核心概念

news2024/11/24 17:56:55

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟
🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵
🍉本篇简介:🍉 本篇记录Spring中的核心概念,如有出入还望指正。

关注公众号【可为编程】回复【面试】领取年度最新面试题!!!

Spring中有3个核心的概念:控制反转(Ioc)、依赖注入(DI)、面向切面编程(AOP),spring中其他的技术都是依靠3个核心的技术建立起来的,所以玩spring需要先对这3个概念有个深入的理解。其实这个话题已经是老生常谈的问题了,那为啥还要拿出来说,因为一直想做一个Spring系列,切入点只能是先从理论着手,然后逐步深入,因此作为Spring系列的开局,先要知道Spring是什么,有什么,能干什么,然后在逐步深入去剖析。

本文我们先介绍其中的两个:控制反转IOC容器和依赖注入DI,而AOP我们后面有专门的文章进行详解。先通过原来的非Spring形式编码引出Spring,然后通过该例子介绍Spring到底帮我们做了哪些工作,能帮我们提升哪方面的效率。
 

引出spring

这里创建2个类,A类和B类,如下:

public class A{

    public void a1(){}

}

public class B{

    public void b1();

}

上面两个类都有各自的方法。现在我们调用B的b1方法,而B中的b1方法需要调用A中的a1方法才可以完成整个类直接的调用,所以B的代码变成了下面这样:

public class B{

    private A a;//1

    public B(){

        this.a = new A();//2 

}

    public void b1(){

        this.a.a1(); //3

    }

}

分析一下上面代码:

//1:B类中声明了一个A类型的属性a

//2:new了一个A对象,赋给了a属性

//3:B类中的b1方法中去调用a.a1()完成业务操作

上面代码中B的b1方法需要调用A的a1方法,说明B对象依赖于A对象,B中的b方法依赖于A中的a方法。但是上面代码存在一些问题:

B类中a对象的创建写死在B的构造方法中,通过B对象在创建时同时创建A对象实例,如果我们想在创建不同的B对象的时候,使用不同的A对象实例,肯定是无法实现的,同时代码也不利于测试和维护,由于B中a的创建被写死在构造方法中,想测试一下B中不同a对象的效果,此时只能去修改B中的构造方法。那我们能不能把它拆出来,每次先去创建A对象的实例然后再交给B对象呢?

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

上面代码优化后,B中a对象的创建不能写死,外部创建好传入到B对象中,变成了下面这样:

public class B{


    private A a;


    public B(A a){

        this.a = a;

    }

    public void b1(){

        this.a.a1(); 

    }

}

上面代码可以在创建B对象的时候,将外部创建好的a对象传入进去,此时a的控制权交给了使用者B对象,创建B对象如下:

A a = new A();

B b = new B(a);

b.m1();

我们再扩展一下,如果B类中还需要依赖多种类似于A的对象,比如需要依赖于C、D、E、F或者更多对象,那就需要调整B的构造方法,新增加一个构造方法,可以支持多种不同的对象。

但是使用B的时候就变成了下面这样:

A a = new A();

C c = new C();

D d = new D();

E e = new E();

F f = new F();

...

B b = new B(a,c,d,e,f,...);

b.b1();

在使用B对象之前,需要先创建B依赖的所有对象,并将这些对象传递给B对象。如果多个地方都需要用到B类型的对象,使用这种new的方式会导致代码冗长且不易维护。如果B中新增了依赖,还需要先创建被依赖的对象,然后将其填充给B对象。

以上过程需要用户自己去完成,所有对象的创建都由用户控制,这样的方式有一些缺点,比如代码冗长、耦合度高(依赖调整时需要大幅改动)、不易扩展等。这与常说的“高内聚,低耦合”原则相违背。那就需要采用更加优雅的方式来解决这个问题。

举个例子,比如存在一个第三方来负责对象的创建和组装工作。在对象调用的时候,只需要告诉第三方我需要哪些对象,向第三方提供一个清单,清单中告诉第三方需要使用B对象及其依赖的哪些对象。然后由这个第三方来创建和组装B对象。注意这里,这里是创建和组装,说明第三方并不是单一帮我们创建B对象所依赖的其他对象,而是整个B对象。当用户需要使用B对象时,只需向第三方查询。如果第三方已经创建好了B对象,就直接返回给用户。整个系统中需要使用的对象都可以列在清单中,让第三方来创建。这样就减少了用户外部创建对象的数量和代码量,当B的依赖对象有新增或删除时,只需调整清单即可。那这个第三方就是目前的Spring。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

spring容器

spring的概念,其实它本质上就是一个容器,容器可以放很多东西,在容器里面的都是我们要用的JavaBean。程序启动的时候会创建spring容器,会给spring容器一个清单,清单中列出了需要创建的对象以及对象之间的依赖关系,spring容器会创建和组装好清单中的对象,然后将这些对象存放在spring容器中,当程序中需要使用的时候,可以到容器中查找获取,然后直接使用。

spring容器的的启动过程简要如下几步:

1、初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中

2、将配置类的BeanDefinition注册到容器中

3、调用refresh()方法刷新容器

后面会单独拿出一篇文章进行详细讲解。

IOC:控制反转

用户在之前使用B对象时,都要自己去创建和组装对象,而现在创建和组装都交给spring容器去做,用户只需要去spring容器中查找需要使用的对象就可以了,在上面例子中,用户就相当于调用B对象的一方。这个过程中B对象的创建和组装过程被反转了,由原来的使用者自己主动控制并主导,现在转变成了Spring主动去创建和组装,对象的构建过程被反转了,所以叫做控制反转。IOC是面相对象编程中的一种设计原则,主要是为了降低系统代码的耦合度,可以即插即拔的使用,有利于系统的维护和扩展。Spring 中的 IoC 的实现原理就是工厂模式加反射机制。后面可以针对其进行文章输出。工厂相对应的就是beanfactory的getBean()方法,反射就是Spring底层实例化对象所采用的机制。Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)装配对象、配置对象)并且管理这些对象的整个生命周期,同时可以在其生命周期内定义一些行为。后面也会单独拿出一篇文章讲解ioc的具体功能作用,包括如何创建bean,bean生命周期等等。在Spring中BeanFacotry是IOC容器的实际代表者。Spring 提供了两种不同类型的容器:ApplicationContextBeanFactory。后面会进行详细讲解。

DI:依赖注入

依赖注入是Spring容器在创建对象时设置其依赖对象的方法。我们可以向Spring提供一个清单,清单中列出了需要创建的B对象以及其他对象(可能包含B类型所需的依赖对象)。当Spring创建B对象时,会查看B对象需要依赖哪些对象,然后在清单中查找是否包含这些被依赖的对象。如果存在,Spring将先创建这些对象,并将它们传递给B对象;B可能需要依赖多个对象,在创建B之前,无需事先了解其他对象是否存在、在哪里以及它们的创建方式。Spring容器会主动创建B所依赖的对象,并将其注入到B中。例如,当Spring容器创建B时,如果发现B依赖于A,在清单中找到A的定义后,Spring会先创建A对象,并将其注入到B对象中。

总结

  1. IOC控制反转,是一种设计理念,将对象创建和组装的主动控制权利交给了spring容器去做,控制的动作被反转了,降低了系统的耦合度,利于系统维护和扩展,主要就是指需要使用的对象的组装控制权被反转了,之前是自己要做的,现在交给spring容器做了

  2. DI依赖注入,表示spring容器中创建对象时给其设置依赖对象的方式,通过某些注入方式可以让系统更灵活,比如自动注入等可以让系统变的很灵活,这个后面的文章会细说。

  3. spring容器:主要负责容器中对象的创建、组装、对象查找、对象生命周期的管理等操作。

欢迎大家关注公众号【可为编程】,回复【加群】进入微信群,右边为Q群:761374713,成长,进步,编程,技术、掌握更多知识!

在这里插入图片描述

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

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

相关文章

QQ文件怎么恢复?3个方法解决文件丢失问题!

无论是在学习还是工作中,我们都有可能需要接触到QQ这款软件。QQ传输文件十分方便,因此仍然有许多小伙伴喜欢用QQ来发送各种类型的文件。对于大家来说,最害怕的莫过于重要的文件出现丢失的情况。 当我们发现QQ文件意外删除或者过期时该怎么办…

【第28例】IPD体系进阶 | 需求管理:需求实现过程

目录 简介 内容详解 CSDN学院相关推荐 作者简介 简介 继续 IPD 体系中的需求管理相关的专题。 先来看看整个需求管理涉及的过程内容: 需求管理流程主要包含五个阶段: 需求收集; 需求分析; 需求分发/分配;

软件开发项目文档系列之九如何撰写测试方案

测试方案是任何软件开发和项目实施过程中的重要组成部分,它提供了确保系统质量和可靠性的蓝图。通过明确定义测试的范围、策略、资源和计划,测试方案确保项目团队明白如何有效地执行测试,并提供客观的评估和反馈。它有助于降低项目风险&#…

【PyTorch 卷积】实战自定义的图片归类

前言 卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一,它通过卷积层、池化层、全连接层等结构,可以有效地处理如时间序列和图片数据等。关于卷积的概念网络上也比较多,这里就不一一描述了。…

苹果手机黑屏了怎么恢复正常?这些修复方法记得收藏好!

苹果手机黑屏是一种常见的手机故障,很多人在遇到手机突然黑屏的情况时感到束手无策。手机黑屏会干扰用户的正常使用,带来不便,并给用户带来不好的体验。苹果手机黑屏了怎么恢复正常?本文将为大家详细介绍修复苹果手机黑屏的方法。…

3.网络之UDP

UDP协议 文章目录 UDP协议1. UDP概述2. UDP报文格式3. UDP传输限制4. UDP校验和4.1 CRC 循环冗余校验算法4.2 md5 校验算法 1. UDP概述 UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证&a…

Linux指令【下】

目录 时间 date 时间戳 cal 查找 find which whereis grep uniq 打包压缩 zip/unzip tar uname 其他热键 关机 系统互传 linux和Windows Linux和Linux 时间 date 用法:date[option] [format] 选项功能%Y年%d日%m月%H时%M分%s秒%X%H:%M%S%F%Y-%…

「Java开发指南」如何用MyEclipse搭建Spring MVC应用程序?(一)

本教程将指导开发者如何生成一个可运行的Spring MVC客户应用程序,该应用程序实现域模型的CRUD应用程序模式。在本教程中,您将学习如何: 从数据库表的Scaffold到现有项目部署搭建的应用程序 使用Spring MVC搭建需要MyEclipse Spring或Bling授…

【MySQL数据库】 一

本文主要介绍了关系型数据库和非关系数据库的区别,以及主流的关系型数据库mysql的安装 , 以及mysql数据库客户端-服务器的结构. 一.数据库的分类 我们可以简单的把数据库看成是一类软件 数据库分成两大类 1.关系型数据库 通常以表格的方式来组织 2.非关系型数据库 通常以键值…

电脑关机很慢?这几个优化技巧请收好!

当我们使用电脑时,一个令人不快的问题是,关机变得异常缓慢。电脑在关机时可能需要很长时间,甚至让人感到沮丧。这不仅是时间浪费,还可能表明系统存在问题。在本文中,我们将介绍四种解决电脑关机很慢的方法,…

怎么向国外客户催单?这样做既有效又不让客户反感

外贸业务员接单的过程其实是一场利益博弈的过程,而且外贸销售永远靠结果说话,所以无论你的客户如何承诺,甚至有时候都已经签订了定单合同做了PI,但客户钱没到账公司,一切就有可能归零。 01 心态一定要稳住 对于每个有…

如何在业务代码中优雅地使用责任链模式

通过使用责任链模式,我们可以更加灵活和优雅地处理请求,降低代码之间的耦合度,提高代码的可维护性和可扩展性。在一些具有复杂业务逻辑或需要动态处理请求的场景下,使用责任链模式将是一个很好的选择。本文将通过一个具体的示例来…

【错误解决方案】ModuleNotFoundError: No module named ‘tensorboardX‘

1. 错误提示 在python程序中,尝试导入一个名为tensorboardX的模块,但Python提示找不到这个模块。 错误提示:ModuleNotFoundError: No module named ‘tensorboardX‘ 2. 解决方案 在python出现中,遇到这个问题是Python无法找到…

无需编程技术,快速搭建个人网站

如果你想拥有一个属于自己的个人网站,但又没有任何编程经验,别担心,我们今天将为你介绍一个简单的方法,让你轻松搭建网站,无需任何编程知识。让我们一起来看看吧! 在乔拓云建站工具中,自带了许多…

TypeScript之装饰器

一、是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就…

图纸管理制度《八》设计图纸管理制度

第一章 总则 第1条 目的。为做好设计图纸的管理工作,使其收发及时、手续齐全、废图绝迹、不遗失、无差错,特制定本办法。 第2条 适用范围。本办法适用于企业所有工程项目的图纸管理工作。 第3条 相关部门及人员职责 (1) 工程技术部负责图纸管理的监督…

双十一百亿美元补贴,AWS阿里云腾讯云华为云国际版钜惠

双十一来袭!阿里云/腾讯云/华为云国际站该怎么玩?九河云(双十一特大促销,低至5.18折 (9he.com))这次双十一活动汇聚了一系列前所未有的优惠,不仅能享受服务器和CDN的超值折扣,还有机会赢取华为M…

智慧工地建造平台源码、智慧化工地云平台源码

概述:智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实…

Spring Cloud Alibaba中Nacos的安装(Windows平台)以及服务的发现

Spring Cloud Alibaba中Nacos的安装(Windows平台)以及服务的发现 下载安装Nacos解压启动验证是否启动搭建一个简单的Spring Cloud Alibaba项目Spring Cloud Alibaba 以及 Nacos的引入如何选择对应的版本 服务的注册Nacos相关组件的说明 下载安装Nacos G…

Python如何解析json对象?

目录 一、JSON简介 二、Python的json模块 1. 加载JSON数据 2. 生成JSON数据 三、处理复杂的JSON数据 四、自定义JSON解析器 五、注意事项和最佳实践 六、总结 JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在网络通…