【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
Spring的开发要点总结
文章目录
- 【JavaEE】Spring的开发要点总结(1)
- 1. DI 和 DL
- 1.1 DI 依赖注入
- 1.2 DL 依赖查询
- 1.3 DI 与 DL的区别
- 1.4 IoC 与 DI/DL 的区别
- 2. Spring项目的创建
- 2.1 创建Maven项目
- 2.2 设置国内源
- 2.2.1 勾选
- 2.2.2 删除本地jar包
- 2.2.3 reload
- 2.3 添加依赖
- 2.4 创建启动类
- 3. 将Bean对象存储到Spring(IoC容器)中
- 3.1 创建一个Bean对象
- 3.2 将Bean对象存储到Spring中
- 3.2.1 配置文件
- 3.2.2 包含一个bean标签
- 3.3 获取Bean对象并使用
- 3.3.1 获取Spring的上下文对象
- 3.3.2 通过Spring的上下文对象,获取一个指定的Bean对象
- 3.3.3 使用Bean对象
- 3.3.4 验证懒加载-两种获取Bean对象的方法的区别
【JavaEE】Spring的开发要点总结(1)
Spring的初步了解博客:【JavaEE】JavaEE进阶:框架的学习 - Spring的初步认识_s:103的博客-CSDN博客
就不带大家回顾了~
从框架获取的对象称为获取【Bean对象】!
Java是咖啡,Bean就是"咖啡豆",也就是“对象”
Spring项目开发就是 开业,放咖啡豆到罐子里,后续从罐子里拿咖啡豆,结合豆子用咖啡机做咖啡,咖啡给用户喝,的过程~
1. DI 和 DL
1.1 DI 依赖注入
在Spring项目中,DI通常指的是Dependency Injection(依赖注入)。Spring框架是一个使用DI作为核心思想的开源框架,它通过依赖注入的方式管理和注入对象之间的依赖关系。
指的是,在程序运行期间动态地将“依赖对象”获取到的过程

以Framework构造方法为例,需要一个依赖对象“bottom”,那么就在运行的时候,动态地在框架内部去查询到对应地Bean对象,然后赋值给bottom
这就是依赖的注入~
后面真正进入Spring代码的学习的时候,会有更好的理解!
1.2 DL 依赖查询
在Spring项目中,DL通常指的是Dependency Lookup(依赖查找)。Dependency Lookup 是一种在运行时通过容器来查找和获取依赖对象的方式。
DL与DI不同的最大一点就是,DL显式的去从框架内部获取Bean对象,然后自己去赋值给对应的对象:

后面真正进入Spring代码的学习的时候,会有更好的理解!
1.3 DI 与 DL的区别
- 静态与动态:
- DI 是在对象创建时将依赖注入到对象中
- 而DL 是在运行时通过容器查找和获取依赖对象。
- 控制权:
- DI 将控制权交给容器,在对象创建时由容器负责注入依赖对象
- 而 DL 则由代码显式调用容器的方法来获取依赖对象,控制权更多地在代码手中。
- 依赖关系的表达:
- DI 的依赖关系通过构造函数、Setter方法或注解等方式在类的定义中表达
- 而 DL 则需要在代码中显式地调用容器的方法来获取依赖对象。
- 灵活性:
- DI 可以更方便地进行单元测试和模拟依赖对象,因为依赖对象可以通过构造函数或 Setter 方法注入
- 而 DL 则需要运行时访问容器,不太适合在测试环境中进行模拟。
- 松耦合与紧耦合:
- DI 通过将依赖对象注入到类中实现了松耦合,对象不需要关心如何获取依赖
- 而 DL 则需要显式地调用容器方法来获取依赖,导致对象与容器之间紧密耦合。
后面真正进入Spring代码的学习的时候,会有更好的理解!
1.4 IoC 与 DI/DL 的区别
IoC是“目标”的一种思想,而IoC就是只是“指导原则”,“Spring的基本思想”
DI/DL则是“落实的方案”,就属于“Spring特点的具体实现”
IoC是控制权的反转,“向框架要对象”,那么Bean对象是怎么给我们的,就是DI/DL
接下来就要创建Spring项目了,(配置国内源哦,在上一篇文章中有提到~)
2. Spring项目的创建
2.1 创建Maven项目
Spring项目的基础就是Maven项目:

然后输入创建目录,确认:

2.2 设置国内源
2.2.1 勾选


- 以后的设置一并改了

2.2.2 删除本地jar包
之前留下的jar包很有可能,是你没有设置国内源,导致一些jar包不完整,导致后续无法重新向中央仓库下载这些jar包~


delete删除即可:

2.2.3 reload

耐心等待~
这个时间就差不多~

2.3 添加依赖
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency>
</dependencies>
- 建议把这些常用的依赖放在git上的代码片段上,方便获取

- 这里版本号后面是release也没问题~
- 因为国内源里确实存在~
添加的框架有 spring-context:spring 上下文,还有 spring-beans:管理对象的模块
2.4 创建启动类

