Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(已更完)
  • Spring(正在更新…)

在这里插入图片描述

上节进度

上节我们完成了 启动 IoC 容器 的部分。下面我们续接上节的内容,继续后续的内容。

纯 XML 模式

采用 Spring IoC 和 纯 XML 模式改造之前的 IoC 和 AOP 的实现。

准备工作

我们移除之前 beans.xml 文件,新增:

  • applicationContext.xml

创建 Bean 三种方式

之前我们是通过 beans.xml 文件,配合 BeanFactory 来完成对 Bean 的初始化等配置,接下来,我们将使用 Spring 框架来进行配置。
我们在 applicationContext 中配置 bean 之后, 将 Bean 交给 Spring 进行管理。

使用无参构造

在默认情况下,它会通过反射调用无参构造函数来创建对象,如果类中没有无参构造函数,将构建失败。

<bean id="wzkTransferService" class="wzk.service.impl.WzkTransferServiceImpl"></bean>

对应的截图如下所示:
在这里插入图片描述

使用静态方法

在实际开发中,我们使用的对象有些时候并不是直接通过构造函数可以创建出来的,它可能在创建的过程中会有很多额外的操作,此时会提供一个创建对象的方法,恰好这个方法是 static 修饰的。
例如,我们 JDBC 的时候,会用到 java.sql.Connection 接口的实现类,如果是 MySQL 数据库,那么用就是 JDBC4Connection,但是我们不会写 JDBC4Connection connection = new JDBC4Connection(),我们要注册驱动,还要提供 URL 等信息。

在实际的开发过程中,尤其早期我们没有使用 Spring 框架来管理和创建对象,但是设计的过程中,使用了工厂模式进行解耦,那么当接入 Spring 之后,就可以采用这种方式了。

我们先放写法:

<bean id="transferService" class="wzk.factory.BeanFactory" factory-method="getTransferService"></bean>

比如说我们有一个单例模式的类,为了保证安全,做了很多操作,而且比如 getInstance() 方法是 static 的。此时用无参构造也是不可行的(private 构造方法),那么我们就需要一个 factory-method 来获取当中的对象。

使用实例化方法创建

此种方法和上面静态方法创建其实类似,区别是用于获取对象的方法不再是static 方式修饰了,而是类中的一个普通的方法,此方法比静态方法创建的几率要高一些。
在早期的项目中,工厂中的方法也可能是静态的,也可能是非静态的,当时非静态的方法的时候,可以采用下面的配置方式:

<bean id="beanFactory" class="wzk.factory.BeanFactory"></bean>
<bean id="transferService" factory-bean="beanFactory" factory-method="getTransferService"></bean>

Bean 的生命周期

作用范围改变

在 Spring 框架管理 Bean 对象的创建时,Bean 对象默认都是单例的,但是它支持配置方式改变作用范围,作用范围官方提供的说明如下图:
在这里插入图片描述
在上图中提供的这些选项中,我们实际开发中用的最多的就是 Singleton(单例模式)和 prototype(原型模式,也叫多例模式)。

<!--配置service对象-->
<bean id="wzkTransferService"
class="wzk.service.impl.WzkTransferServiceImpl" scope="singleton"></bean>

不同作用范围的生命周期

单例模式:singleton

  • 对象初始化:创建容器时,对象就被创建了
  • 对象生存:只要容器存在,对象一直活着
  • 对象死亡:当容器销毁时,对象就被销毁了
  • 一句话总结:单例模式的 bean 对象生命周期与容器相同

多例模式:prototype

  • 对象初始化:当使用对象的时候,创建新的对象实例
  • 对象生存:只要对象在使用中,就一直活着
  • 对象死亡:当对象长时间不用时,被 Java 的垃圾回收器回收了
  • 一句话总结:多例模式 bean 对象,Spring 框架只负责创建,不负责销毁

Bean 标签属性

在基于 XML 的 IoC 配置中,Bean 标签是基础的标签,它表示了 IoC
容器中的一个对象,换句话说,如果一个对象让 Spring 管理,在 XML 的配置中都需要使用此标签配置,Bean 标签的属性如下:

  • id 属性:用于给 bean 提供一个唯一标识,在一个标签内部,标识必须唯一。
  • class 属性:用于指定创建 Bean 对象的全限定类名
  • name 属性:用于给 Bean 提供一个或者多个名称,多个名称和空格分隔
  • factory-bean 属性:用于指定创建当前 Bean 对象的工厂 Bean 的唯一标识,当指定了此属性之后,class 属性失效
  • factory-method 属性:用于指定创建当前 bean 对象的工厂方法,如配置 factory-bean 属性使用,则 class 属性失效,如配合 class 属性使用,则方法必须是 static 的。
  • scope 属性:用于指定 bean 对象的作用范围,通常情况下就是 singleton,当用到多例模式的时候,可以配置 prototype。
  • init-method 属性:用于指定 bean 对象的初始化方法,此方法会在 bean 对象装配后调用,必须是一个无参方法。
  • destory-method 属性:用于指定 bean 对象的销毁方法,此方法 bean 对象销毁前执行,它只能为 scope 是 singleton 时起作用。

