Spring-配置文件

一、引子

了解完Spring的基本概念后,我们紧接着来了解Spring中的核心文件--Spring配置文件。

二、配置Bean

我们在上一节Spring的基本概念中快速使用了一下Spring,其中我们在配置文件中主要涉及到就是Bean标签的配置:主要的配置字段有id, class, scope。 id是Bean的唯一标识不可重复,class是该类的全限定名。scope则是影响范围,有singleton和prototype两个可选项。当选择为singleton时,表示每次问IoC容器索要的对象是同一个,而选择为prototype时,则生成的对象是不同的。读者可分别打印其地址尝试。

    <!--bean:将对象交给IOC容器来管理属性:id:bean的唯一标识,不能重复class:设置bean对象所对应的类型--><bean id="hello-world" class="com.bylearning.spring.pojo.HelloWorld" scope="prototype"/>

此外,scope不同时,对象的创建时机不同,我们可以覆盖构造方法观察构造方法中的输出语句何时打印。 

public class HelloWorld {public HelloWorld() {// 覆盖无参构造方法,是为了验证bean的scope分别为singleton和prototype时,创建对象的时机// 在Test代码中获取IoC容器那一行代码中打断点,执行测试方法// 当scope=singleton时,IoC容器完成加载时,对象就创建了// 当scope=prototype时,IoC容器完成加载时,还未创建对象,而是调用getBean方法时创建的System.out.println("object is creating...");}public void sayHello() {System.out.println("hello, spring");}
}

谈到构造方法,我们在Spring基本概念中也提到了,Spring容器创建对象的方式是反射。而反射通常是通过无参构造方法实现的,而一个类会自动生成一个默认的无参构造方法。说到这里,已经有一些开发经验的伙伴是否有这样的经历:为一个类创建了一个有参构造方法,此时我们向Spring容器索要对象时提示错误:

因为此时找不到无参的构造方法了,反射创建对象就失败了。包括配置文件也会提醒你:没有合适的构造方法。

此外,还能在配置文件中配置对象的初始化/销毁方法,属性是:init-method/destory-method。由于不常用,我们不再举例。

三、注入属性

想象这样一个场景,我们上面的HelloWorld类中有一个成员属性是HelloSpring对象,我们怎么给HelloWorld对象设置这样的一个成员属性对象呢?这需要使用到依赖注入(Dependency Injection,DI),是Spring给对象设置成员变量的方法。有两种实现方式:构造方法和set方法。

(1)构造方法

HelloWorld类中添加成员对象与包含该属性的有参构造

public class HelloWorld {private HelloSpring helloSpring;public HelloWorld(HelloSpring helloSpring) {this.helloSpring = helloSpring;}public void sayHello() {helloSpring.sayHello();}
}

并在配置文件中添加HelloSpring Bean标签,添加使用构造方法注入helloSpring属性的一行标签

    <bean id="hello-spring" class="com.bylearning.spring.pojo.HelloSpring" /><bean id="hello-world" class="com.bylearning.spring.pojo.HelloWorld" scope="prototype"><constructor-arg name="helloSpring" ref="hello-spring"></constructor-arg></bean>
(2)set方法

同样添加成员对象与该属性的set方法

public class HelloWorld {private HelloSpring helloSpring;public void sayHello() {helloSpring.sayHello();}public void setHelloSpring(HelloSpring helloSpring) {this.helloSpring = helloSpring;}
}

添加使用set方法注入属性的一行标签

    <bean id="hello-spring" class="com.bylearning.spring.pojo.HelloSpring" /><bean id="hello-world" class="com.bylearning.spring.pojo.HelloWorld" scope="prototype"><property name="helloSpring" ref="hello-spring"></property></bean>

我们注意到这里引用其它对象作为成员变量时,用的关键字是"ref",实际上这里有其它选项:当需要注入的是普通属性如int, float时,应使用"value"关键字;要注入集合属性时,使用"list";要注入map时,使用"map"。这些细碎的知识,大家可以等到使用时去搜索一下,不要硬记,抓大放小,主要是理解大的思想。

四、引入其它配置文件(分模块开发)

可以想象,当项目的功能逐渐增加时,配置文件会变得异常庞大。此时我们可以分模块开发,将配置文件进行拆分。而在主配置文件里使用import标签引入其它配置文件。