项目的运行的就是main方法~
- 很多知识要到后面才能理解哦,一步步来!
3. 将Bean对象存储到Spring(IoC容器)中
3.1 创建一个Bean对象
一个Bean对象,无非就是java中的一个普通的类的一个实例罢了~

3.2 将Bean对象存储到Spring中
3.2.1 配置文件
这个时候就需要一个配置文件:
<?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>
- 直接复制过去即可

- resources就是放一些配置文件的~
- 取名规则:写实,直观,表达文件内容含义
爆红的话,reload一下~

3.2.2 包含一个bean标签
- id
- 将对象存储到IoC容器中的名字

- class
- 要存储到IoC中的Bean的完整路径

创建一个包

把UserService拖进去

默认是不分组的,去掉这个√,就分组了
而bean标签的class属性,就是类的路径~
- 包名.类名

两个对象~
这一步虽然看似我们将这个类的对象放进Spring中,但是只起到“声明”的作用~
因为IoC容器加载对象,如果是懒汉模式,即是非必要不加载,所以这一步就是声明,对象在容器中的“名字”和“位置”
所以代码在运行的过程中加载才会通过这个配置文件,将Bean放进容器中~
3.3 获取Bean对象并使用
获取和使用都在启动类的main方法中~
3.3.1 获取Spring的上下文对象
没有题词很正常,打出来就行了,然后导包
法1:ApplicationContext

- 用单词全称的好处就是,打错字会有提醒~
法2:BeanFactory

两种方式都能获取,区别在后面讲解~
上下文对象:
- 上下文(Context)在一般语境下指的是某个事件、问题或情况发生的背景和环境。它是指在特定的时间、地点或条件下所处的整体情况、状态或背景。
- 上下文对象是指在特定环境中包含了相关信息和状态的对象。它提供了在该环境中执行操作所需的上下文信息。
在这里的话,就是蕴含了容器存储的Bean对象的信息~
不好理解上下文对象,那你就理解成,IoC容器管理器~
3.3.2 通过Spring的上下文对象,获取一个指定的Bean对象

- 这里填的就是Bean对象的名字,也就是在配置文件中的id~
但是这个方法返回的结果是Object类型,需要强制类型转化:
或者,用类对象作为参数:
- 返回这个类的一个Bean对象

但是运行时错误:
字面意思就是,不唯一Bean定义异常
确实如此,有两个UserService的Bean对象
最好的一种方法就是,传两个参数,一个id,一个类对象:

3.3.3 使用Bean对象
public static void main(String[] args) {//1. 得到Spring的上下文对象ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring-config.xml");//2. 得到Bean
// UserService userService = (UserService) applicationContext.getBean("user");UserService userService = applicationContext.getBean("user", UserService.class);//3. 使用BeanuserService.sayHi();
}

3.3.4 验证懒加载-两种获取Bean对象的方法的区别
我们在UserService的构造方法上添上一笔

注释一些代码:

运行:

对于ApplicationContext,是一种全加载的方式

