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

Spring IoC如何存取Bean对象

小王学习录

  • IoC(Inversion of Control)
    • 1. 什么是IoC
    • 2. 什么是Spring IoC
    • 3. 什么是DI
    • 4. Spring IoC的作用
  • 存储Bean对象
    • 1. 创建Bean
    • 2. 将Bean注册到Spring中.
  • 取Bean对象.
    • 1. 获取Spring上下文信息
      • 使用ApplicationContext和BeanFactory的区别
    • 2. 获取指定Bean对象

IoC(Inversion of Control)

1. 什么是IoC

Inversion of Control, 控制反转. 所谓控制, 就是控制对象的生命周期. 对象的生命周期由创建这个对象的类控制. 有时对控制权进行反转, 可以起到很好的编程效果, 从而完成特定的功能.

例如: 创建了一个对象, 称为对象1, 对象1要依赖于对象2, 对象2要依赖于对象3.

  1. 如果在对象1中创建对象2, 在对象2中创建对象3. (也就是对象3的控制权在类2中, 对象2的控制权在类1中)

  2. 当改变一个类的构造方法时, 如在构造方法中增加参数, 同时也需要对依赖这个类的类中的代码进行修改.

  3. 也就是如果此时要对类3的构造函数进行修改, 同时类2和类1中的构造函数也要进行修改. 这就造成了高耦合.

  4. 如果将创建对象的操作都在类1中进行, 也就是将控制权反转给类1, 那么此时如果要对类3的构造函数进行修改, 只需要对类1和类3的构造函数进行修改即可了.

2. 什么是Spring IoC

上面已经介绍了IoC控制反转, 所谓Spring IoC就是将控制权交给Spring, 即将对象的创建以及后续的管理(对象的生命周期交给Spring). 实际上IoC是Spring框架中的一个核心理念, 因此, Spring也可以看作是实现了IoC功能的容器(框架), 是一个包含了众多工具和方法的IoC容器.

Spring容器中用于存储JavaBean对象, 既然是容器, 就又有了两大核心功能, 即对象(Bean)的存和取.

3. 什么是DI

Dependency Injection, 依赖注入. 是将依赖的某个对象注入到当前类的行为.

DI依赖注入是一种技术, 而IoC是一种思想. Spring为IoC提供了容器. 而依赖注入是用于解决容器中取Bean的技术之一. 因此可以说DI是IoC的一种实现.

IoC(Inversion of Control)和DI(Dependency Injection)通常被认为是同一件事的不同表述,因为它们都涉及到将控制权从应用程序本身转移到外部容器,并通过容器来管理对象的创建、装配和生命周期。

在通过将对象之间的关系交给外部容器来实现解耦、可维护和可测试这件事中. IoC强调的是控制的反转,即应用程序不再控制对象的创建和生命周期,而是将这些任务交给外部容器。而DI强调的是依赖的注入,即对象不再负责自己依赖关系的创建,而是通过外部注入的方式获取依赖。

4. Spring IoC的作用

  1. Spring IoC通过控制反转的思想, 将对象的创建和管理交给了Spring, 实现了解耦
  2. 使用对象时更加方便. 程序员不必关注对象的创建以及这个对象背后的依赖关系, 而是直接向Spring容器中通过DI取对象, 当不需要再利用此对象时, 再交给Spring继续对对象进行管理即可.
  3. 创建对象更加高效. 对于一个类的实例来说, 不必再进行重复的创建操作, 而是由Spring创建(默认是单例的), 每当有程序要用到实例时, 直接从Spring中取即可.

存储Bean对象

spring作为一个容器, 要完成的两大核心功能是存储Bean对象和取出Bean对象.

存储Bean对象需要先创建Bean, 然后将Bean注册到Spring容器中.

1. 创建Bean

所谓Bean对象就是java中的普通对象. 在Spring中, 将被多次使用(取)的对象称为Bean对象. 创建Bean很简单, 和之前创建一个类的写法无异. 以下是创建一个简单的Bean

public class UseController {public void print(){System.out.println("do_useController");}
}

