Spring系统学习 -Spring IOC 的XML管理Bean之类类型属性赋值、数组类型属性赋值、集合类属性赋值

news2024/12/23 12:25:26
  • 类类型属性赋值: 在XML配置中,可以使用 <property> 元素为类类型属性赋值。通过指定属性的名称和值,可以直接将其他Bean的实例引用注入到目标Bean的属性中。这种方式可以建立对象之间的关联关系。例如,可以将一个Address对象注入到Person对象的address属性中。

  • 数组类型属性赋值: XML配置中,可以使用 <property> 元素为数组类型属性赋值。通过使用 <array><list> 元素,可以定义一个数组或列表,并使用 <value> 元素指定数组或列表的元素值。这样可以将多个值一次性赋给数组类型的属性。

  • 集合类型属性赋值: 在XML配置中,可以使用 <property> 元素为集合类型属性赋值。通过使用 <list><set><map><props> 元素,可以定义一个列表、集合、映射或属性集,并使用相应的元素指定集合的元素值。这样可以一次性赋给集合类型的属性。

类类型属性赋值

类类型属性赋值是指将一个类的实例赋值给另一个类的属性。在Java中,类类型属性是指一个类中的属性的类型是另一个类。

我们创建如下类:

public class Clazz {
    private Integer clazzId;
    private String clazzName;
    public Integer getClazzId() {
        return clazzId;
    }
    public void setClazzId(Integer clazzId) {
        this.clazzId = clazzId;
    }
    public String getClazzName() {
        return clazzName;
    }
    public void setClazzName(String clazzName) {
        this.clazzName = clazzName;
    }
    @Override
    public String toString() {
        return "Clazz{" +
            "clazzId=" + clazzId +
            ", clazzName='" + clazzName + '\'' +
            '}';
    }
    public Clazz() {
    }
    public Clazz(Integer clazzId, String clazzName) {
        this.clazzId = clazzId;
        this.clazzName = clazzName;
    }
}

然后创建一个Student类

public class student{
    private Integer stundentId;
    private String studentName;
	private Clazz clazz;

    public Integer getStundentId() {
        return stundentId;
    }
    public void setStundentId(Integer stundentId) {
        this.stundentId= stundentId;
    }
    public String getStudentName() {
        return clazzName;
    }
    public void setClazzName(String studentName) {
        this.studentName= studentName;
    }
	public Clazz getClazz() {
	    return clazz;
	}
	public void setClazz(Clazz clazz) {
	    this.clazz = clazz;
	}
}

方式一: 引用外部已经声明的bean

这个是在我们的spring的applicationContext.xml文件中配置的

配置Clazz类型的bean:

<bean id="clazzOne" class="com.miaow.spring.bean.Clazz">
    <property name="clazzId" value="1111"></property>
    <property name="clazzName" value="财源滚滚班"></property>
</bean>

为Student中的Clazz属性赋值:

<bean id="studentFour" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>
    <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
    <property name="clazz" ref="clazzOne"></property>
</bean>

错误演示

<bean id="studentFour" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>
    <property name="clazz" value="clazzOne"></property>
</bean>

如果错把ref属性写成了value属性,会抛出异常: Caused by: java.lang.IllegalStateException:Cannot convert value of type ‘java.lang.String’ to required type ‘com.miaow.spring.bean.Clazz’ for property ‘clazz’: no matching editors or conversion strategy found
意思是不能把String类型转换成我们要的Clazz类型,说明我们使用value属性时,Spring只把这个属性看做一个普通的字符串,不会认为这是一个bean的id,更不会根据它去找到bean来赋值

内部bean的方式

同样的在applicationContext.xml文件中配置如下代码:

<bean id="studentFour" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>
    <property name="clazz">
        <!-- 在一个bean中再声明一个bean就是内部bean -->
        <!-- 内部bean只能用于给属性赋值,不能在外部通过IOC容器获取,因此可以省略id属性 -->
        <bean id="clazzInner" class="com.miaow.spring.bean.Clazz">
            <property name="clazzId" value="2222"></property>
            <property name="clazzName" value="远大前程班"></property>
        </bean>
    </property>
