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

news2025/2/28 20:09:24

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

大数据篇正在更新!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.coloradmin.cn/o/2263039.html

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

相关文章

基础入门-Web应用蜜罐系统堡垒机运维API内外接口第三方拓展架构部署影响

知识点&#xff1a; 1、基础入门-Web应用-蜜罐系统 2、基础入门-Web应用-堡垒机运维 3、基础入门-Web应用-内外API接口 4、基础入门-Web应用-第三方拓展架构 一、演示案例-Web-拓展应用-蜜罐-钓鱼诱使 蜜罐&#xff1a;https://hfish.net/ 测试系统&#xff1a;Ubuntu 20.04 …

【长城杯】Web题 hello_web 解题思路

查看源代码发现路径提示 访问…/tips.php显示无用页面&#xff0c;怀疑…/被过滤&#xff0c;采用…/./形式&#xff0c;看到phpinfo()页面 注意到disable_functions&#xff0c;禁用了很多函数 访问hackme.php,看到页面源码 发现eval函数&#xff0c;包含base64 解密获得php代…

【测试】Pytest

建议关注、收藏&#xff01; 目录 功能pytest 自动化测试工具。 功能 单元测试&#xff1a;用于验证代码的最小功能单元&#xff08;如函数、方法&#xff09;的正确性。 简单的语法&#xff1a;不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试&#xff1a;P…

Python语法之字典

免责说明&#xff1a;此内容不包含嵌套字典 关注我更新更多初学实例 字典 一.字典的应用场景 思考:数据顺序发生变化&#xff0c;每个数据的下标也会随之变化&#xff0c;如何保证数据顺序变化前后能使用同一的 标准查找数据呢&#xff1f; 答&#xff1a;字典&#xff0c…

mysql客户端命令

目录 结束符 ; \g \G 中断输入 ctrl c 查看命令列表 help ? (\?) connect (\r) status (\s) delimiter (\d) exit (\q) quit (\q) tee (\T) ​编辑 notee (\t) prompt (\R) source (\.) system (\!) ​编辑 use (\u) help contents 结束符 ; \g \G 当我…

更频繁的 Android SDK 发布:更快的创新、更高的质量和更完善

Android 一直致力于让创新更快地进入用户手中。除了每年的平台发布之外&#xff0c;我们还投资了Project Treble、Mainline、Google Play 服务、每月安全更新和季度发布&#xff0c;为 Pixel Drops 提供支持。 未来&#xff0c;Android 将更频繁地发布 SDK&#xff0c;计划于 …

蓝卓总裁谭彰:AI+工业互联网推动制造业数字化转型

近日&#xff0c;新一代工业操作系统supOS6.0在2024中国5G工业互联网大会上重磅发布。 大会期间&#xff0c;工信部新闻宣传中心《人民邮电报》对蓝卓总裁谭彰就“工业互联网人工智能技术融合的思考”“supOS6.0的探索与实践”“未来工业互联网平台的发展方向”展开专题访谈&am…

【WRF-Urban】输入空间分布人为热排放数据的WRF运行全过程总结

目录 数据准备检查新增变量配置(如果有)WPS预处理修改namelist.wpsStep1: geogridStep2: ungribStep3: metgridWRF运行修改namelist.input调试namelist.input运行./real.exe运行./wrf.exe参考WRF模型的基本流程如下: 数据准备 空间分布热排放数据下载及制备可参见另一博客…

如何利用Python爬虫获得1688按关键字搜索商品

在当今的数字化时代&#xff0c;数据已成为企业竞争的核心资源。对于电商行业来说&#xff0c;了解市场动态、分析竞争对手、获取商品信息是至关重要的。Python作为一种强大的编程语言&#xff0c;其丰富的库和框架使得数据爬取变得简单易行。本文将介绍如何使用Python爬虫技术…

Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

【Go】-倒排索引的简单实现

目录 什么是倒排索引 定义 基本结构和原理 分词在倒排索引中的重要性 简单倒排索引的实现 接口定义 简单数据库的实现 倒排索引 正排索引 测试 总结 什么是倒排索引 定义 倒排索引&#xff08;Inverted Index&#xff09;是一种索引数据结构&#xff0c;它是文档检…

php生成图片

前提 开启dg2库 去掉前面的;注释&#xff0c;有的可能会带.dll后缀影响不大 extensiongd2代码 <?php $file imagecreate(100,50); //先生成图片资源$color imagecolorallocate($file,255,255,255); //白色$c imagecolorallocate($file,0,100,255);imagefill($file,0…

MySQL数据库——门诊管理系统数据库数据表

门诊系统数据库his 使用图形化工具或SQL语句在简明门诊管理系统数据库his中创建数据表&#xff0c;数据表结构见表2-3-9&#xff5e;表2-3-15所示。 表2-3-9 department&#xff08;科室信息表&#xff09; 字段名称 数据类型 长度 是否为空 说明 dep_ID int 否 科室…

02、10个富士胶片模拟的设置

二色彩 1、色彩的加减控制全局的饱和度增减&#xff1b; 2、色彩效果只提升暖色系饱和度&#xff1b; 3、FX蓝色大幅度提升蓝色系饱和度&#xff1b; 4、三个参数都不改变颜色的色相。 2.1 色彩 色彩调整的是拍摄画面整体的色彩饱和程度 2.2色彩效果 调整的是画面中暖色…

java全栈day19--Web后端实战(java操作数据库3)

一、MyBatis 1.1介绍 前提引入&#xff1a; controller(控制层)作用&#xff1a;接受请求&#xff0c;响应数据 service(业务层)作用&#xff1a;负责具体的逻辑处理 dao(持久层)作用&#xff1a;数据访问层 一般的访问流程&#xff1a;浏览器发起请求过来&#xff0c;先…

以太网帧、IP数据报图解

注&#xff1a;本文为 “以太网帧、IP数据报”图解相关文章合辑。 未整理去重。 以太网帧、IP数据报的图解格式&#xff08;包含相关例题讲解&#xff09; Rebecca.Yan已于 2023-05-27 14:13:19 修改 一、基础知识 UDP 段、IP 数据包&#xff0c;以太网帧图示 通信过程中&…

Android Vendor Overlay机制

背景介绍&#xff1a; 看Android 15版本更新时&#xff0c;"Android 15 deprecates vendor overlay"。 猜想这个vendor overlay是之前用过的settings overlay&#xff0c; 不过具体是怎么回事呢&#xff1f; 目录 Vendor Overlay介绍 Vendor Overlay工作原理 Ven…

联发科MTK8788_MT8788安卓核心板安兔兔跑分_安卓主板方案商

MT8788安卓核心板具有集成的蓝牙、fm、WLAN和gps模块&#xff0c;是一个高度集成的基带平台&#xff0c;包括调制解调器和应用处理子系统&#xff0c;启用LTE/LTE-A和C2K智能设备应用程序。该芯片集成了工作在2.0GHz的ARM Cortex-A73、最高可达2.0GHz的ARM Cortex-A53和功能强大…

uniapp连接蓝牙操作(蓝牙设备地锁)

介绍&#xff1a; 本文采用uni-app框架来创建一个简单的用户界面&#xff0c;用于搜索、连接和发送命令给蓝牙设备。 1.打开蓝牙适配器 function openBluetooth() {uni.openBluetoothAdapter({success() {uni.offBluetoothDeviceFound();// 监听新设备发现事件uni.onBlueto…

谁说C比C++快?

看到这个问题&#xff0c;我我得说&#xff1a;这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子&#xff1a; // C风格 char* str (char*)malloc(100…