2. 将Bean注册到Spring中.

  1. 首先要在resources目录下创建一个spring配置文件(spring-config.xml).在配置文件中加入如下代码.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
  1. 将bean注册到spring中, 这一步也很简单. 在配置文件中加入如下代码
  <bean id="useController" class="com.annotation.UseController"></bean>

id是对象名, class是类的路径. 以上步骤就将useControoller这个Bean对象存储到Spring中了, 接下来我们看如何从Spring中吧Bean取出来.

取Bean对象.

取Bean对象分为以下两步:

  1. 获取Spring上下文信息. Bean对象交由Spring进行管理, 因此要想获取到Bean对象, 就需要先获取Spring上下文信息.
  2. 使用getBean方法获取Bean对象.

1. 获取Spring上下文信息

在获取Spring上下文信息时, 需要获取Spring的配置信息. 即xml文件.

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring-config.xml");

获取Spring上下文信息除了使用ApplicationContext外, 还可以使用BeanFactory, 如下代码

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("Spring-config.xml"));

使用ApplicationContext和BeanFactory的区别

继承关系和功能⽅⾯来说:Spring 容器有两个接⼝:BeanFactory 和
ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
从性能⽅⾯来说:ApplicationContext 是在Spring框架使用时⼀次性加载并初始化所有的 Bean对象, BeanFactory 是需要哪个才去加载哪个,因此更加轻量。

2. 获取指定Bean对象

获取指定Bean对象有以下三种写法:

UseController useController =(UseController) applicationContext.getBean("useController");
//这种方法不适于同一类有多个Bean对象的情况. 
//因为当同一类有多个Bean对象时, 不知道具体要获取UseController的哪个对象
UseController useController =applicationContext.getBean(UseController.class);
UseController useController =applicationContext.getBean("useController", UseController.class);



本篇文章到此结束, 下篇文章将具体介绍如何通过更简单的方式(基于注解)来存取Bean对象.

相关文章:

Spring IoC如何存取Bean对象

小王学习录 IoC(Inversion of Control)1. 什么是IoC2. 什么是Spring IoC3. 什么是DI4. Spring IoC的作用 存储Bean对象1. 创建Bean2. 将Bean注册到Spring中. 取Bean对象.1. 获取Spring上下文信息使用ApplicationContext和BeanFactory的区别 2. 获取指定Bean对象 IoC(Inversion …...

【开源】基于Vue.js的实验室耗材管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 081 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S081。} 文末获取源码&#xff0c;项目编号&#xff1a;S081。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗…...

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…...

量化交易怎么操作?量化软件怎么选择比较好?(散户福利,建议收藏)

一&#xff1a;量化的具体操作步骤是什么呢&#xff1f;1. 数据获取&#xff1a;索取和收集金融市场数据。 2. 策略制定&#xff1a;制定数量交易策略&#xff0c;这包括制定投资目标、建立交易规则和风险控制机制等&#xff0c;这个过程需要不断优化和更新。 3. 编写算法&am…...

什么是 AWS IAM?如何使用 IAM 数据库身份验证连接到 Amazon RDS(上)

驾驭云服务的安全环境可能很复杂&#xff0c;但 AWS IAM 为安全访问管理提供了强大的框架。在本文中&#xff0c;我们将探讨什么是 AWS Identity and Access Management (IAM) 以及它如何增强安全性。我们还将提供有关使用 IAM 连接到 Amazon Relational Database Service (RDS…...

Python从入门到精通七:Python函数进阶

函数多返回值 学习目标&#xff1a; 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示)&#xff0c;程序如何执行&#xff1f; 答&#xff1a;只执行了第一个return&#xff0c;原因是因为return可以退出当前函数&#xff0c;导致return下方的代码不执…...

uniapp踩坑之项目:使用过滤器将时间格式化为特定格式

利用filters过滤器对数据直接进行格式化&#xff0c;注意&#xff1a;与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为&#xff1a;2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…...

webpack学习-2.管理资源

webpack学习-2.管理资源 1.这章要干嘛2.加载css注意顺序&#xff01; 3.总结 1.这章要干嘛 管理资源&#xff0c;什么意思呢&#xff1f;管理什么资源&#xff1f;项目中经常会 导入各种各样的css文件&#xff0c;图片文件&#xff0c;字体文件&#xff0c;数据文件等等&#…...

