【Spring篇】Spring IoC DI

news2024/11/21 1:22:41

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【Spring系列】
本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌
在这里插入图片描述

目录

  • 前言
  • 一、IoC
  • 二、Bean的存储
    • @Controller(控制器存储)
    • @Service(服务存储)
    • @Repository(仓库存储)
    • @Component(组件存储)
    • @Configuration
    • 类注解之间的关系
    • @Bean方法注解
      • @Bean参数的传递
  • 三、扫描路径
  • 四、Spring DI
    • 属性注入
    • 构造方法注入
    • Setter方法注入

前言

我们知道Java是一个面向对象的语言,既然是面向对象的话就必须得有对象,无论我们使用哪种框架或者组件前提是必须得有对象,而Spring IoC就是帮助我们创建和管理对象的(可以把Spring IoC当成一个创建和管理对象的容器)

Spring IoC是Spring全家桶中各个模块的基础,创建对象的容器。

AOP是以IoC为基础,AOP是面向切面编程。

什么是面向切面编程:
在传统的面向对象编程中,我们通过将功能分散到对象的方法中来实现系统的各种需求。但是,随着系统的复杂性增加,这种方式可能导致代码的重复和混乱,特别是在处理横切关注点(cross-cutting concerns)时,如日志记录、事务管理、安全性等。
AOP的出现就是为了解决这些横切关注点的问题。它允许开发者通过将横切关注点从业务逻辑中分离出来,然后在需要的地方进行统一的管理和应用。在AOP中,这些横切关注点被称为切面(Aspect),它们是与业务逻辑独立的模块,可以在不修改源代码的情况下,通过横切方式将它们应用到系统中。(可以将AOP理解为抽象的面向编程

一、IoC

IoC,控制反转(Inversion of Control),即将创建对象的控制权进行反转。通常情况下,我们是手动进行对象的创建的,而Spring IoC可以使得开发者不再需要创建对象,而是由IoC容器根据需求自动创建项目所需要的对象。

Spring容器管理的主要是对象,这些对象,我们称之为"Bean".我们把这些对象交由Spring管理,由
Spring来负责对象的创建和销毁.我们程序只需要告诉Spring,哪些需要存,以及如何从Spring中取出对象(所以Spring IoC最主要的两个功能是存取对象)。

二、Bean的存储

IoC(Inversion of Control)是一种设计模式,用于实现控制反转,其中对象的创建和管理被转移到了容器(如Spring框架)中。在Spring框架中,对象的管理通常通过依赖注入(Dependency Injection)来实现。

常见的依赖注入方式有两种:分别是类注解和方法注解。

  • 类注解:@Controller、@Service、@Repository、@Component、@Configuration
  • 方法注解:@Bean

@Controller(控制器存储)

使⽤@Controller存储bean对象的代码如下所⽰:

在这里插入图片描述

在这里插入图片描述

  • ApplicationContext context取到Spring上下文,之后就可以取到所Spring管理的对象,然后执行对象中的doController方法

@Service(服务存储)

使⽤@Service存储bean对象的代码如下所⽰:

在这里插入图片描述

  • 通过类型获取对象:
    在这里插入图片描述

  • 通过名称获取对象(需要强制类型转换):
    在这里插入图片描述

  • 通过名称和类型获取bean:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

@Repository(仓库存储)

使⽤@Repository存储bean对象的代码如下所⽰:

在这里插入图片描述

在这里插入图片描述

运行结果如下:

在这里插入图片描述
在这里插入图片描述

@Component(组件存储)

使⽤@Component存储bean对象的代码如下所⽰:

在这里插入图片描述

在这里插入图片描述

运行结果如下:

在这里插入图片描述

@Configuration

使⽤@Configuration存储bean对象的代码如下所⽰:

在这里插入图片描述

在这里插入图片描述

运行结果如下:

在这里插入图片描述

类注解之间的关系

程序的应用分层,调用如下:

在这里插入图片描述

@Controller、@Service、@Repository、@Configuration注解都是@Component注解的衍生类

Spring MVC架构中的三层结构:控制层(Controller)、服务层(Service)和持久层(Repository/DAO):

  • 控制层(Controller)负责接收和处理HTTP请求,并将处理结果返回给客户端。通常使用@Controller@RestController注解标识。
  • 服务层(Service)负责应用程序的业务逻辑处理,包括数据处理、算法实现等。服务层通常使用@Service注解标识。
  • 持久层(Repository/DAO)负责与数据库进行交互,执行数据的持久化操作。通常使用@Repository注解标识DAO接口的实现类。

在这种架构下,控制层中的方法可以调用服务层中的方法,而服务层中的方法可以调用持久层中的方法,从而实现了业务逻辑的分层和解耦

@Bean方法注解

@Bean注解使用:

  • 使用@Bean注解的时候,Bean的名称是方法名(即首字母大写,如果前两个字母是小写的话那么Bean的名称就是类名)。
  • @Bean注解必须搭配其它五大注解来使用。(即方法注解@Bean 要配合类注解才能将对象正常的存储到Spring容器中)
  • 当一个对象类型存在多个Bean时,就不能通过类型来获取Bean了,此时应该通过名称或者方法+名称的方式来获取Bean(如下举例)。
  • 在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    运行结果如下:

在这里插入图片描述

@Bean参数的传递

Bean参数的传递演示如下:

在这里插入图片描述
在这里插入图片描述

运行结果如下:

在这里插入图片描述

三、扫描路径

SpringBoot的一大特点:约定大于配置。此特点的其中一个体现就是扫描路径

启动类默认扫描路径是启动类所在的路径及其子孙目录。

如下图(将启动类放到controller目录下面,那么启动类扫描的范围就是controller目录及其controller所有的子孙目录):
在这里插入图片描述
启动类这样放置的话运行就会报错。
在这里插入图片描述
如果非要把启动类放到controller目录下的话,要配置扫描路径,让Spring扫描到这些注解也就是通过@ComponentScan来配置扫描路径。
在这里插入图片描述
再次运行就会成功了:
在这里插入图片描述

虽然通过@ComponentScan来配置扫描路径,但是不推荐这样做,推荐做法是把启动类放在我们希望扫描的包的路径下,这样我们定义的bean就都可以被扫描到。
在这里插入图片描述

四、Spring DI

DI即依赖注入的意思,有的地方叫做对象注入、属性装配,这里需要根据上下文去进行理解。

依赖注入是一个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,而资源指的就是对象。简单来说,就是把对象取出来放到某个类的属性中

关于依赖注入,Spring为我们提供了三种方式:

  • 属性注入
  • 构造方法注入
  • Setter注入

下面我们上这三种方式一一进行举例。

属性注入

属性注⼊是使⽤@Autowired实现的,比如将Service类注⼊到Controller类中。

在这里插入图片描述

在这里插入图片描述
运行结果如下:
在这里插入图片描述

属性注入以类型进行匹配,与注入的属性名称无关。当一个类型存在多个对象时,优先进行名称匹配,但是如果连名称都匹配不上的话就会报错。

构造方法注入

构造方法注入是在类的构造⽅法中实现注入。

在这里插入图片描述
运行结果如下:
在这里插入图片描述

当存在多个构造函数时,需要加@AutoWired注明使用哪个构造函数;如果只存在一个构造函数的话,则@AutoWired可以省略。

在这里插入图片描述

在这里插入图片描述

Setter方法注入

在这里插入图片描述
运行结果如下:

在这里插入图片描述

好了,以上就是本文的全部内容了。希望各位友友可以一键三连哈!!!

在这里插入图片描述

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

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

相关文章

语义分割——自动驾驶鱼眼数据集

一、重要性及意义 环境感知:语义分割技术能够精确识别道路、车辆、行人、障碍物、交通标志和信号等各种交通场景元素。这为自动驾驶系统提供了丰富的环境信息,有助于车辆准确理解周围环境的结构和动态变化。决策规划:基于语义分割的结果&…

AI Kimi:帮助教师做好试卷命题

原文:https://www.toutiao.com/article/7353661304307778083/?log_fromcfd0a50014034_1712243146922 最近,Kimichat工具很火。这款软件不仅仅是一个聊天和阅读工具,还是一个强大的教学辅助工具。作为一位教师,尝试使用Kimichat&…

【React】useState为何返回数组而非对象

useState的正确语法如下 const [count, setCount] useState(0)通过打印可以看到useState返回一个数组,那么为何不返回对象呢 涉及到数组与对象间解构方式的差异 数组的解构:根据索引 const [a,,b] [1,2,3] console.log(a) // 1 console.log(b) // 3…

蓝桥集训之垒骰子

蓝桥集训之垒骰子 核心思想&#xff1a;矩阵乘法 f[i]存顶面数值 构造a矩阵 使得*f[i] f[i-1]a 则f[i] f[1] * an 快速幂优化 #include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N 6,m…

xilinx AXI CAN驱动开发

CAN收发方案有很多&#xff0c;常见的解决方案通过是采用CAN收发芯片&#xff0c;例如最常用的SJA1000,xilinx直接将CAN协议栈用纯逻辑实现&#xff0c;AXI CAN是其中一种&#xff1b; 通过这种方式硬件上只需外接一个PHY芯片即可 上图加了一个电平转换芯片 软件设计方面&…

Unity:2D SpriteShape

1.1 简介 Sprite Shape 可以很灵活的更改sprite的轮廓。比如&#xff1a; 它由两部分组成&#xff1a;Sprite Shape Profile、Sprite Shape Controller&#xff0c;需要导入2D Sprite Shape Package. 1.1.1 Sprite导入要求 Texture Type - ‘Sprite (2D and UI)’.Sprite Mo…

【动手学深度学习】深入浅出深度学习之RMSProp算法的设计与实现

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 认识RMSProp算法 &#x1f33c;2. 在optimizer_compare_naive.py中加入RMSProp &#x1f33c;3. 在optimizer_compare_mnist.py中加入RMSProp &#x1f33c;4. 问…

C#/WPF Inno Setup打包程序

Inno Setup介绍 Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年&#xff0c;现在已经更新到Inno Setup 6了。Inno Setup是一个十分简单实用的打包小工具&#xff0c;可以按照我们自己的意愿设置功能&#xff0c;稳定性也很好。 官方网址&#xff1…

考研人千万不能犯的错误——什么情况下求极限可以直接带入值?

博主最近在复习考研的过程中&#xff0c;做了武忠祥老师的每日一题发现有一个题型错的很集中&#xff0c;就是关于极限数值带入的问题&#xff0c;相信也有不少的宝子容易在这种题型上犯错&#xff0c;今天带大家梳理总结一下常见的计算极限时容易犯的错误 极限的四则运算定义…

harmonyOS安装ohpm

下载 下载地址 HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟 初始化 注意&#xff1a;初始化ohpm前&#xff0c;需先完成node.js环境变量配置 1.解压文件&#xff0c;进入commandline-tools-windows-2.0.0.2\command-line-tools\ohpm\bin 2.执行&#xff1a; init.ba…

第二十三章 Git

一、Git Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版…

设计模式总结-建造者模式

建造者模式 模式动机模式定义模式结构模式分析建造者模式实例与解析实例&#xff1a;KFC套餐 模式动机 无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种…

点亮创意:ChatGPT如何搭桥DALL-E图像编辑新纪元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

力扣爆刷第111天之CodeTop100五连刷41-45

力扣爆刷第111天之CodeTop100五连刷41-45 文章目录 力扣爆刷第111天之CodeTop100五连刷41-45一、232. 用栈实现队列二、4. 寻找两个正序数组的中位数三、31. 下一个排列四、69. x 的平方根五、8. 字符串转换整数 (atoi) 一、232. 用栈实现队列 题目链接&#xff1a;https://le…

Kubernetes(k8s):精通 Pod 操作的关键命令

Kubernetes&#xff08;k8s&#xff09;&#xff1a;精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…

【Unity灶台】食品加工系统模型搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

黑马鸿蒙笔记

目录 27.网络连接-Http请求数据 28.网络连接-第三方库axios 29.数据持久化-用户首选项 27.网络连接-Http请求数据 Http常见 GET一般与String配合&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE与Object配合 28.网络连接-第三方库axios 29.数据持久化-用户首选项 不行&a…

C语言 | Leetcode C语言题解之第9题回文数

题目&#xff1a; 题解&#xff1a; bool isPalindrome(int x) {if(x < 0)return false;long int sum0;long int nx;while(n!0){sumsum*10n%10;nn/10;}if(sumx)return true;elsereturn false; }

labview如何创建2D多曲线XY图和3D图

1如何使用labview创建2D多曲线图 使用“索引与捆绑簇数组”函数将多个一维数组捆绑成一个簇的数组&#xff0c;然后将结果赋值给XY图&#xff0c;这样一个多曲线XY图就生成了。也可以自己去手动索引&#xff0c;手动捆绑并生成数组&#xff0c;结果是一样的 2.如何创建3D图 在…

Qt 使用QPropertyAnimation动画效果的图片浏览器

文章目录 效果图功能点代码解析图片切换显示与动画效果图片缩放 总结 效果图 功能点 加载指定路径下的所有图片并显示滑动滑动条查看指定图片&#xff0c;也滚轮切换图片滑动条缩略图加入动画效果图片可以进行缩放移动查看 代码解析 整体来说相对&#xff0c;显示图片的是一…