【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方法注入

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

在这里插入图片描述

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

在这里插入图片描述

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

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

相关文章

用html写一个爱心

<!DOCTYPE html> <html lang"zh-CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><title>爱您</title><style>* {padding: 0;margin: 0;}body {background-color: pin…

智慧公厕:提升城市管理效率,改善居民生活体验

智慧公厕作为城市基础设施的重要组成部分&#xff0c;正逐渐成为改善城市品质和提升居民生活体验的一项关键措施。通过智能化管理、数字化使用和信息化运行&#xff0c;智慧公厕不仅可以为城市居民带来更舒适便利的使用体验&#xff0c;而且对于城市的高质量发展、宜居性和包容…

Java快速入门系列-5(Java进阶特性)

第五章:Java进阶特性 5.1 多线程与并发编程5.1.1 多线程基础5.1.2 线程同步与锁5.1.3 线程间通信与协作5.1.4 线程池5.2 Java I/O流5.2.1 字节流与字符流5.2.2 缓冲流5.2.3 对象序列化与反序列化5.3 网络编程基础5.3.1 Socket编程5.3.2 NIO编程5.4 Java反射机制反射的基本用法…

使用 ChatGPT 创建在线课程:一步一步指南与提示模板

原文&#xff1a;Creating Online Courses with ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 谢谢 作为对你支持的感谢&#xff0c;随意定制本书中列出的任何提示&#xff0c;并将其作为你自己的重新销售。是的&#xff0c;对你免费。 它们都结构良好且用…

深入探索力扣第12题:整数转罗马数字的算法之旅

力扣&#xff08;LeetCode&#xff09;第12题“整数转罗马数字”提供了一个绝佳的学习机会&#xff0c;不仅让我们深入古罗马的数字系统&#xff0c;也锻炼了我们的编程技巧。一起看看其背后的逻辑。 罗马数字基础 罗马数字是一种古老的数字表示方法&#xff0c;广泛用于古罗…

linux安装和使用Rancher

linux安装和使用Rancher Rancher介绍请看如下博客 arm架构安装Rancher并导入k8s集群解决Error: no objects passed to apply 华为云arm架构安装k8s(kubernetes) linux下安装Rancher Rancher部署监控k8s集群状态等,比Dashboard插件强大 提前安装好K8S 在master上执行#如果…

【GFS】大数据技术的基石,分布式文件系统的鼻祖

目录 1.概述 1.1.分布式文件系统在大数据中的基石地位 1.1.谷歌当初面对的问题 1.2.谷歌如何解决这些问题的 1.数据量大&#xff0c;数据格式复杂&#xff0c;有大文件也有小文件 2.运行在普通机器上&#xff0c;失效是常态 2.系统架构 3.读操作 4.写操作 5.追加操作…

TiDB 社区智慧合集丨解码 TiDB 性能谜题:让你的数据库发挥最强动力!

来自社区&#xff0c;回归社区。非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会丨征集 TiDB 数据库性能优化大师&#xff0c;你是如何优化 TiDB 数据库性能的呐&#xff1f;】( https://asktug.com/t/topic/1005563 )里提供的各种性能优化方法。这篇帖子收集整理了大家推荐的…

STL库 —— string 类的编写

目录 一、成员函数 1.1 构造函数 1.1.1 无参构造 1.1.2 传参构造 1.1.3 优化 1.2 析构函数 1.3 拷贝构造函数 1.4 赋值运算符重载 二、容量成员 2.1 size 函数 2.2 capacity 函数 2.3 reserve 函数 2.3 resize 函数 2.4 clear 函数 三、元素访问成员 3.1 [] 的…

希尔排序解读

在算法世界中&#xff0c;排序算法是至关重要的一部分。而希尔排序&#xff08;Shell Sort&#xff09;作为一种基于插入排序的改进算法&#xff0c;通过允许交换非相邻元素&#xff0c;从而在一定程度上提高了排序效率。本文将深入探讨希尔排序的原理、实现方式以及它的性能特…

InternLM2-Chat-1.8B 模型测试

在interStudio进行InternLM2-Chat-1.8B模型访问&#xff0c;进入开发机后 配置基础环境 新建conda环境并且进入 conda create -n demo python3.10 -y conda activate demo 下载pytorch等相关包 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.…

力扣 76.最小覆盖子串

题目&#xff1a; 题目理解&#xff1a;这题属于最小滑动窗口。所求得的连续滑动窗口包含来t中的字符&#xff0c;不一定要按照t中的顺序。 class Solution {public String minWindow(String s, String t) {// table表示字符串t里的字符if (s null || s.length() 0 || t n…

ThingsBoaed、系统模块层级讲解

系统管理员能够使用租户配置文件为多个租户配置通用设置。每个租户在单个时间点都拥有唯一的个人资料。 让我们一一查看租户配置文件中的可用设置。 配置文件配置 这些设置允许系统管理员配置对租户创建的实体数量的限制&#xff0c;设置每月最大消息数、API 调用数的限制&…

Java集合详解(一)-- List集合

1.集合简介 java集合可分为Set、List、Queue和Map四种体系。 Java集合就像一种容器&#xff0c;可以把多个对象&#xff08;实际上是对象的引用&#xff0c;但习惯上都称对象&#xff09;“丢进”该容器中。从Java 5 增加了泛型以后&#xff0c;Java集合可以记住容器中对象的数…

02-JDK新特性-try-with-resources自动管理资源关闭

try-with-resources 为什么要介绍这个了 看看一下以下代码&#xff1a; public static void fileCopyByTryWithResources(File src, File des) throws IOException {try (FileInputStream fis new FileInputStream(src); FileOutputStream fos new FileOutputStream(des);…

SecureCRT防止超时自动断开

Options——>Session Options——>Terminal——>选择 Send protocol NO-OP ——>60seconds&#xff08;每一分钟发送一次请求&#xff09;

【考研数学】《1800》《660》还是《880》?怎么刷效果最好?

刷题吃不透&#xff0c;做了再多也没用&#xff01; 你目前连1800都没法拿下&#xff0c;你还着急要做660和880&#xff0c;是认真的吗&#xff1f; 这《接力题典1800》有啥特色呢&#xff1f;知识点全面覆盖&#xff0c;题目中规中矩&#xff0c;配合汤老师的视频看效果更佳…

【二分查找】Leetcode 二分查找

题目解析 二分查找在数组有序可以使用&#xff0c;也可以在数组无序的时候使用&#xff08;只要数组中的一些规律适用于二分即可&#xff09; 704. 二分查找 算法讲解 当left > right的时候&#xff0c;我们循环结束&#xff0c;但是当left和right缩成一个点的时候&#x…

【Java SE】继承与组合

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 再谈初始化2. 再谈protected关键字2.1 子类可见性2.2 访问修饰限定符的选择 3. 继承与组合 1. 再谈初始化…

Python实现获取某手视频评论【自动生成did】

今天在获取某手视频评论的时候&#xff0c;总是会出发风控导致web_did失效&#xff0c;就算登录了也没用&#xff0c;还会导致账号被风控&#xff0c;app端抓包和逆向难度又大&#xff0c;那么有没有一种不需要登录而且不会出发风控的方法来获取评论列表呢&#xff1f;当然有&a…