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

  • 类类型属性赋值: 在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时,了解其作用域,并确保在适当的范围内引用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

臻奶惠的行业优势与市场竞争力解析

臻奶惠在智能售货机领域深耕多年&#xff0c;其加盟合作模式在行业中展现出了多方面的优势。以下是对该公司智能售货机加盟优势的深入分析&#xff1a; 技术先进性&#xff1a; 臻奶惠智能售货机以高度自动化的运营模式著称&#xff0c;特别是在自动补货、远程监控和数据分析…

【端午惊喜】2024年6月6日 docker 国内镜像源集体失效

文章目录 概述中科大镜像源阿里镜像源其他镜像源可用的镜像源写在最后 概述 大家都知道使用docker hub官方镜像需要魔法&#xff0c;虽然大部人有魔法&#xff0c;但是网速也是很慢&#xff0c;还有部分同学没有&#xff0c;全靠国内各大厂商的镜像源&#xff0c;可是端午6.6大…

zabbix监控深信服AD案例+自动发现虚拟服务和链路

文章目录 前言监控功能告警功能 环境准备操作步骤深信服AD开启SNMPSNMP V2SNMP V3 Zabbix导入模版Zabbix中添加深信服AD 前言 深信服AD&#xff0c;应用交付网关&#xff0c;是较为常见的应用发布、负载均衡设备&#xff0c;常用于网络出口。 本案例是通过zabbix的snmp监控深…

如何成为AI产品经理,踏入高薪不内卷的职场

前言 在当今科技日新月异的背景下&#xff0c;AI产品经理这一岗位逐渐成为职场中的一颗璀璨新星&#xff0c;吸引着众多求职者的目光。然而&#xff0c;对于这个职位的具体要求和工作内容&#xff0c;许多人仍处在一知半解的状态。虽然普遍认知中&#xff0c;AI产品经理岗位与…

【漏洞复现】Rejetto HTTP文件服务器 未授权RCE漏洞(CVE-2024-23692)

0x01 产品简介 Rejetto HTTP File Server(HFS)是一个基于HTTP协议的文件服务器软件&#xff0c;旨在为用户提供简单、轻量级且易于使用的文件共享解决方案。功能强大、易于使用的文件服务器软件&#xff0c;无论是个人使用还是团队协作&#xff0c;HFS都能满足用户的需求&…

【解决】Windows 10 主机上的 VMware Workstation 中出现“VMware Workstation 与设备/凭据保护不兼容”错误

解决错误的过程: 要解决错误,请按照以下步骤操作: 如果您的主机具有Windows 10 20H1 版本 19041.264 或更新版本,请升级/更新到 Workstation 15.5.6 或更高版本。有关更多详细信息,请参阅VMware Workstation 中 Windows Host VBS 支持的最低要求 如果您的主机装有Windows…

了解多线程

1.线程与并发 1.1 理解进程和线程的区别 进程&#xff1a;是指一个内存中运行的应用程序&#xff08;程序的一次运行就产生一个进程&#xff09;&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;比如在Windows的任务管理器中&#xff0c;一个运行的xx.exe就是一个进…

SSL证书的作用,SSL证书不续费有影响吗

随着网络发展&#xff0c;网站业务越来越多&#xff0c;SSL证书作为保障网站数据传输安全的重要手段&#xff0c;其重要性不言而喻。SSL证书的有效期通常为一年&#xff0c;并且需要定期更换。那么为什么SSL证书要一年换一次呢?如果证书过期且未续费&#xff0c;网站还能否正常…

计数排序的实现

计数排序 计数排序是一个基于非比较的排序算法。它的优势在于在对一定范围内的整数排序时&#xff0c;它的复杂度为Ο(nk)&#xff08;其中k是整数的范围&#xff09;&#xff0c;快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法&#xff0c;而且当O(k)&#xff1e…

vivado HW_SIO_GTGROUP、HW_SIO_IBERT

