当前位置: 首页 > news >正文

【Spring篇】Spring IoC DI

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【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方法注入

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

在这里插入图片描述

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

在这里插入图片描述

相关文章:

【Spring篇】Spring IoC DI

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

Python语言例题集(010)

#!/usr/bin/python3 #在链表的末端插入新的节点。 class Node(): def init(self,dataNone): self.datadata self.nextNone class LinkedList(): def init(self): self.headNone def printList(self):ptrself.headwhile ptr:print(ptr.data)ptrptr.nextdef ending(self,newd…...

redis---主从复制

主从复制是指将一台redis服务器的数据复制到其他redis服务器,也叫主节点和从节点。 一个主节点可以有多个从节点。而每个从节点只能有一个主节点。数据的复制是单向的,只能由主节点到从节点。一般来说,主节点负责写操作,从节点负…...

搜索引擎-03-搜索引擎原理

拓展阅读 搜索引擎-01-概览 搜索引擎-02-分词与全文索引 搜索引擎-03-搜索引擎原理 Crawl htmlunit 模拟浏览器动态 js 爬虫入门使用简介 Crawl jsoup 爬虫使用 jsoup 无法抓取动态 js 生成的内容 Crawl WebMagic 爬虫入门使用简介 webmagic 全网搜索引擎架构与流程如何…...

mysql语句学习

SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; (先join在on) 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算&a…...

【Apache Doris】周FAQ集锦:第 1 期

【Apache Doris】周FAQ集锦:第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...

Windows创建远程线程学习

CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程; 下面来简单做一下,配合procexp工具; VC代码如下,我是写到一个菜单单击处理函数中, void CCrrmthView::OnMenuitem32771() {// TODO: Add your command handler code hereHAN…...

使用c语言libexpat开源库解析XML数据

1 libexpat简介 Expat 是一个用 C 语言编写的开源 XML 解析库,以其高性能和小巧的体积著称。Expat 兼容多种操作系统平台,包括但不限于 Windows、Linux、macOS 等。由于其跨平台特性和简单易用的API,Expat 成为了许多C/C程序员解析XML文档的…...

51单片机入门_江协科技_19~20_OB记录的笔记

19. 串口通讯 19.1. 串口介绍: •串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 •单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的…...

基于k8s的高性能综合web服务器搭建

目录 基于k8s的高性能综合web服务器搭建 项目描述: 项目规划图: 项目环境: k8s, docker centos7.9 nginx prometheus grafana flask ansible Jenkins等 1.规划设计整个集群的架构,k8s单master的集群环境&…...

Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件

Folder Icons for Mac是一款Mac OS平台上的文件夹图标修改软件,同时也是一款非常有意思的系统美化软件。这款软件的主要功能是可以将Mac的默认文件夹图标更改为非常漂亮有趣的个性化图标。 软件下载:Folder Icons for Mac v1.8 激活版 以下是这款软件的一…...

Gitee上传私有仓库

个人记录 Gitee创建账号 以KS进销存系统为例,下载到本地电脑解压。 新建私有仓库 仓库名称:ks-vue3,选择‘私有’ 本地配置 下载安装git配置git 第一次配置可以在本地目录右键【Open Git Bash here】输入【Git 全局设置】再输入【创…...

HTMLCSSJS

HTML基本结构 <html><head><title>标题</title></head><body>页面内容</body> </html> html是一棵DOM树, html是根标签, head和body是兄弟标签, body包括内容相关, head包含对内容的编写相关, title 与标题有关.类似html这种…...

第14章 数据结构与集合源码

一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 战术和策略&#xff1a;数据结构 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 …...

分享react+three.js展示温湿度采集终端

前言 气象站将采集到的相关气象数据通过GPRS/3G/4G无线网络发送到气象站监测中心&#xff0c;摆脱了地理空间的限制。 前端&#xff1a;气象站主机将采集好的气象数据存储到本地&#xff0c;通过RS485等线路与GPRS/3G/4G无线设备相连。 通信&#xff1a;GPRS/3G/4G无线设备通…...

易宝OA ExecuteSqlForDataSet SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForDataSet接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过…...

C++语言学习(二)——⭐缺省参数、函数重载、引用

1.⭐缺省参数 &#xff08;1&#xff09;缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int…...

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可&#xff0c;左侧放置图片label&#xff0c;右侧放置文字label&#xff0c;就如上图所示&#xff1b; 但是这时的hover&#xff0c;press的伪状态是没有办法“传递”给里面的控件的&#xff0c;对btn的伪状态样式表的设置&#xff0c;是不…...

Sora文本生成视频(附免费的专属提示词)

sora-时髦女郎 bike_1 Sara-潮汐波浪 Sora是一个由OpenAI出品的文本生成视频工具,已官方发布了生成视频的样式,视频的提示词是:A时髦的女人走在充满温暖霓虹灯的东京街道上动画城市标牌。她穿着黑色皮夹克、红色长裙和黑色靴子,拎着黑色钱包。她穿着太阳镜和红色唇膏。她走…...

Flask Python:数据库多条件查询,flask中模型关联

前言 在上一篇Flask Python:模糊查询filter和filter_by&#xff0c;数据库多条件查询中&#xff0c;已经分享了几种常用的数据库操作&#xff0c;这次就来看看模型的关联关系是怎么定义的&#xff0c;先说基础的关联哈。在分享之前&#xff0c;先分享官方文档,点击查看 从文档…...

Spring Security 实现后台切换用户

Spring Security version 后端代码&#xff1a; /*** author Jerry* date 2024-03-28 17:47* spring security 切换账号*/RestController RequiredArgsConstructor RequestMapping("api/admin") public class AccountSwitchController {private final UserDetailsSe…...

《QT实用小工具·一》电池电量组件

1、概述 项目源码放在文章末尾 本项目实现了一个电池电量控件&#xff0c;包含如下功能&#xff1a; 可设置电池电量&#xff0c;动态切换电池电量变化。可设置电池电量警戒值。可设置电池电量正常颜色和报警颜色。可设置边框渐变颜色。可设置电量变化时每次移动的步长。可设置…...

基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现墙绘产品展示交易平台管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&…...

主流公链文章整理

主流公链文章整理 分类文章地址&#x1f349;BTC什么是比特币&#x1f96d;BTCBTC网络是如何运行的&#x1f351;BTC一文搞懂BTC私钥&#xff0c;公钥&#xff0c;地址&#x1f955;ETH什么是以太坊&#x1f336;️基础知识BTC网络 vs ETH网络&#x1f95c;CosmosCosmos介绍&a…...

css3之3D转换transform

css3之3D转换 一.特点二.坐标系三.3D移动&#xff08;translate3d)1.概念2.透视&#xff08;perpective)(近大远小&#xff09;&#xff08;写在父盒子上&#xff09; 四.3D旋转&#xff08;rotate3d)1.概念2.左手准则3.呈现&#xff08;transfrom-style)&#xff08;写父级盒子…...

SpringBoot -- 外部化配置

我们如果要对普通程序的jar包更改配置&#xff0c;那么我们需要对jar包解压&#xff0c;并在其中的配置文件中更改配置参数&#xff0c;然后再打包并重新运行。可以看到过程比较繁琐&#xff0c;SpringBoot也注意到了这个问题&#xff0c;其可以通过外部配置文件更新配置。 我…...

优酷动漫顶梁柱!神话大乱炖的修仙番为何火爆?

优酷动漫新晋顶梁柱&#xff0c;实时超160万在追的修仙番长啥样&#xff1f; 由优酷动漫联合玄机科技打造的《师兄啊师兄》俨然成为了国漫界一颗璀璨的新星。自去年开播以来热度口碑双丰收&#xff0c;今年在播的第二季人气更是节节攀升&#xff0c;稳坐优酷动漫榜第一把交椅。…...

每日一题:C语言经典例题之判断实数相等

题目&#xff1a; 从键盘输入两个正实数&#xff0c;位数不超过200&#xff0c;试判断这两个实数是否完全相等。注意输入的实数整数部分可能有前导0&#xff0c;小数部分可能有末尾0。 输入 输入两个正实数a和b。 输出 如果两个实数相等&#xff0c;则输出Yes&#xff0c;…...

【算法每日一练]-数论(保姆级教程 篇1 埃氏筛,欧拉筛)

