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中创建对象2, 在对象2中创建对象3. (也就是对象3的控制权在类2中, 对象2的控制权在类1中)
当改变一个类的构造方法时, 如在构造方法中增加参数, 同时也需要对依赖这个类的类中的代码进行修改.
也就是如果此时要对类3的构造函数进行修改, 同时类2和类1中的构造函数也要进行修改. 这就造成了高耦合.
如果将创建对象的操作都在类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的作用
- Spring IoC通过控制反转的思想, 将对象的创建和管理交给了Spring, 实现了
解耦 - 使用对象时更加
方便. 程序员不必关注对象的创建以及这个对象背后的依赖关系, 而是直接向Spring容器中通过DI取对象, 当不需要再利用此对象时, 再交给Spring继续对对象进行管理即可. - 创建对象更加
高效. 对于一个类的实例来说, 不必再进行重复的创建操作, 而是由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中.
- 首先要在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>
- 将bean注册到spring中, 这一步也很简单. 在配置文件中加入如下代码
<bean id="useController" class="com.annotation.UseController"></bean>
id是对象名, class是类的路径. 以上步骤就将useControoller这个Bean对象存储到Spring中了, 接下来我们看如何从Spring中吧Bean取出来.
取Bean对象.
取Bean对象分为以下两步:
- 获取Spring上下文信息. Bean对象交由Spring进行管理, 因此要想获取到Bean对象, 就需要先获取Spring上下文信息.
- 使用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的实验室耗材管理系统
文末获取源码,项目编号: S 081 。 \color{red}{文末获取源码,项目编号:S081。} 文末获取源码,项目编号:S081。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗…...
Datawhale聪明办法学Python(task2Getting Started)
一、课程基本结构 课程开源地址:课程简介 - 聪明办法学 Python 第二版 章节结构: Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…...
量化交易怎么操作?量化软件怎么选择比较好?(散户福利,建议收藏)
一:量化的具体操作步骤是什么呢?1. 数据获取:索取和收集金融市场数据。 2. 策略制定:制定数量交易策略,这包括制定投资目标、建立交易规则和风险控制机制等,这个过程需要不断优化和更新。 3. 编写算法&am…...
什么是 AWS IAM?如何使用 IAM 数据库身份验证连接到 Amazon RDS(上)
驾驭云服务的安全环境可能很复杂,但 AWS IAM 为安全访问管理提供了强大的框架。在本文中,我们将探讨什么是 AWS Identity and Access Management (IAM) 以及它如何增强安全性。我们还将提供有关使用 IAM 连接到 Amazon Relational Database Service (RDS…...
Python从入门到精通七:Python函数进阶
函数多返回值 学习目标: 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示),程序如何执行? 答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执…...
uniapp踩坑之项目:使用过滤器将时间格式化为特定格式
利用filters过滤器对数据直接进行格式化,注意:与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为:2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…...
webpack学习-2.管理资源
webpack学习-2.管理资源 1.这章要干嘛2.加载css注意顺序! 3.总结 1.这章要干嘛 管理资源,什么意思呢?管理什么资源?项目中经常会 导入各种各样的css文件,图片文件,字体文件,数据文件等等&#…...
658. 找到 K 个最接近的元素
658. 找到 K 个最接近的元素 Java代码:滑窗 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 (1)采用框架 MapReduce是“分散——>汇总”模式的分布式计算框架,可供开发人员进行相应计算 (2)编程接口: ~Map ~Reduce 其中,Map功能接口提供了“分散”的功能ÿ…...
shell条件测试
目录 1.1.用途 1.2.基本语法 1.2.1.格式: 1.2.2.例 1.3 文件测试 1.4.整数测试 1.4.1.作用 1.4.2.操作符 1.4.3.示例: 1.5.逻辑操作符 1.5.1.符号 1.5.2.例: 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感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章—…...
gin投票系统3
对应视频v1版本 1.优化登陆接口 将同步改为异步 原login前端代码: <!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>香香编程-投票项目</title> </head> <body> <m…...
windows如何解决端口冲突(实用篇)
在项目设计中,环境配置成功点击运行瞬间,一大堆红爆出,8080端口占用,这个是很烦人的。。。 解决方式: 笨方法:一、查看所有端口实用情况(挨个扫) 按住【WINR】快捷键打开运行输入…...
「PPT 下载」Google DevFest Keynote | 复杂的海外网络环境下,如何提升连接质量
(全网都在找的《社交泛娱乐出海作战地图》,点击获取👆) 12 月 10 日,“Google DevFest 2023 上海站”大会如期在上海市东方万国宴会中心举办。延续过往的技术交流碰撞、前沿技术学习基调传统,本届大会聚焦行…...
Logstash输入Kafka输出Es配置
Logstash介绍 Logstash是一个开源的数据收集引擎,具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据,并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志,但现在的功能已经远远超出这个范围。任何事件类型都可…...
Bash脚本处理ogg、flac格式到mp3格式的批量转换
现在下载的许多音乐文件是flac和ogg格式的,QQ音乐上下载的就是这样的,这些文件尺寸比较大,在某些场合使用不便,比如在车机上播放还是mp3格式合适,音质这些在车机上播放足够了,要求不高。比如本人就喜欢下载…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...