</bean>

首先,通过 <bean> 标签定义了一个名为 studentFour 的Bean,并指定了它的类为 com.miaow.spring.bean.Student。

<bean> 标签中,使用 <property> 标签为 studentFour Bean 的属性赋值。其中,name 属性指定了要赋值的属性名,value 属性指定了要赋的值。

<property> 标签中,使用 <bean> 标签定义了一个内部Bean,即 clazzInner。内部Bean的类为 com.miaow.spring.bean.Clazz。

<bean> 标签中,使用 <property> 标签为 clazzInner Bean 的属性赋值。同样,使用 name 属性指定了要赋值的属性名,value 属性指定了要赋的值。

级联属性赋值

在Spring中,级联属性赋值是指在给一个对象的属性赋值时,同时给该对象的属性的属性(即子属性)赋值。这样可以方便地一次性设置多层嵌套属性的值。

<bean id="studentFour" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>
    <!-- 一定先引用某个bean为属性赋值,才可以使用级联方式更新属性 -->
    <property name="clazz" ref="clazzOne"></property>
    <property name="clazz.clazzId" value="3333"></property>
    <property name="clazz.clazzName" value="最强王者班"></property>
</bean>

首先,通过 <bean> 标签定义了一个名为 studentFour 的Bean,并指定了它的类为 com.miaow.spring.bean.Student。
然后,使用 <property> 标签为 studentFour Bean 的属性赋值。其中,name 属性指定了要赋值的属性名,value 属性指定了要赋的值。
接下来,通过 <property> 标签引用了一个名为 clazzOne 的Bean,并将其赋值给 studentFour 的 clazz 属性。这是级联属性赋值的前提,需要先引用某个Bean为属性赋值。
最后,使用级联属性赋值的方式,通过在 <property> 标签中使用点号 . 来表示级联属性的层级关系,设置了 studentFour 的 clazz 对象的 clazzId 和 clazzName 属性的值。

联机属性测试方法:

    @Test
    public void CascadeValueTest(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = (Student) context.getBean("studentFive");
        System.out.println(student);
        System.out.println(student.getClassz().toString());
    }

数组类型属性赋值的方式

在Spring的XML配置文件中,可以使用 或 元素为数组类型属性赋值。以下是两种常见的方式:

使用 <array> 元素:

在Student中添加了如下代码:

private String[] hobbies;
public String[] getHobbies() {
    return hobbies;
}
public void setHobbies(String[] hobbies) {
    this.hobbies = hobbies;
}

在XML文件中新增如下

<property name="hobbies">
        <array>
            <value>吃饭</value>
            <value>玩游戏</value>
            <value>打麻将</value>
        </array>
    </property>

使用 <list> 进行赋值

<property name="hobbies">
        <list>
            <value>吃饭</value>
            <value>玩游戏</value>
            <value>打麻将</value>
        </list>
    </property>

在上述示例中,通过 <list> 元素包裹多个<value>元素,每个 <value> 元素表示数组中的一个元素。

无论是使用 <list> 还是 <array> 元素,都可以在其中添加多个 <value> 元素来定义数组的元素。每个 <value> 元素的内容即为数组的一个元素的值。

为集合类型属性赋值

为List集合类型属性赋值

在Clazz中添加如下代码:

private List<Student> students;
public List<Student> getStudents() {
    return students;
}
public void setStudents(List<Student> students) {
    this.students = students;
}

配置bean:

<bean id="clazzTwo" class="com.miaow.spring.bean.Clazz">
    <property name="clazzId" value="4444"></property>
    <property name="clazzName" value="Javaee0222"></property>
    <property name="students">
        <list>
            <ref bean="studentOne"></ref>
            <ref bean="studentTwo"></ref>
            <ref bean="studentThree"></ref>
        </list>
    </property>
</bean>

<bean id="studentOne" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>  
</bean>
<bean id="studentTwo" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1005"></property>
    <property name="studentName" value="赵七"></property>  