DI注入的XML配置

按照注入的方式分类

  • 构造函数注入:顾名思义,就是利用带参构造函数实现对类成员的数据赋值
  • set 方式注入:它是通过类成员的 set 方法实现数据的注入(使用最多的)

按照注入的数据类型分类

  • 基本类型和 String:注入的数据类型是基本类型或者字符串类型的数据
  • 其他 Bean 类型:注入的数据类型如果是对象类型的,称为其他 Bean 的原因是,这个对象要求出现在 IoC 容器中,那么对于当前 Bean 来说,就是其他的 Bean 了
  • 复杂类型(集合类型):注入的数据类型是 Array,List,Set,Map,Properties 中的一种类型。

构造函数注入

构造函数注入,顾名思义,就是利用构造函数实现对类成员的赋值,它的使用要求是,类中提供的构造函数参数个数必须和配置的参数个数一致,且数据类型匹配。
同时需要注意的是,当没有参数构造时,则必须提供构造函数的注入,否则 Spring 框架会报错。
(代码用之前的)
我们这里可以看看例子,首先我的 WzkTransferServiceImpl 中依赖了 wzkAccountDao,但是我们的代码中,只提供了 set 的方法,而没有提供构造方法。
具体代码在这里:

private WzkAccountDao wzkAccountDao;public void setWzkAccountDao(WzkAccountDao wzkAccountDao) {this.wzkAccountDao = wzkAccountDao;System.out.println("set setWzkAccountDao: " + wzkAccountDao);
}

对应的截图如下所示:
在这里插入图片描述
而此时,我们在 applicationContext.xml 中,配置了构造器的注入方式:

<!-- 配置 Bean --><bean id="wzkTransferService" class="wzk.service.impl.WzkTransferServiceImpl"><constructor-arg name="wzkAccountDao" ref="wzkAccountDao"></constructor-arg></bean>

我们可以看到已经提示了,没有构造器的话 Spring 是会报错的:
在这里插入图片描述

在使用构造函数注入时,涉及的标签时 construct-arg,该标签有 如下的属性:

  • name:用于构造函数中指定名称的参数赋值
  • index:用于给构造函数中指定索引位置的参数赋值
  • value:用于指定基于类型或者 String 类型的数据
  • ref:用于指定其他 Bean 类型的数据,写的是其他 Bean 的唯一标识

Set 方法注入

利用提供的 setXxxx 方法来通过赋值的方式实现注入。
编写的 XML 如下:

<bean id="wzkAccountDao" class="wzk.dao.WzkAccountDao"></bean><!-- 配置 Bean --><bean id="wzkTransferService" class="wzk.service.impl.WzkTransferServiceImpl"><!-- 构造器注入 --><!-- <constructor-arg name="wzkAccountDao" ref="wzkAccountDao"></constructor-arg> --><!-- set方法注入 --><!-- ref 引入对象 --><property name="wzkAccountDao" ref="wzkAccountDao"></property><!-- value 是插入值 --><property name="name" value="wzkicu"></property></bean>

对应的截图如下所示,同样的,如果属性不存在的话,会报错:
在这里插入图片描述
在使用 set 方法注入时,需要使用 property 标签,该标签属性如下:

  • name:指定注入时调用的 set 方法名称
  • value:指定注入的数据,它支持基本类型和 String 类型
  • ref:指定注入的数据,它支持其他 bean 类型,写的是其他 bean 的唯一标识

在复杂数据类型注入的时候,指的是集合类型的数据,集合分为两类:

  • List 结构
  • Map 结构

接下来就是注入的方式的选择,只能在构造函数和 set 方法中选择,我们的示例选用 set 方法注入。
在这里插入图片描述
在 List 结构的集合数据注入时,array、list、set 这三个标签通用,另外注值value 标签内部可以直接写值,也可以使用 bean 标签配置一个对象,或者用 ref 标签应用一个已经配合的 bean 的唯一标识。

在 Map 结构的集合数据注入时,map 标签使用 entry 子标签实现数据注入,entry 标签可以使用 key value 属性指定存入 map 中的数据。使用 value-ref 属性指定已经配置好的 bean 的引用。
同事 entry 标签中也可以使用 ref 标签,但是不能使用 bean 标签,而 property标签中不能使用 ref 或者 bean 标签引用对象。

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

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

相关文章

Python-基于Pygame的小游戏(坦克大战-1.0(世界))(一)

前言:创作背景-《坦克大战》是一款经典的平面射击游戏&#xff0c;最初由日本游戏公司南梦宫于1985年在任天堂FC平台上推出。游戏的主题围绕坦克战斗&#xff0c;玩家的任务是保卫自己的基地&#xff0c;同时摧毁所有敌人的坦克。游戏中有多种地形和敌人类型&#xff0c;玩家可…

【达梦数据库】Coredump文件生成与分析

