【Spring】IoC和DI,控制反转,Bean对象的获取方式

news2024/12/12 18:31:54

  8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:什么是IoC

1:什么是容器

2:什么是IoC

二:IoC应用举例  

1:理解控制反转

2:理解控制反转容器

3:IoC容器优点

(1)资源集中管理

(2)解耦合

三:什么是DI

四:Bean

1:Bean对象

2 :Bean的存储

3:Bean的名称

(1)小驼峰命名

(2)原始命名

4:Bean的类型

5:Bean来源于BeanFactory

6:上下文

五:类注解

1:@Controller

(1)控制器存储

(2)根据类型获取对象

(3)运行结果

(4)根据bean命名获取Bean对象

(5)根据bean类型+名称获取Bean对象


一:什么是IoC

通过前面的学习,我们了解到Spring是一个含有多种工具和方法的IoC容器,那么什么是容器,神什么是IoC容器呢?

1:什么是容器

回想我们学过的集合List<>  Map<>  这就是数据存储容器,Tomcat就是Web容器

2:什么是IoC

IoC是 Inversion of Control 的缩写,译为“控制反转”,在以前我们需要某个对象的时候,就new一个对象,但是现在我们可以把对象交给Spring来管理,当我们需要对象的时候,Spring来new,我们只需要注入(DI)即可,所以Spring有时也被成为Spring容器

二:IoC应用举例  

在传统的代码中对象创建顺序是:Car->Framework->Bottom->Tire
改进之后解耦的代码的对象创建顺序是:Tire->Bottom->Framework->Car
 

1:理解控制反转

改进之后的控制权发⽣反转,不再是使⽤⽅对象创建并控制依赖对象了,⽽是把依赖对象注⼊将当前对象中,依赖对象的控制权不再由当前类控制了.

这样的话,即使依赖类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,
 

2:理解控制反转容器

这部分代码,就是IoC容器做的⼯作
 

3:IoC容器优点

(1)资源集中管理

IoC容器会帮我们管理⼀些资源(对象等),我们需要使⽤时,只需要从IoC容器中去取就可以了
 

(2)解耦合

我们在创建实例的时候不需要了解其中的细节,降低了使⽤资源双⽅的依赖程度,也就是耦合度.

三:什么是DI

DI:Dependency Injection(依赖注⼊)

程序运⾏时需要某个资源,此时容器就为其提供这个资源
比如我需要Student对象,IoC容器就为我new一个Student对象

IoC是⼀种思想,⽽DI就属于具体的实现

概念清楚了,下面我们来学习一下如何使用IoC和DI吧

四:Bean

1:Bean对象

Spring被称为IoC控制反转容器,(即把对象的控制权交给Spring来管理,这里的控制权包括对象的创建和销毁)它所具备的两个核心功能就是:存和取

我们把存入Spring容器中的对象叫做“Bean”对象。

2 :Bean的存储

通过以前的学习,我们知道比如有一个class Student{}类,我们想要实例化的话需要这么一行代码

Student student = new Student();

但是现在我们只需要引入注解就可以达到这样的目的

这里共有两类注解可以实现

①类注解:@Controller 、 @Service 、 @Repository 、 @Component 、@Configuration

②方法注解:@Bean

3:Bean的名称

我们不需要为bean对象指定名称,Spring会帮我们自动生成

(1)小驼峰命名

Bean命名约定,以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写,⽐如
类名:UserController,Bean的名称为:userController
类名:AccountManager,Bean的名称为:accountManager

(2)原始命名

特殊情况,第⼀个和第⼆个字符都是⼤写时,将保留原始的⼤⼩写,比如

类名:UController,Bean的名称为:UController
类名:AManager,Bean的名称为:AManager

4:Bean的类型

为类名.class  比如

Student.class

5:Bean来源于BeanFactory

ApplicationContext获取bean对象的功能,是父类BeanFactory提供的功能