目录 保证给你讲透讲懂 第一种&#xff1a;埃氏筛法 第二种&#xff1a;欧拉筛法 题目&#xff1a;质数率 题目&#xff1a;不喜欢的数 思路&#xff1a; 问题&#xff1a;1~n 中筛选出所有素数&#xff08;质数&#xff09; 有两种经典的时间复杂度较低的筛法&#xff0…...

【剑指offr--C/C++】JZ59 滑动窗口的最大值

一、题目 二、思路及代码 暴力解法是依次往后滑动一位&#xff0c;然后比较窗口内的值。 我这里考虑&#xff1a;窗口每次往后移动一位&#xff0c;那么如果当前窗口的最大值max在窗口内部&#xff0c;那么再滑动到下一个窗口的时候&#xff0c;窗口内只有最新进来的一个元素没…...

会员型网站/策划方案怎么做

2019独角兽企业重金招聘Python工程师标准>>> 处理部分WordPress核心代码或功能&#xff0c;让你的网站更快 http://www.wpdaxue.com/speed-up-wordpress.html 转载于:https://my.oschina.net/u/1260221/blog/421850...

沈阳做网站 熊掌号/十大看免费行情的软件下载

TextView一般都是用来显示一段文本&#xff0c;这里说的高级特性主要是一些我们平常不太常用的属性。包括文字阴影、自定义字体、html嵌入多格式、字体加粗、插入图片。这些特性平时开发APP的时候&#xff0c;可能一般使用不多&#xff0c;不过需要的时候却是很有用的特性。之所…...

昆明网站优化建设/《新闻联播》 今天

一、概述 本节将分析RxJava2的线程切换模型。通过对线程切换源代码的分析到达对RxJava2线程切换彻底理解的目的。通过对本节的学习你会发现&#xff0c;RxJava2线程切换是如此的简单&#xff0c;仅仅是通过两个操作符就能完成从子线程到主线程&#xff0c;或者主线程到子线程&a…...

网站 ip pv/seo查询seo优化

from keras.datasets import cifar10(x_train, y_train), (x_test, y_test) cifar10.load_data()# 如果不处理的话&#xff0c;每张图的每个通道都是 (0-255) 之间的取值 x_train[0]array([[[ 59, 62, 63],[ 43, 46, 45],[ 50, 48, 43],...,[158, 132, 108],[152, 125, …...

建设工程合同纠纷案例典型案例/百度seo排名主要看啥

自智能手机开始普及以来&#xff0c;充电宝就开始出现在公众的视野里充电宝与智能手机目前最影响智能手机使用体验的问题是电池续航问题&#xff0c;如果电池技术方面没有创新那么充电宝也必将一直伴随着智能手机充电宝电路板充电宝是使用内置的锂电池作为电源&#xff0c;通过…...

专做国际时事评论网站/网络营销具有哪些特点

比如像比较简单的关键词“交流”、“心得”并没有可供选择的选项&#xff0c;怎么办&#xff1f;而且输入后按确定也没有用。 解决方法 可以直接在输入后回车&#xff0c;然后确定。 更新20200330 本篇博客的关键词可见&#xff1a;...