    <import resource="applicationContext-user.xml"></import><import resource="applicationContext-order.xml"></import>

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

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

相关文章

【漏洞攻击之文件上传条件竞争】

漏洞攻击之文件上传条件竞争 wzsc_文件上传漏洞现象与分析思路编写攻击脚本和重放措施中国蚁剑拿flag wzsc_文件上传 漏洞现象与分析 只有一个upload前端标签元素&#xff0c;并且上传任意文件都会跳转到upload.php页面&#xff0c;判定是一个apache容器&#xff0c;开始扫描…

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示&#xff1a; 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动&#xff08;不好控制&#xff09; 选中物体&#xff1a;右上的大纲窗口&#xff0c;点击物体名称&#xff0c;物体的轮…

大模型笔记【3】 gem5 运行模型框架LLama

一 LLama.cpp LLama.cpp 支持x86&#xff0c;arm&#xff0c;gpu的编译。 1. github 下载llama.cpp https://github.com/ggerganov/llama.cpp.git 2. gem5支持arm架构比较好&#xff0c;所以我们使用编译LLama.cpp。 以下是我对Makefile的修改 开始编译&#xff1a; make UNAME…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三全面了解 GO 的 Web 框架系统方案建议 - 让 ChatGPT 推断我的一些微末思考结论 本文只是我的一些尝试&#xff0c;基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定是…

python高级(1): 迭代器详解

文章目录 1. 迭代器与可迭代对象(Iterable)1.1 可迭代对象(Iterable)1.2 迭代器( Iterator) 2. 自定义一个可迭代器2.1 实现迭代器2.2 for 遍历迭代器的过程 3. yolov8 Dataset实现案例 Python迭代器的作用是提供一种遍历数据集合的方式。它是一个可以被迭代的对象&#xff0c;…

【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 差分数组 图论 分类讨论 整除以2 LeetCode100213按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 1 < i < n…

ARM_Linux中GCC编译器的使用

目录 前言: GCC编译过程: 预处理&#xff1a; 编译阶段&#xff1a; 汇编&#xff1a; 链接阶段 GCC的常见使用 前言: 什么是GCC: gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Co…

深度学习记录--指数加权平均

指数加权移动平均(exponentially weighted moving averages) 如何对杂乱的数据进行拟合&#xff1f; 通过指数加权平均可以把数据图近似拟合成一条曲线 公式&#xff1a; 其中表示第t个平均数&#xff0c;表示第t-1个平均数&#xff0c;表示第t个数据&#xff0c;表示变化参数…

tkinter绘制组件(40)——滚动选值框

tkinter绘制组件&#xff08;40&#xff09;——滚动选值框 引言布局函数结构文本展示选择器布局完整函数代码 效果测试代码最终效果 github项目pip下载结语 引言 2023年基本没有怎么更新TinUI组件部分&#xff0c;而滚动选值框&#xff08;picker&#xff09;&#xff0c;是在…

《WebKit 技术内幕》学习之七(4): 渲染基础

4 WebKit软件渲染技术 4.1 软件渲染过程 在很多情况下&#xff0c;也就是没有那些需要硬件加速内容的时候&#xff08;包括但不限于CSS3 3D变形、CSS3 03D变换、WebGL和视频&#xff09;&#xff0c;WebKit可以使用软件渲染技术来完成页面的绘制工作&#xff08;除非读者强行…

Vue基础入门 - Vue的快速创建、Vue的开发者工具安装及Vue的常用指令(v-model,v-bind,computed计算属性,watch侦听器)

Vue 文章目录 Vue1 什么是Vue2 创建Vue实例2.1 快速创建2.2 插值表达式 {{}}2.3 响应式特性2.3.1 访问与修改 3 Vue开发者工具安装4 Vue中的常用指令4.1 内容渲染指令4.2 条件渲染指令4.3 事件绑定指令4.4 属性绑定指令4.5 案例-上下页图片翻页4.6 列表渲染指令4.7 案例-能删除…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

谷歌浏览器通过network模拟HTTP中的GET/POST请求获取response

1、F12打开network选中需要模拟的方法Copy->Copy as fetch 2、通过AI帮你进行转换一下调用格式 原代码 fetch("https://mp.amap.com/api/forward/aggregate?mtop.alsc.kbt.intergration.toolkit.call.queryCallBlockInfo", {"headers": {"acce…

03--数据库连接池

1、数据库连接池 1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步骤&#xff1a; 在主程序&#xff08;如servlet、beans&#xff09;中建立数据库连接进行sql操作断开数据库连接 这种模式开发&#xff0c;存在的问题:…

PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算

目录 Pytorch中Distance functions详解 pairwise_distance 用途 用法 参数 数学理论公式 示例代码 cosine_similarity 用途 用法 参数 数学理论 示例代码 输出结果 pdist 用途 用法 参数 数学理论 示例代码 总结 Pytorch中Distance functions详解 pair…

Git学习笔记(第1章):Git概述

目录 1.1 版本控制 1.1.1 何为版本控制 1.1.2 为什么需要版本控制 1.1.3 版本控制工具 1.2 发展历史 1.3 工作机制 1.4 代码托管中心&#xff08;远程库&#xff09; Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。…

【UEFI基础】EDK网络框架(UDP4)

UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol&#xff0c;它不提供复杂的控制机制&#xff0c;仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻&#xff0c;立即按照原样发送到网络。 UDP报文格式&#xff1a; 各个参数说明如下&…

AD导出BOM表 导出PDF

1.Simple BOM: 这种模式下&#xff0c;最好在pcb界面&#xff0c;这样的导出的文件名字是工程名字&#xff0c;要是在原理图界面导出&#xff0c;会以原理图的名字命名表格。 直接在菜单栏 报告->Simple BOM 即可导出物料清单&#xff0c;默认导出 comment pattern qu…

【Java】学习一门开发语言,从TA的Hello World开始

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…