对于BeanFactory,则是一种懒加载的方式
所以我们在回答问题的时候要这样:
相同点:都是容器的管理对象,都能获取Bean对象
区别:
- ApplicationContext是BeanFactory的一个子类(子孙之一)
因此,ApplicationContext拥有更多的功能
- 国际化支持
- 资源访问支持
- 事件传播支持
- …
- 加载机制不同
- BeanFactory,比较老,在之前资源匮乏,所以要珍惜资源,所以懒加载可以节省资源
- 启动快,后期的获取慢
- ApplicationContext,则是现在资源不成问题,配置文件全部一起加载也无妨~
- 启动慢,后期的获取快
而以上IoC机制的实现,就是DL,依赖查找的方式,就是通过给定的配置文件,在配置文件中的beans里查找Bean对象的声明,找到对象并返回~
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!本文代码链接:SpringDemo1 · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)
可见,这样子做,获得一个对象太麻烦了,下一篇文章教你简单的存储和获取Bean对象,并且结合DI~
相关文章:
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结(1)1. DI 和 DL1.1 DI 依赖注入1.2 DL 依赖查询1.3 DI 与 DL的区别1.4 IoC 与 DI/DL 的区别 2. Spring项目的创建2.1 创建Maven项目2.2 设置国内源2.2.1 勾选2.2.2 删除本地jar包2.2.3 re…...
C#图片处理
查找图片所在位置 原理:使用OpenCvSharp对比查找小图片在大图片上的位置 private static System.Drawing.Point Find(Mat BackGround, Mat Identify, double threshold 0.8) {using (Mat res new Mat(BackGround.Rows - Identify.Rows 1, BackGround.Cols - Iden…...
php 开发微信 h5 支付 APIv3 接入超详细流程
✨ 目录 🎈 申请商户号🎈 申请商户证书🎈 设置V3密钥🎈 开通H5支付🎈 设置支付域名🎈 SDK 下载🎈 第一次下载平台证书🎈非第一次下载平台证书🎈 H5下单 🎈 申…...
HTML学习 第一部分(前端学习)
参考学习网站: 网页简介 (w3schools.com) 我的学习思路是:网站实践视频。 视频很重要的,因为它会给你一种开阔思路的方式。你会想,噢!原来还可以这样。这是书本或者网站教程 所不能教给你的。而且,对一些教程&#…...
python 实现串口指令通讯
上一篇文章文章写了串口数据的读取,这篇文章讲串口数据的写入(指令控制) 与下位机通信往往需要十六进制形式进行数据通信,根据设备串口通信指令文档进行指令通信,本篇以灯光控制为例: 1.pyserial模块封装…...
pytorch深度学习逻辑回归 logistic regression
# logistic regression 二分类 # 导入pytorch 和 torchvision import numpy as np import torch import torchvision from torch.autograd import Variable import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import matplotlib.pyplot as …...
数据仓库建设-数仓分层
数据仓库能够帮助企业做出更好的决策,提高业务效率和效益;在数据仓库建设时,绕不开的话题就是数仓分层。 一、数据分层的好处 1. 降低数据开发成本 通用的业务逻辑加工好,后续的开发任务可以基于模型快速使用,数据需…...
共享与协作:时下最热门的企业共享网盘推荐!
现代企业面临着越来越大的数据存储和共享压力。为了提高公司的生产力和效率,许多企业开始寻找共享网盘解决方案。这些共享网盘平台可以帮助企业集中管理文件和数据,并方便快速地与同事、客户或供应商共享。以下是几款好用的企业共享网盘。 Zoho Workdriv…...
mysql取24小时数据
MySQL是一种常用的关系型数据库管理系统。在进行实时数据处理时,我们常常需要查询最近24小时的数据来进行分析和处理。下面我们将介绍如何使用MySQL查询最近24小时的数据。 SELECT * FROM table_name WHERE timestamp_column > DATE_SUB(NOW(), INTERVAL 24 HOU…...
TCP/IP网络编程 第十五章:套接字和标准I/O
标准I/O函数的优点 标准I/O函数的两个优点 将标准I/O函数用于数据通信并非难事。但仅掌握函数使用方法并没有太大意义,至少应该 了解这些函数具有的优点。下面列出的是标准I/O函数的两大优点: □标准I/O函数具有良好的移植性(Portability) □标准I/O函数可以利用缓…...
SaleSmartly,客户满意度调查的绝对好助手
企业使用客户满意度调查来收集反馈并评估客户满意度水平,包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解,以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域…...
MySQL高阶语句
文章目录 一.常用查询1.按关键字排序(ORDER BY 语句)1.1 语法格式1.2 ASC和DESC的排序概念1.3 举例1.3.1 数据库有一张info表,记录了学生的id,姓名,分数,地址和爱好1.3.2 按分数排序,默认不指定…...
手机快充协议
高通:QC2.0、QC3.0、QC3.5、QC4.0、QC5.0、 FCP、SCP、AFC、SFCP、 MTKPE1.1/PE2.0/PE3.0、TYPEC、PD2.0、PD3.0/3.1、VOOC 支持 PD3.0/PD2.0 支持 QC3.0/QC2.0 支持 AFC 支持 FCP 支持 PE2.0/PE1.1 联发科的PE(Pump Express)/PE 支持 SFCP 在PP…...
centos 7升级gcc到10.5.0
目录 1、安装gcc 1.1、查看是否含有gcc及gcc版本 1.2、快速安装gcc 2、升级gcc 2.1、下载gcc源码包并解压缩 2.2、下载编译依赖项 2.3、新建gcc-bulid目录(与gcc-10.5.0同级)并进入该目录中 2.4、生成Makefile文件 2.5、开始编译 2.6、安装 2…...
从脚手架搭建到部署访问路程梳理
1、vue-cli 起文件: 2、配置 webpack :打包配置等,env文件( 处理线上和测试的ip), https://www.ibashu.cn/news/show_377892.html 3、样式:封装 style :组件(element-u…...
数据库应用:MySQL数据库SQL高级语句与操作
目录 一、理论 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 5.MySQL中6种常见的约束 二、实验 1.克隆表与清空表 2.SQL高级语句 3.SQL函数 4.SQL高级操作 5.主键表和外键表 三、总结 一、理论 1.克隆表与清空表 克隆表:将数据表的数据记录…...
xshell连接WSL2
1. 卸载 ssh server sudo apt-get remove openssh-server2. 安装 ssh server sudo apt-get install openssh-server3. 修改 ssh server 配置 sudo vim /etc/ssh/sshd_config需要修改以下几项: Port 2222 #默认的是22,但是windows有自己的ssh服务&am…...
Flask新手教程
Flask简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或…...
拼多多API接口,百亿补贴商品详情页面采集
电商API的数据类型 电商API提供的数据种类多样,一般可分为以下几类: 1.商品数据:商品ID、商品名称、商品价格、库存等。 2.交易数据:订单号、付款时间、收货人等。 3.店铺数据:店铺ID、店铺名称、开店时间、店铺评…...
C++入门(未完待续)
1.命名空间 使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员 ①.普通的命名空间 n…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...