目录 背景参考链接分析Coredump文件获取问题SQL1、查看Coredump文件生成路径2、使用gdb工具读取Coredump文件3、记录崩溃线程堆栈4、记录当前崩溃线程号5、使用dmrdc工具分析Coredump文件6、寻找线程号对应SQL7、重新执行SQL&#xff0c;复现问题 记录Coredump文件中所有线程的…

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…

基于SCUI的后台管理系统

一、SCUI Admin 官方地址&#xff1a;https://python-abc.xyz/scui-doc/ 高性能中后台前端解决方案&#xff0c;基于 Vue3、elementPlus 持续性的提供独家组件和丰富的业务模板帮助你快速搭建企业级中后台前端任务。 预览地址&#xff1a;https://python-abc.xyz/scui-doc/de…

vscode不同的项目使用不同的环境变量或编译环境

转载请标明出处&#xff1a;小帆的帆的博客 假如电脑中安装的两套C编译环境&#xff0c;想要切换编译环境时可以在操作系统的环境变量中调整顺序&#xff0c;然后排在前面的环境就会被使用。 这样做的弊端&#xff1a; 麻烦容易忘&#xff0c;忘了项目不报错就可能就不会发现…

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献&#xff08;CAJPDF&#xff09;批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件&#xff0c;格式为es6文件&#xff0c;需使用知网研学软件打开&#xff0c;故需先安装该…

运输时间超声波流量计基本原理解析

通过从上游传感器向下游传感器发送超声波脉冲并再次返回来测量流体速度。这些信号沿流向和逆流向交替发射。由于信号在其中传播的流体正在流动&#xff0c;因此超声信号沿流向的传播时间比逆流向的传播时间短。测量由此产生的传输时间差 Δt&#xff0c;并允许流量计确定沿超声…

<mutex>注释 11:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(上)

&#xff08;46&#xff09;问题的起源&#xff1a; 因为上面的内核代码&#xff0c;我们编写多线程代码时&#xff0c;对手里的家伙事不那么自信。但我们知道&#xff0c;多线程在竞争锁时&#xff0c;若得不到锁&#xff0c;会进入睡眠&#xff0c;并会在被唤醒后重新尝试得…

flask_socketio 以继承 Namespace方式实现一个网页聊天应用

点击进入上一篇&#xff0c;可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装&#xff1a; pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…

LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度

本代码的主要功能是建模 LOS&#xff08;视距&#xff09;和 NLOS&#xff08;非视距&#xff09;环境下的定位系统&#xff0c;估计目标的动态位置&#xff0c;三维空间 文章目录 运行结果源代码代码介绍 总结 运行结果 10个点的轨迹定位&#xff1a; 50个点的轨迹定位&#…

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

C++算法第十一天

本篇文章我们继续学习动态规划 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解析 代码原理 代码编写 第五题 题目链接 题目解析 代…

[x86 ubuntu22.04]投影模式选择“只使用外部”,外部edp屏幕无背光

1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 系统下有两个一样的 edp 屏幕&#xff0c;投影模式选择“只使用外部”&#xff0c;内部 edp 屏幕灭&#xff0c;外部 edp 屏幕无背光。DP-1 是外部 edp 屏幕&#xff0c;eDP-1…

【ETCD】【实操篇(二)】如何从源码编译并在window上搭建etcd集群?

要在 Windows 上编译 etcd 及 etcdctl 工具&#xff0c;并使用 bat 脚本启动 etcd 集群&#xff0c;首先需要准备好开发环境并确保依赖项正确安装。下面是从 etcd 3.5 源码开始编译和启动 etcd 集群的详细步骤&#xff1a; 目录 1. 安装 Go 环境2. 获取 etcd 源码3. 编译 etcd…

34. Three.js案例-创建球体与模糊阴影

34. Three.js案例-创建球体与模糊阴影 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数对象&#xff0c;包…

从源码分析swift GCD_DispatchGroup

前言&#xff1a; 最近在写需求的时候用到了DispatchGroup&#xff0c;一直没有深入去学习&#xff0c;既然遇到了那么就总结下吧。。。。 基本介绍&#xff1a; 任务组&#xff08;DispatchGroup&#xff09; DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…

深度神经网络(DNN)在时序预测中的应用与缺陷

目录 ​编辑 一、DNN在时序预测中的应用 二、DNN的缺陷 三、技术挑战与未来趋势 四、结论 随着大数据时代的到来&#xff0c;深度学习技术在时序预测领域扮演着越来越重要的角色。深度神经网络&#xff08;DNN&#xff09;因其强大的非线性拟合能力和自动特征提取能力&…

第十五章、职责链模式

第十五章、职责链模式 职责链可以是一条直线、一个环或者一个树形结构&#xff0c;最常见的职责链是直线型&#xff0c;即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者&#xff0c;职责链模式可以将请求的处理者组织成一条链&#xff0c;并使请求沿着链传递&a…

docker容器的安装以及用法

1、了解docker 1.1、docker是什么 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现…

springboot450房屋租赁管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统房屋租赁管理系统信息管理难度大&#xff0c;容错率低&am…