常⽤的是1,2,4,这三种⽅式,获取到的bean是⼀样的,可以打印地址测试,下面的@Controller注解举例中自行测试哈

public interface BeanFactory {
   
    // 1. 根据bean名称获取bean
    Object getBean(String var1) throws BeansException;

    // 2. 根据bean名称和类型获取bean
    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    // 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的bean
    Object getBean(String var1, Object... var2) throws BeansException;

    // 4. 根据类型获取bean
    <T> T getBean(Class<T> var1) throws BeansException;

    // 5. 按bean类型和构造函数参数动态创建bean, 只适⽤于具有原型(prototype)作⽤域的bean
    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
    
}

6:上下文

ApplicationContext翻译过来就是:Spring上下⽂
因为对象都交给Spring管理了,所以获取对象要从Spring中获取,那么就得先得到Spring的上下⽂

五:类注解

1:@Controller

(1)控制器存储

@Controller // 将对象存储到 Spring 中
public class UserController {
    public void sayHi(){
        System.out.println("hi,UserController...");
    }
}

(2)根据类型获取对象

如何从Spring容器中获取对象呢?

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
//获取Spring上下⽂对象
        ApplicationContext context =
        SpringApplication.run(SpringIocDemoApplication.class, args);
//从Spring上下⽂中获取对象
        UserController userController = context.getBean(UserController.class);
//使⽤对象
        userController.sayHi();
    }
}

(3)运行结果

(4)根据bean命名获取Bean对象

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
//获取Spring上下⽂对象
        ApplicationContext context =
        SpringApplication.run(SpringIocDemoApplication.class, args);
//根据bean名称, 从Spring上下⽂中获取对象,返回的是Object类型需要强转
        UserController userController2 = (UserController)context.getBean("userController");
//使⽤对象
        userController.sayHi();
    }
}

(5)根据bean类型+名称获取Bean对象

@SpringBootApplication
public class SpringIocDemoApplication {
    public static void main(String[] args) {
//获取Spring上下⽂对象
        ApplicationContext context =
        SpringApplication.run(SpringIocDemoApplication.class, args);
//根据bean名称+类型, 从Spring上下⽂中获取对象
        UserController userController3 = context.getBean("userController",UserController.class);
//使⽤对象
        userController.sayHi();
    }
}

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

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

相关文章

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励&#xff1a;“请给自己一个鼓励说&#xff1a;Jack我很棒&#xff01;—Jack” 绪论​&#xff1a; 本章是TCP/IP网络协议层的完结篇&#xff0c;本章将主要去补充一些重要的协议和了解一些网络中常见的名词&#xff0c;具体如&#xff1a;DNS、ICMP、NAT、代理服务器…

离屏渲染概述

我们知道&#xff0c;图像的处理基本都是在GPU中进行&#xff0c;然后GPU将渲染的结果放入当前渲染屏幕的帧缓冲区中&#xff0c;视频控制器取出里面的内容&#xff0c;在屏幕上进行显示。那么有没有什么情况&#xff0c;会因为某些限制&#xff0c;GPU无法将全部的渲染结果直接…

探索 Python 应用的分层依赖:解决 Linux 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖&#xff1a;解决 Linux 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖&#xff1a;安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整…

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

声明 因为这份文档我是边做边写的&#xff0c;遇到问题重新装了好几次所以IP会很乱 ESXI主机为192.168.20.10 VCSA为192.168.20.7&#xff0c;后台为192.168.20.7:5480 后期请自行对应&#xff0c;后面的192.168.20.57请对应192.168.20.7&#xff0c;或根据自己的来 第一阶段…

Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播

技术背景 好多开发者&#xff0c;希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务&#xff0c;然后低延迟播放出来。简单来说&#xff0c;在Unity 中实现采集 Camera 场景并推送RTMP的话&#xff0c;先是获取 Camera 场景数据&#xff0c;通过创建 RenderTex…

指令周期流程图

例题一 例题二 例题三

使用C#通过ColorMatrix对象为图像重新着色