658. 找到 K 个最接近的元素

658. 找到 K 个最接近的元素 Java代码&#xff1a;滑窗 class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {List<Integer> list new ArrayList<>();for (int i 0; i < arr.length; i) {arr[i] arr[i] - x;}for(i…...

十二、MapReduce概述

1、MapReduce &#xff08;1&#xff09;采用框架 MapReduce是“分散——>汇总”模式的分布式计算框架&#xff0c;可供开发人员进行相应计算 &#xff08;2&#xff09;编程接口&#xff1a; ~Map ~Reduce 其中&#xff0c;Map功能接口提供了“分散”的功能&#xff…...

shell条件测试

目录 1.1.用途 1.2.基本语法 1.2.1.格式: 1.2.2.例 1.3 文件测试 1.4.整数测试 1.4.1.作用 1.4.2.操作符 1.4.3.示例&#xff1a; 1.5.逻辑操作符 1.5.1.符号 1.5.2.例&#xff1a; 1.6.命令分隔符 1.1.用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&am…...

python在线读取传奇列表,并解析为需要的JSON格式

python在线读取传奇列表,并解析为需要的JSON格式,以下为传奇中使用的TXT列表格式, [Server] ; 使用“/”字符分开颜色,也可以不使用颜色,支持以前的旧格式,只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务器名称|服务器IP|服务器端…...

【docker 】 安装docker(centOS7)

官网 docker官网 github源码 官网 在CentOS上安装Docker引擎 官网 在Debian上安装Docker引擎 官网 在 Fedora上安装Docker引擎 官网 在ubuntu上安装Docker引擎 官网 在RHEL (s390x)上安装Docker引擎 官网 在SLES上安装Docker引擎 最完善的资料都在官网。 卸载旧版本 …...

智能网联汽车场景数据图像标注要求及方法

智能网联汽车场景数据图像标注要求及方法 1 范围 本标准规定了智能网联汽车场景数据图像中交通参与者、交通信号灯、交通标志、交通标线、可行驶区域、光照条件、遮挡截断情况7类元素的标注要求及方法。 本标准适用于智能网联汽车图像数据标注。 2 规范性引…...

四. 基于环视Camera的BEV感知算法-BEVFormer

目标 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. BEVFormerv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章—…...

gin投票系统3

对应视频v1版本 1.优化登陆接口 将同步改为异步 原login前端代码&#xff1a; <!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>香香编程-投票项目</title> </head> <body> <m…...

windows如何解决端口冲突(实用篇)

在项目设计中&#xff0c;环境配置成功点击运行瞬间&#xff0c;一大堆红爆出&#xff0c;8080端口占用&#xff0c;这个是很烦人的。。。 解决方式&#xff1a; 笨方法&#xff1a;一、查看所有端口实用情况&#xff08;挨个扫&#xff09; 按住【WINR】快捷键打开运行输入…...

「PPT 下载」Google DevFest Keynote | 复杂的海外网络环境下,如何提升连接质量

&#xff08;全网都在找的《社交泛娱乐出海作战地图》&#xff0c;点击获取&#x1f446;&#xff09; 12 月 10 日&#xff0c;“Google DevFest 2023 上海站”大会如期在上海市东方万国宴会中心举办。延续过往的技术交流碰撞、前沿技术学习基调传统&#xff0c;本届大会聚焦行…...

Logstash输入Kafka输出Es配置

Logstash介绍 Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据&#xff0c;并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志&#xff0c;但现在的功能已经远远超出这个范围。任何事件类型都可…...

Bash脚本处理ogg、flac格式到mp3格式的批量转换

现在下载的许多音乐文件是flac和ogg格式的&#xff0c;QQ音乐上下载的就是这样的&#xff0c;这些文件尺寸比较大&#xff0c;在某些场合使用不便&#xff0c;比如在车机上播放还是mp3格式合适&#xff0c;音质这些在车机上播放足够了&#xff0c;要求不高。比如本人就喜欢下载…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

AWS vs 阿里云:功能、服务与性能对比指南

在云计算领域&#xff0c;Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商&#xff0c;各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5]&#xff0c;我将从功能、服务和性能三个方面进行结构化对比分析&#…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...