HW_SIO.GTGROUP 描述 GT组与硬件设备上的GT IO组相关&#xff0c;具有可用的数量 GT引脚和组由目标Xilinx FPGA确定。在Kintex-7 xc7k325部件上&#xff0c;用于 例如&#xff0c;有四个GT组&#xff0c;每个组包含四个差分GT引脚对。每个GT pin有自己的接收器hw_sio_rx和发射器…

如何免费获取云服务器

这几天刚入手了阿贝云的 “免费云服务器 ” &#xff0c;接下来给大家讲讲如何免费注册阿贝云的免费云服务器 如何获取免费云服务器 打开阿贝云官网&#xff0c;注册并认证 即可以领取免费云服务器 阿贝云地址&#xff1a;https://www.abeiyun.com/ 服务器优势 永久免费&…

【算法实战】每日一题:18.1并查集知识点讲解以及算法实战

1.题目 给定一个序列&#xff0c;通过n-1次相邻元素的合并操作&#xff0c;恢复原始序列。 2.涉及知识点 - 并查集 (Union-Find) 并查集 (Union-Find) 详解 概述 并查集&#xff08;Union-Find&#xff09;&#xff0c;也称为不相交集数据结构&#xff0c;用于处理一些不相…

华为支持手指关节手势的原理

华为的指关节手势有指关节截屏、指关节录屏、指关节区域截屏、指关节分屏等。该技术的实现是靠触控结合了其他一些传感器实现的。 华为的专利&#xff1a; 一种手势控制方法、装置、终端设备和存储介质——华为技术有限公司 专利中提到以往终端设备对于手势的识别都是基于位置和…

橘子叶子病害分类数据集38432张5类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;38432 分类类别数&#xff1a;5 类别名称:["Citrus_Canker_Diseases_L…

学生党蓝牙耳机推荐,四款高性价比机型推荐

对于正在寻找高性价比蓝牙耳机的学生党们来说&#xff0c;选择一款既符合预算又满足音质、舒适度与便携性要求的耳机至关重要&#xff0c;以下将为大家推荐四款备受好评的蓝牙耳机&#xff0c;它们不仅性价比高&#xff0c;而且各具特色&#xff0c;相信能够满足不同学生党的需…

定个小目标之刷LeetCode热题(12)

这是一道简单题&#xff0c;使用位运算中的异或运算即可&#xff0c;异或运算有以下性质&#xff1a; 1、任何数异或 0 结果仍然是原来的数&#xff0c;即 a⊕0a 2、任何数和其自身做异或运算&#xff0c;结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…

电脑ps缺少dll的多种解决方法,轻松搞定dll丢失问题

启动 Photoshop CC (20.0) 时&#xff0c;屏幕显示 Photoshop.exe - 系统错误对话框&#xff1a; 由于计算机中缺少 D3DCOMPILER_47.dll 而导致该程序无法启动。请尝试重新安装该程序以修复此问题。本文将针对这一问题进行详细的分析和解决方案的分享&#xff0c;帮助大家更好…

理解dispatch_async

Submits a block for asynchronous execution on a dispatch queue and returns immediately. 提交一个块以在调度队列上异步执行并立即返回。 code showing 以一个最简单的demo开始 // 创建一个同步队列 dispatch_queue_t syncQueue dispatch_queue_create("io.sqi.My…

6.结构体

目录 一、普通结构体&#xff08;struct&#xff09;1.1 说明1.2 举例1&#xff09;结构体定义及访问2&#xff09;结构体初化的简单写法3&#xff09;结构体更新语法 二、元组结构体&#xff08;tuple struct&#xff09;2.1 概念2.2 示例 三、类单元结构体&#xff08;unit-l…

程序猿大战Python——容器——字符串

字符串介绍 什么是Python容器 目标&#xff1a;了解Python容器是什么&#xff1f; 在现实生活中&#xff0c;我们知道容器是用来存放东西的&#xff0c;比如实验室里的烧杯等。 类似的&#xff0c;在Python中的容器是用来存放数据的。 与此同时&#xff0c;为了操作方便&…