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

ops/2024/12/12 6:53:53/

  8e19eee2be5648b78d93fbff2488137b.png

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

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

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

目录

IoC-toc" style="margin-left:0px;">一:什么是IoC

1:什么是容器

IoC-toc" style="margin-left:40px;">2:什么是IoC

IoC%E5%BA%94%E7%94%A8%E4%B8%BE%E4%BE%8B%C2%A0%C2%A0-toc" style="margin-left:0px;">二:IoC应用举例  

1:理解控制反转

2:理解控制反转容器

IoC%E5%AE%B9%E5%99%A8%E4%BC%98%E7%82%B9-toc" style="margin-left:40px;">3:IoC容器优点

(1)资源集中管理

(2)解耦合

DI-toc" style="margin-left:0px;">三:什么是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">一:什么是IoC

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

1:什么是容器

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

IoC">2:什么是IoC

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

IoC%E5%BA%94%E7%94%A8%E4%B8%BE%E4%BE%8B%C2%A0%C2%A0">二:IoC应用举例  

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

1:理解控制反转

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

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

2:理解控制反转容器

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

IoC%E5%AE%B9%E5%99%A8%E4%BC%98%E7%82%B9">3:IoC容器优点

(1)资源集中管理

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

(2)解耦合

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

DI">三:什么是DI

DI:Dependency Injection(依赖注⼊)

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

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

概念清楚了,下面我们来学习一下如何使用IoCDI

四: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注解举例中自行测试哈

java">public interface BeanFactory {// 1. 根据bean名称获取beanObject getBean(String var1) throws BeansException;// 2. 根据bean名称和类型获取bean<T> T getBean(String var1, Class<T> var2) throws BeansException;// 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的beanObject 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)控制器存储

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

(2)根据类型获取对象

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

java">@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对象

java">@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对象

java">@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.ppmy.cn/ops/141185.html

相关文章

在ensp中ACL路由控制实验

一、实验目的 掌握ACL路由控制管理 二、实验要求 要求&#xff1a; 配置路由策略&#xff0c;左右两边不公开区域对方不可达&#xff0c;其他区域可以互相ping通 设备&#xff1a; 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…

iOS 语音循环播放设置

本地文件、网络文件&#xff0c;区别就是URL创建方式 1、使用AVPlayerItem与AVPlayer&#xff08;这个简单&#xff0c;只需要设置回调&#xff09;&#xff0c;而不是AVAudioPlayer&#xff08;这个麻烦&#xff0c;需要设置代理、计时器等等&#xff09; 2、设置AVPlayerIte…

【青牛科技】D2068是一块单卡收录机用前置放大电路,内含卡拉0K混合放大电路,内置源选择功能开关。可以用于收录机等产品中

概述&#xff1a; D2068是一块单卡收录机用前置放大电路&#xff0c;内含卡拉0K混合放大电路&#xff0c;内置源选择功能开关。 主要特点&#xff1a; ● 双通道 ● 内置EQ放大器、REC放大器、监控放大器、MC(混频)放大器 ● MC放大器同时适用于内部MIC和混频MIC ● 内置源选…

力扣-图论-8【算法学习day.58】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

ansible学习笔记之02command模块与shell模块

目录 1、概述 2、模块介绍 2.1 command模块 2.2 shell模块 2.3 小结 3、实验 3.1 测试ls命令 3.2 测试环境变量 3.3 测试操作符">" 1、概述 本文介绍ansible的command模块与shell模块&#xff0c;并通过实验比对两个模块的异同。 2、模块介绍 2.1…

golang——Gin框架及路由介绍

一. 框架介绍 Gin是一个轻量级的Go语言Web框架&#xff0c;它具有高性能和简洁的设计。由于其快速的路由匹配和处理性能&#xff0c;Gin成为Go语言中最受欢迎的Web框架之一。 特点&#xff1a; 快速和轻量&#xff1a;Gin框架的设计注重性能和效率&#xff0c;采用了一些优化…

http网络服务-swift-Alamofire

依赖库的github地址 http网络库 Alamofire 解json SwiftyJSON Swift Package Manager集成依赖库 https://github.com/Alamofire/Alamofire.githttps://github.com/emqx/CocoaMQTT.git使用 import Alamofire import SwiftyJSONvar http "http://xxxxxxxx" var p…

信息系统项目管理-里程碑范例

序号里程碑名称计划完成时间实际完成时间是否完成备注1项目计划确定2023.8.302023.8.25完成2需求说明书完成2023.10.302023.10.29完成3软件详细设计方案完成2023.11.132023.11.10完成4硬件详细设计方案完成2023.12.102023.12.12完成5提交系统测试报告2024.4.302024.4.28完成6提…