【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的区别

  1. 静态与动态
    • DI 是在对象创建时将依赖注入到对象中
    • 而DL 是在运行时通过容器查找和获取依赖对象。
  2. 控制权
    • DI 将控制权交给容器,在对象创建时由容器负责注入依赖对象
    • 而 DL 则由代码显式调用容器的方法来获取依赖对象,控制权更多地在代码手中。
  3. 依赖关系的表达
    • DI 的依赖关系通过构造函数、Setter方法或注解等方式在类的定义中表达
    • 而 DL 则需要在代码中显式地调用容器的方法来获取依赖对象。
  4. 灵活性
    • DI 可以更方便地进行单元测试和模拟依赖对象,因为依赖对象可以通过构造函数或 Setter 方法注入
    • 而 DL 则需要运行时访问容器,不太适合在测试环境中进行模拟。
  5. 松耦合与紧耦合
    • 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标签

  1. id
    • 将对象存储到IoC容器中的名字

在这里插入图片描述

  1. class
    • 要存储到IoC中的Bean的完整路径

在这里插入图片描述

创建一个包

在这里插入图片描述

把UserService拖进去

在这里插入图片描述

默认是不分组的,去掉这个√,就分组了

在这里插入图片描述

而bean标签的class属性,就是类的路径~

  • 包名.类名
    在这里插入图片描述

在这里插入图片描述
两个对象~

这一步虽然看似我们将这个类的对象放进Spring中,但是只起到“声明”的作用~

因为IoC容器加载对象,如果是懒汉模式,即是非必要不加载,所以这一步就是声明,对象在容器中的“名字”和“位置”

所以代码在运行的过程中加载才会通过这个配置文件,将Bean放进容器中~

3.3 获取Bean对象并使用

获取和使用都在启动类的main方法中~

3.3.1 获取Spring的上下文对象

没有题词很正常,打出来就行了,然后导包

法1:ApplicationContext

在这里插入图片描述

  • 用单词全称的好处就是,打错字会有提醒~

法2:BeanFactory
在这里插入图片描述

两种方式都能获取,区别在后面讲解~

上下文对象:

  1. 上下文(Context)在一般语境下指的是某个事件、问题或情况发生的背景和环境。它是指在特定的时间、地点或条件下所处的整体情况、状态或背景。
  2. 上下文对象是指在特定环境中包含了相关信息和状态的对象。它提供了在该环境中执行操作所需的上下文信息。

在这里的话,就是蕴含了容器存储的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对象

区别:

  1. ApplicationContext是BeanFactory的一个子类(子孙之一)

在这里插入图片描述

因此,ApplicationContext拥有更多的功能

  1. 国际化支持
  2. 资源访问支持
  3. 事件传播支持
  1. 加载机制不同
    • BeanFactory,比较老,在之前资源匮乏,所以要珍惜资源,所以懒加载可以节省资源
      • 启动快,后期的获取慢
    • ApplicationContext,则是现在资源不成问题,配置文件全部一起加载也无妨~
      • 启动慢,后期的获取快

而以上IoC机制的实现,就是DL,依赖查找的方式,就是通过给定的配置文件,在配置文件中的beans里查找Bean对象的声明,找到对象并返回~


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

本文代码链接:SpringDemo1 · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)

可见,这样子做,获得一个对象太麻烦了,下一篇文章教你简单的存储和获取Bean对象,并且结合DI~


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

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

相关文章

C++万字自学笔记

[TOC] 一、 C基础 C的IDE有CLion、Visual Studio、DEV C、eclipse等等&#xff0c;这里使用CLion进行学习。 0. C初识 0.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 #include <iostream>int main() {using namespace std;cout…

Vant源码解析(四)----Popup弹出层,详解样式方法

这个功能&#xff0c;自己也手写过&#xff0c;毕竟有很多弹窗的嘛。 我自己写就是&#xff1a;一个背景层&#xff0c;然后一个盒子里面放内容。再写个显示隐藏事件。够够的了。 Vant的Popup弹出层 页面结构 短短一个背景加内容盒子&#xff0c;vant套了几层。 这是引用的组件…

数据结构单向循环链表,创建以及增删改查的实现

一、单向循环链表的描述 循环链表&#xff1a;是另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头节点&#xff0c;整个链表形成一个环。 单向循环链表的操作和单链表操作基本一致&#xff0c;差别在于&#xff1a;当链表遍历时&#xff0c;判别当前指针p是…

vue+element Cascader 级联选择器 > 实现省市区三级联动

vueelement Cascader 级联选择器 > 实现省市区三级联动 先看下实现效果吧&#xff08;嘻嘻&#xff09; 看完我们就开始啦 安装element-china-area-data1 npm install element-china-area-data5.0.2 -S上代码 <el-cascadersize"large":options"options…

CRC校验原理全面解读

目录 1. 简介2. 原理2.1 CRC的发送与接收2.2 CRC校验码的生成2.3 CRC校验码的校验 3. 拓展问题3.1 模2除法为什么等同于异或运算&#xff1f;3.2 为什么除数的位数和被除数补充的位数相差为1&#xff1f;3.3 为什么CRC校验码不能纠正错误&#xff0c;只能检测错误&#xff1f; …

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …

会员管理系统如何深度绑定用户?会员系统必备哪些功能?

在以消费者为主导的企业&#xff08;商家&#xff09;范围内&#xff0c;实行会员制管理能够更好的提升客户的忠诚度&#xff0c;减少客户的流失。完整、精确的会员管理系统&#xff0c;更能提升企业&#xff08;商家&#xff09;的实际效益。 蚓链会员管理系统(专业版) 便是这…

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示&#xff0c;可能是没有包含头文件 在运行时&#xff0c;报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码&#xff1a;设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

Centos7安装Docker

Centos7安装Docker 目录 环境准备 安装Docker 启动Docker 切换源 启动第一个容器 环境准备 切换root权限 su root 升级所有包同时也升级软件和系统内核 yum -y update 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine 卸载旧版本 yum rem…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…

Java读取Excel 单元格包含换行问题

Java读取Excel 单元格包含换行问题 需求解决方案 需求 针对用户上传的Excel数据&#xff0c;或者本地读取的Excel数据。单元格中包含了换行&#xff0c;导致读取的数据被进行了切片。 正常读取如下图所示。 解决方案 目前是把数据读取出来的cell转成字符串后&#xff0c;…

Flask新手教程

Flask简介 Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发&#xff0c;开发人员分工合作&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或…

迭代器模式:相比直接遍历集合数据,使用迭代器有哪些优势?

今天&#xff0c;我们学习另外一种行为型设计模式&#xff0c;迭代器模式。它用来遍历集合对象。不过&#xff0c;很多编程语言都将迭代器作为一个基础的类库&#xff0c;直接提供出来了。在平时开发中&#xff0c;特别是业务开发&#xff0c;我们直接使用即可&#xff0c;很少…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

文章目录 一、简介1、BeanFactoryPostProcessor2、BeanPostProcessor 二、BeanFactoryPostProcessor 源码解析1、BeanDefinitionRegistryPostProcessor 接口实现类的处理流程2、BeanFactoryPostProcessor 接口实现类的处理流程3、总结 三、BeanPostProcessor 源码解析 一、简介…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…

【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

创建项目 下图为初始化的项目的文件结构 引入组件 俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”&#xff0c;为了更加方便地开发出页面较为美观的小程序&#xff0c;我们先引入成熟的UI组件&#xff0c;再开始开发之旅。&#xff08;如果你是前端高手&#xff0…