</bean>
<bean id="studentThree" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1006"></property>
    <property name="studentName" value="王五"></property>  
</bean>

若为Set集合类型属性赋值,只需要将其中的list标签改为set标签即可

为Map集合类型属性赋值

我们创建一个新类Teacher

public class Teacher {
    private Integer teacherId;
    private String teacherName;
    public Integer getTeacherId() {
        return teacherId;
    }
    public void setTeacherId(Integer teacherId) {
        this.teacherId = teacherId;
    }
    public String getTeacherName() {
        return teacherName;
    }
    public void setTeacherName(String teacherName) {
        this.teacherName = teacherName;
    }
    public Teacher(Integer teacherId, String teacherName) {
        this.teacherId = teacherId;
        this.teacherName = teacherName;
    }
    public Teacher() {
    }
    @Override
    public String toString() {
        return "Teacher{" +
            "teacherId=" + teacherId +
            ", teacherName='" + teacherName + '\'' +
            '}';
    }
}

在Student类中添加如下代码:

private Map<String, Teacher> teacherMap;
public Map<String, Teacher> getTeacherMap() {
    return teacherMap;
}
public void setTeacherMap(Map<String, Teacher> teacherMap) {
    this.teacherMap = teacherMap;
}
在bean中配置
<bean id="teacherOne" class="com.miaow.spring.bean.Teacher">
    <property name="teacherId" value="10010"></property>
    <property name="teacherName" value="大宝"></property>
</bean>
<bean id="teacherTwo" class="com.miaow.spring.bean.Teacher">
    <property name="teacherId" value="10086"></property>
    <property name="teacherName" value="二宝"></property>
</bean>
<bean id="studentFour" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>  
    <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
    <property name="clazz" ref="clazzOne"></property>
    <property name="hobbies">
        <array>
            <value>吃饭</value>
            <value>玩游戏</value>
            <value>打麻将</value>
        </array>
    </property>
    <property name="teacherMap">
        <map>
            <entry>
                <key>
                    <value>10010</value>
                </key>
                <ref bean="teacherOne"></ref>
            </entry>
            <entry>
                <key>
                    <value>10086</value>
                </key>
                <ref bean="teacherTwo"></ref>
            </entry>
        </map>
    </property>
</bean>

在这里插入图片描述

引用集合类型的bean
<!--list集合类型的bean-->
<util:list id="students">
    <ref bean="studentOne"></ref>
    <ref bean="studentTwo"></ref>
    <ref bean="studentThree"></ref>
</util:list>
<!--map集合类型的bean-->
<util:map id="teacherMap">
    <entry>
        <key>
            <value>10010</value>
        </key>
        <ref bean="teacherOne"></ref>
    </entry>
    <entry>
        <key>
            <value>10086</value>
        </key>
        <ref bean="teacherTwo"></ref>
    </entry>
</util:map>
<bean id="clazzTwo" class="com.miaow.spring.bean.Clazz">
    <property name="clazzId" value="4444"></property>
    <property name="clazzName" value="Javaee0222"></property>
    <property name="students" ref="students"></property>
</bean>
<bean id="studentFour" class="com.miaow.spring.bean.Student">
    <property name="studentId" value="1004"></property>
    <property name="studentName" value="赵六"></property>  
    <!-- ref属性:引用IOC容器中某个bean的id,将所对应的bean为属性赋值 -->
    <property name="clazz" ref="clazzOne"></property>
    <property name="hobbies">
        <array>
            <value>抽烟</value>
            <value>喝酒</value>
            <value>烫头</value>
        </array>
    </property>
    <property name="teacherMap" ref="teacherMap"></property>
</bean>

使用util:list、util:map标签必须引入相应的命名空间,可以通过idea的提示功能选择

  • 引用顺序: 在使用 <util:list> 引用集合类型时,确保被引用的Bean已经在配置文件中定义并初始化。否则,可能会导致引用失败或引用到空集合。
  • 集合类型Bean的命名: 当使用 <util:list> 引用集合类型时,确保为集合类型的Bean提供唯一的ID。这样可以确保在引用时能够准确地指定要引用的Bean。
  • 集合类型Bean的作用域: 集合类型的Bean的作用域通常是单例(singleton)。确保在引用集合类型的Bean时,了解其作用域,并确保在适当的范围内引用。

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

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