此示例产生了一些令人印象深刻的结果&#xff0c;但实际上非常简单。 它使用其他几个示例演示的 ImageAttribute 技术来快速操作图像的颜色。 下面的AdjustColor方法启动图像着色的过程。 // Adjust the images colors. private Image AdjustColor(Image image) {// Make the …

SQL 在线格式化 - 加菲工具

SQL 在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果

AI作图效率高,亲测ToDesk、顺网云、青椒云多款云电脑AIGC实践创作

一、引言 随着人工智能生成内容&#xff08;AIGC&#xff09;的兴起&#xff0c;越来越多的创作者开始探索高效的文字处理和AI绘图方式&#xff0c;而云电脑也正成为AIGC创作中的重要工具。相比于传统的本地硬件&#xff0c;云电脑在AIGC场景中展现出了显著的优势&#xff0c;…

【密码学】SM4算法

一、 SM4算法简介 SM4算法是中国国家密码管理局于2012发布的一种分组密码算法&#xff0c;其官方名称为SMS4&#xff08;SMS4.0&#xff09;&#xff0c;相关标准为GM/T 0002-2012《SM4分组密码算法》。SM4算法的分组长度和密钥长度均为128比特,采用非平衡Feistel结构。采用32…

Proteus(8.15)仿真下载安装过程(附详细安装过程图)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么&#xff1f; 二、下载链接 三、下安装步骤 1.解压&#xff0c;有键管理员运行 2.点击Next&#xff0c;进行下一步 3.勾选I accept…&#…

【工业机器视觉】基于深度学习的水表盘读数识别(4-训练与预测)

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)&#xff08;3&#xff09;-CSDN博客 训练与预测 Ultralytics YOLO指的是由Ultralytics公司开发的一系列基于YOLO&#xff08;You Only Look Once&#xff09;架构的目标检测算法。YOLO是一种实时目标检测系统&#xff0c;它…

AlphaPose、yolov8Pose、RTMPose进行对比

一、Alphapose 参考&#xff1a; https://blog.csdn.net/m0_45850873/article/details/123939849

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID&#xff0c;它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能&#xff0c;还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID&#xff1f; 在 MongoDB …

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则,并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描:对代码源文件按照一定的规则进行扫描,来发现一些潜在的问题或者风险,因为不涉及代码运行,所以其一般只是发现一些规范或则一些质量问题,当然这些可能存在潜…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway&#xff1a;一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步&#xff1a;查看源码第二步&#xff1a;启动类迁移第三步&#xff1a;引入 Gateway 依赖第四步 编写bootstrap.yaml第五步&#xff1a;替换路由配置第六步&#…

centos部署SkyWalking并在springcloud项目中用法举例

文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java Agent springCloud 使用举例 场景 SkyWalking是应用性能监控平台&#xff0c;可用于分布式系统…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆&#xff0c;用以运送各种汽油、柴油、原油等油品&#xff0c;运输危险系数大&#xff0c;而且由于油罐车需要经常行驶在城区道路&#xff0c;为城市各个加油站点、企业工厂运输补充所需油料&#xff0c;因此也是危化品运输车辆的重点监测和管控对象…

【总结·反思·汇报·思考02】裸辞后,我的一些感想和感悟。

Hello&#xff0c;大家好&#xff01; 首先&#xff0c;我需要向大家道个歉&#xff0c;对不起&#xff01;因为最近发生了一些事情&#xff0c;博客文章一直没有更新。&#xff08;90度鞠躬道歉&#xff09; 那么&#xff0c;最近到底发生了什么呢&#xff1f;相信大家已经从…

李宏毅机器学习-局部最小值与鞍点

一、Optimization Fails because …… 1&#xff0e; 问题 在optimization时&#xff0c;training的loss不会再下降&#xff0c;但是我们对loss并不满意。不管我们怎么更新参数&#xff0c;loss都不会掉下来。 2&#xff0e; 原因&#xff1a;critical point&#xff08;gra…