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.mzph.cn/news/642063.shtml

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

相关文章

Servlet系列:生命周期(init、 service、destroy)详解

Servlet的生命周期是由Web容器&#xff08;如Tomcat&#xff09;管理的&#xff0c;包括以下三个阶段&#xff1a; 加载和实例化&#xff1a;当Web应用程序启动时&#xff0c;Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成&#xff0c;也可以通…

Mac上如何设置映射某个网站站点域名的IP

最近某常用的站点换 IP 了&#xff0c;但是 DNS 服务器还没有修改&#xff0c;这就导致无法访问&#xff08;换 DNS 服务器也不行&#xff09;。在用了一段时间的 IP 访问之后&#xff0c;还是没好&#xff0c;不知道是 DNS 污染还是咋了&#xff0c;所以最后还是手动改一下吧。…

MySQL定期整理磁盘碎片

MySQL定期整理磁盘碎片&#xff1a;提升数据库性能的终极指南 MySQL作为一个强大的关系型数据库管理系统&#xff0c;在长时间运行后可能会产生磁盘碎片&#xff0c;影响数据库性能。本博客将深入讨论如何定期整理MySQL磁盘碎片&#xff0c;以确保数据库的高效运行。我们将介绍…

mac滚动截图

参考博客 https://www.zhihu.com/question/313673726/answer/2938671835 首先去AppStore搜索 iShot 这个也是要钱的&#xff0c;不过我输入appleID后&#xff0c;并没有扣我钱&#xff0c;不知道设么回事 然后打开iShot 点击观看视频&#xff0c;然后mac会自动打开一个新的…

Softing mobiLink Power:集成FDI技术,简化多协议总线设备的配置方式

Softing的mobiLink Power是一款多协议总线通信工具&#xff0c;用于调试和维护过程自动化现场设备。目前&#xff0c;该工具已具备完整的FDI CommServer&#xff08;包括FF、PA、HART&#xff09;&#xff0c;并支持与FDI客户端一起使用&#xff0c;如艾默生的AMS Device Confi…

LeetCode 670 最大交换数

周一&#xff0c;非常冷&#xff0c;大风呼呼的&#xff0c;上班路都走不动。 好消息&#xff0c;马上要过年了。大风吹&#xff0c;天气好。 过年过年&#xff0c;回家过年~ 学生时代的迷茫是不应该存在的&#xff0c;最好的时光应该尽情享受&#xff0c;而不应该自己给加层…

西门子触摸屏维修6AV7880-0AA22-2DA2

西门子SIMATIC ITP1000平板PC机10.1 英寸采用 Intel Core i5 Skylake CPU&#xff0c;适合需要达16GB RAM的较高图形性能的工业移动计算应用。该 CPU 还提供了足够性能储备以满足将来的要求。安装的 Microsoft Windows 7 和 Microsoft Windows 10 操作系统以合理方式集成到现有…

68. redis计数与限流中incr+expire的坑以及解决办法(Lua+TTL)

文章目录 一、简介二、代码演进第一版代码&#xff08;存在bug隐患&#xff09;第二版代码&#xff08;几乎无隐患&#xff09;第三版代码(完美无瑕&#xff09; 一、简介 在日常工作中&#xff0c;经常会遇到对某种操作进行频次控制或者统计次数的需求&#xff0c;此时常用的…

RepLKNet 学习笔记

目录 原版测试代码: torch版本: RepLKNet 哔哩哔哩 原版测试代码: 1060显卡,224*224,平均时间10ms以内。 import timeimport torchfrom unireplknet import unireplknet_aif __name__ == __main__:net = unireplknet_a()net.cuda()net.eval()for i in range(20):

1411111111

第一张 用户管理表&#xff08;客户&#xff09; sys_user user_id 用户ID username 用户名 password 密码 phonenumber 电话 open_id 微信openID session_key 微信key user_type 管理员 维修员 客户 dept_id 部门ID 第五 维修人员表&#xff08;维修员&#xff09;sys_mainta…

深入了解Linux中常见的五种文件类型

了解文件类型对于正确理解和管理文件系统非常重要。希望本文能够帮助您更好地了解Linux中常见的文件类型及其在ls -l命令输出中的表示方式。​ 在Linux操作系统中&#xff0c;文件是操作系统中最基本的概念之一。在Linux中&#xff0c;每个文件都有一个特定的类型&#xff0c;这…

Elasticsearch分布式一致性原理剖析(一)-节点篇

前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行详细的剖析&#xff0c;介绍其实现方式、原理以及其存在的问题等(基于6.2版本)。 ES目前是最流行的分布式搜索引擎系统&#xff0c;其使用Lucene作为单机存储引擎并提供强大的搜索查…

从0开始学习C++ 第二十课:模板与泛型编程

第二十课&#xff1a;模板与泛型编程 学习目标&#xff1a; 掌握模板的基本语法和概念。学会使用函数模板来创建可重用的函数。学习如何定义类模板以实现数据结构的泛型。理解模板在C中提供的灵活性和强大功能。 学习内容&#xff1a; 模板的概念&#xff1a; 模板是C中支持…

解决Git添加.gitignore文件后不生效的问题

1. 问题描述 如上图所示&#xff0c;在已存在.gitignore文件且已经提交过的Git管理的项目中&#xff0c;其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了&#xff0c;可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

python--pyQt5 对话框使用(QInputDialog) PySide6

参考&#xff1a; https://www.cnblogs.com/XJT2018/p/10208710.html https://blog.csdn.net/panrenlong/article/details/79948261 含参数详解&#xff1a; https://blog.csdn.net/zhulove86/article/details/52515460 一、简介 QInputDialog类提供了一个简单的便捷对话框&a…

开源模型应用落地-业务整合篇(三)

一、前言 在之前的两篇文章中,我们学习了如何构建基本的即时消息(IM)功能。今天,我们将进一步将IM模块与AI服务进行连接,实现用户提问并由模型进行回答,最后将结果展示在用户界面上。 二、术语 2.1. Spring Boot 是一个用于快速构建基于Spring框架的Java应用程序的开源框…

python 编写dll给c++调用

Python可以通过ctypes库将Python函数封装为DLL文件&#xff0c;以便C程序调用。下面是一个简单的示例&#xff1a; 创建一个Python脚本&#xff0c;其中包含要封装的函数&#xff0c;例如&#xff1a; def add(x, y): return x y 将该脚本编译为DLL文件。可以使用pyinstalle…

深入浅出AI落地应用分析:AI音乐生成之「Suno.ai」

接下来会每周集中体验一些通用或者垂直的AI落地应用&#xff0c;主要以一些全球或者国外国内排行较前的产品为研究对象&#xff0c;「AI 产品榜&#xff1a; aicpb.com」以专题的方式在博客进行分享。 本节主要介绍和体验AI音乐生成应用产品Suno AI&#xff0c;Suno来自目前最…

HQL,SQL刷题简单查询,基础,尚硅谷

今天刷SQL简单查询&#xff0c;大家有兴趣可以刷一下 目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 总结归纳&#xff1a; 知识补充&#xff1a; 关于LIKE操作符/运算符 LIKE其他使用场景包括 LIKE模糊匹配情况 相关表数据&#xff1a; 1、student_info表 2、sc…