相关文章

python项目(豆瓣电影)

目录 1、项目效果 2、项目源码 3、技术实现 4、总结 前言 我的这个项目是做的一个豆瓣电影爬取&#xff0c;爬取了豆瓣电影的TOP排行榜的数据 包括电影的名称 演员 评分 评价人数等等 运用了TK布局助手 布了4个界面 有登录 注册 首页 详情 注意&#xff1a;项目并没有连接数…

人工智能、机器学习、深度学习:技术革命的深度解析

目录 人工智能、机器学习、深度学习&#xff1a;技术革命的深度解析 引言 第一部分&#xff1a;人工智能的起源与演进 1.1 人工智能的定义 1.2 人工智能的历史 1.3 人工智能的关键概念 1.4 人工智能的应用领域 1.5 人工智能的未来发展 1.6 人工智能的代码案例 第二部…

计划任务 周期任务计划

周期任务计划 crontab 作用&#xff1a;实现周期重复的计划任务 服务&#xff1a;crond 启动crontab的服务 service crond start 自动启动 chkconfig crond on 例子&#xff1a; * * * * * touch date \\%F.log crontab的时间表示格式&#xff1a; 分钟&#xff1a;…

[2024-06]-[大模型]-[Ollama] 0-相关命令

常用的ollama命令[持续更新中] ollama更新&#xff1a; curl https://ollama.ai/install.sh |sh带着flash attention启动&#xff1a; OLLAMA_FLASH_ATTENTION1 ollama serve停止ollama服务&#xff1a; sudo systemctl stop ollama note&#xff1a;目前遇到sudo systemctl …

IBM,开始构建以量子为中心的超级计算机

6月6日&#xff0c;IBM与Pasqal宣布了一项重大合作!IBM和Pasqal打算合作开发一种以量子为中心的超级计算的通用方法并促进化学和材料科学的应用研究。IBM和Pasqal将与高性能计算领域的领先机构合作&#xff0c;为以量子为中心的超级计算奠定基础——将量子计算与先进的经典计算…

Python报表需求处理示例

单一文件下&#xff0c;相关主题的共128张字段结构相似的表&#xff0c;对一种需求用Excel手工编辑相当麻烦&#xff0c;下面介绍一种python做自动化报表示例及代码流程。 每张表均有相同的字段结构&#xff0c;因此可对该文件下所有表格同时操作&#xff0c;大大提高了计算效率…

Milvus 2.4 向量库安装部署

1、linux 已有docker环境 2、安装fio命令 yum install -y fio 2、mkdir test-data fio --rwwrite --ioenginesync --fdatasync1 --directorytest-data --size2200m --bs2300 --namemytest ctrlc 3、lscpu 4、docker -v 6、安装docker compose组件 yum -y install python3-…

万字长文讲解如何快速搭建一个Spring Cloud项目

文章目录 概念基本概念微服务七大组件 初始化Maven父工程整合注册中心组件整合远程调用与负载均衡组件组件整合网关组件整合配置中心组件以gateway模块为例 整合分布式事务组件操作数据库模拟创建订单和扣减库存整合Seata 整合熔断降级组件整合链路追踪组件源码地址参考来源 概…

Rust : windows下protobuf和压缩传输方案

此前dbpystream库是用python开发 web api。今天在rust中试用一下protobuf。 本文关键词&#xff1a;编译器、protobuf、proto文件、序列化、zstd压缩&#xff0c;build。 一、 protobuf编译器下载 具体见相关文章。没有编译器&#xff0c;protobuf无法运行。 windows参见&am…

多年不见,我美少女又回来了!

各位&#xff0c;可能很多人都不记得我了&#xff0c;上学的时候喜欢记学习笔记&#xff0c;好多学弟学妹们经常来我的博客看笔记&#xff0c;对于学习也有帮助。 时过境迁&#xff0c;生活中的琐事和繁忙的工作&#xff0c;真的自顾不暇… 还记得之前说要转型给大家分享内容运…

量产导入 | DFT和ATE概述

什么是DFT DFT(Design for Test),即可测性设计。 一切为了芯片流片后测试所加入的逻辑设计,都叫DFT。 DFT只是为了测试芯片制造过程中有没有缺陷,而不是用来验证芯片功能的,芯片功能的完善应该应该是在芯片开发过程用先进验证方法学去做的。 芯片制造过程相当复杂,工艺缺陷…

LabVIEW程序内存泄漏分析与解决方案

维护他人编写的LabVIEW程序时&#xff0c;若发现程序运行时间越长&#xff0c;占用内存越大直至崩溃&#xff0c;通常是内存泄漏导致的。本文从多角度分析内存泄漏的可能原因&#xff0c;包括数组和字符串处理、未释放的资源、循环中的对象创建等&#xff0c;并提供具体的解决方…

SamSung PM9B1 1TB性能实测

** SamSung PM9B1 1TB性能实测 ** 一颗主控一颗NAND FLASH 单面器件布局&#xff0c;PMIC集成电源芯片DC\DC模组 PCIE Gen4.0X4 性能3673MB2954MB 工作状态功耗4.1w左右&#xff0c;待机状态功耗1.2W左右 全盘读速度2000MB左右 H2缓内速度1.2G H2缓外速度730MB H2读速度1.3G …

牛客little w and Discretization

玩一下样例发现&#xff0c;只要找到mex就可以知道有((1-mex)的值)所在的位置离散化后和原本的值是一样的&#xff0c;所以询问区间的长度-&#xff08;1-mex&#xff09;有几个值就是答案&#xff0c;数据范围3e5&#xff0c;莫队值域分块求区间mex,计算1-mex有几个位置属于这…

mmdeploy环境部署流程

参考&#xff1a;mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境&#xff1a; docker容器&#xff0c;ubuntu20.04&#xff0c;cuda11.7…

迁移学习助力机器学习实践应用

大家好&#xff0c;迁移学习是一种技术&#xff0c;能使机器利用从以前任务中获得的知识来提高对新任务的泛化能力。作为ChatGPT和Google Gemini等模型的核心原理&#xff0c;迁移学习在长文档总结、复杂文章撰写、旅行规划以及诗歌和歌曲创作等重要任务中发挥着关键作用。 本…

Docker 安装gitLab

目录 1. 安装 Docker 2. 拉取 GitLab 镜像 3. 创建并运行 GitLab 容器 4. 登录GitLab 修改下载地址 修改账号密码 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易…

解决关于git clone 带子模块的项目得到的源码不完整,导致编译失败的解决办法

在使用 git 克隆一个项目的时候&#xff0c;你可能会碰到克隆后编译失败的情况&#xff0c;经过查找&#xff0c;发现原来是缺少一些文件&#xff0c;这些文件都有一个特点&#xff0c;如图&#xff1a; 要解决这个问题&#xff0c;需要在clone 命令的基础上加上一些参数 &…

Nature Communications|基于离子导电和强力蚕丝纤维的智能感知纺织品 (柔性智能织物/可穿戴电子/柔性纤维传感/柔性电子)

2024年4月17日,清华大学张莹莹教授(Yingying Zhang)课题组,在《Nature Communications》上发布了一篇题为“Intelligent perceptual textiles based on ionicconductive and strong silk fibers”的论文。论文内容如下: 一、 摘要 将纺织品赋予感知功能,类似于人类皮肤,…

Linux--08---挂载分区

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.查看系统磁盘分区情况1.lsblk 查看2.fdisk -l 2.挂载未分区磁盘1. 创建分区2. 格式化分区3. 创建挂载点4. 挂载分区5. 更新 /etc/fstab6.验证挂载 3.修改挂载的磁…