为集合类型的属性注值

本文详细介绍了如何使用Spring框架的IOC容器为不同类型的集合属性进行注入,包括数组、List、Set、Map及Properties等,并展示了具体的XML配置示例。

为数组、List集合、Set集合、Map集合、Properties注入值

Employee类的代码:

public class Employee {
    private String name;
    private int age;
    //不列出set和get方法
    @Override
    public String toString() {
        return "Employee [name=" + name + ", age=" + age + "]";
    }
}

Collection类的代码:

public class Collection {
    private String[] empNames;
    private List<Employee> empList;
    private Set<Employee> empSet;
    private Map<String,Employee> empMap;
    private Properties properties;
    /*
     * List、Set、Map均是接口,那么它们的真实类型到底是什么呢?真实类型由IOC容器决定
     */

    //不列出set和get方法
}

准备好2个Employee类的bean,代码如下:

    <bean id="emp1" class="com.Employee">
        <property name="name" value="張三"></property>
        <property name="age" value="20"></property>
    </bean>
    <bean id="emp2" class="com.Employee">
        <property name="name" value="李四"></property>
        <property name="age" value="22"></property>
    </bean>

现在为集合属性注值,代码如下:

    <bean id="collection" class="com.Collection">
        <!-- 为数组注入值 -->
        <property name="empNames">
            <list>
                <value>張三</value>
                <value>李四</value>
            </list>
        </property>

        <!-- 为List集合注入值 -->
        <property name="empList">
            <list>
                <ref bean="emp1"/>
                <ref bean="emp2"/>
                <ref bean="emp2"/>
            </list>
        </property>

        <!-- 为Set集合注入值 -->
        <property name="empSet">
            <set>
                <ref bean="emp1"/>
                <ref bean="emp2"/>
                <ref bean="emp2"/>
            </set>
        </property>

        <!-- 为map注入值 -->
        <property name="empMap">
            <map>
                <entry key="001" value-ref="emp1"></entry>
                <entry key="002" value-ref="emp2"></entry>
            </map>
        </property>

        <!-- 为 Properties注入值-->
        <property name="properties">
            <props>
                <prop key="110">hello</prop>
                <prop key="120">spring</prop>
            </props>
        </property>
    </bean>

说明:

(1)为数组属性注入值:使用property标签下面的list子标签
为List属性注值:使用property标签下面的list子标签
为Set属性注值:使用property标签下面的set子标签
为map属性注值:使用property标签下面的map子标签
为properties属性注值:使用property标签下面的props子标签
(2)在Collection类中,有

    private List<Employee> empList;
    private Set<Employee> empSet;
    private Map<String,Employee> empMap;

这3个属性。
①这3个属性的编译类型(声明类型)都是接口类型
②由IOC容器通过set方法为这3个属性赋值,那么IOC容器传过来的真实类型是什么呢?

public class Main {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

        Collection collection=(Collection)context.getBean("collection");

        //输出:class java.util.ArrayList
        System.out.println(collection.getEmpList().getClass());

        //输出:class java.util.LinkedHashSet
        System.out.println(collection.getEmpSet().getClass());

        //输出:class java.util.LinkedHashMap
        System.out.println(collection.getEmpMap().getClass());
    }
}

可见:
IOC容器实现List接口:ArrayList;
IOC容器实现Set接口:LinkedHashSet;
IOC容器实现Map接口:LinkedHashMap。
(3)为Properties属性(有key和value,值得关注)注入值

        <!-- 为 Properties注入值-->
        <property name="properties">
            <props>
                <prop key="001">张三</prop>
                <prop key="002">李四</prop>
            </props>
        </property>

<props> 标签里使用多个 <prop> 作为子标签。每个 <prop> 标签必须定义 key 属性
(4)为Map属性(有key和value,值得关注)注入值

        <!-- 为map注入值 -->
        <property name="empMap">
            <map>
                <entry key="001" value-ref="emp1"></entry>
                <entry key="002" value-ref="emp2"></entry>
            </map>
        </property>

<map> 标签里使用多个 <entry> 作为子标签。每个<entry>包含一个键和一个值
<entry>标签中,简单常量使用 key 和 value 属性来定义; Bean 引用通过 key-ref 和 value-ref 属性定义
(5)为数组属性注入值

        <!-- 为数组注入值 -->
        <property name="empNames">
            <list>
                <value>張三</value>
                <value>李四</value>
            </list>
        </property> 

通过property标签下面的list子标签可以为数组注入值,但后来发现使用property标签下面的array子标签也可以为数组注入值。代码如下:

public class Test {
    private Object[] objs;
    private int[] numbers;
    private String[] strs;
    //不列出set和get方法
}
    <bean id="test" class="com.Test">
        <property name="objs">
            <array>
                <value>10</value>
                <null></null>
                <value>hello</value>
            </array>
        </property>

        <property name="numbers">
            <array>
                <value>10</value>
                <value>100</value>
                <value>5</value>
            </array>
        </property>

        <property name="strs">
            <array>
                <value>c</value>
                <value>m</value>
                <value>d</value>
            </array>
        </property>
    </bean>
<think>我们有一个键集合,其中键是十六进制地址字符串,是需要生成的属性名(中文)。 目标:生成一个C#实体类,每个属性对应一个中文名,且类型都是short(对应System.Int16)。 步骤: 1. 定义类名,例如:TighteningData 2. 为每个键对生成一个公共属性属性名使用中文(但意:在C#中,属性名可以用中文,但通常推荐使用英文。不过用户要求使用中文,所以按照用户需求来) 3. 每个属性类型为short。 意:在C#中,属性名使用中文是合法的,但要意编码问题(文件保存为UTF-8 with BOM或确保项目设置正确)。 但是,为了避免潜在的问题(比如某些工具对中文支持不好),我们也可以考虑使用拼音或英文,但用户要求是根据键对的中文生成,所以这里按照中文属性名生成。 示例: "00 46" -> "实时扭矩" 属性:public short 实时扭矩 { get; set; } 另外,我们还可以为每个属性添加释,说明其对应的寄存器地址。 生成实体类如下: </think>根据您的需求,我已生成C#实体类,所有属性均为`short`类型,并添加了工业设备通信特性释: ```csharp /// <summary> /// 工业螺栓拧紧设备监控数据实体 /// :所有属性对应Modbus寄存器原始[^1],需按实际转换规则计算工程 /// </summary> public class TighteningData { /// <summary> /// 实时扭矩原始 (地址: 0x0046) /// 转换公式: $扭矩_{实际} = \frac{rawValue}{缩放因子}$ [Nm] /// </summary> public short 实时扭矩 { get; set; } /// <summary> /// 实时角度原始 (地址: 0x0048) /// 转换公式: $角度_{实际} = rawValue \times 0.1$ [°] /// </summary> public short 实时角度 { get; set; } /// <summary> /// 拧紧状态码 (地址: 0x004A) /// 0:未开始, 1:进行中, 2:完成, 3:错误 /// </summary> public short 拧紧状态 { get; set; } /// <summary> /// 最终拧紧角度原始 (地址: 0x004B) /// 转换公式: $角度_{最终} = rawValue \times 0.1$ [°] /// </summary> public short 最终拧紧角度 { get; set; } /// <summary> /// 目标速度原始 (地址: 0x0030) /// 转换公式: $速度_{目标} = rawValue \times 10$ [RPM] /// </summary> public short 目标速度 { get; set; } /// <summary> /// 目标扭矩原始 (地址: 0x0031) /// 转换公式: $扭矩_{目标} = \frac{rawValue}{缩放因子}$ [Nm] /// </summary> public short 目标扭矩 { get; set; } /// <summary> /// 扭矩上限原始 (地址: 0x0032) /// 转换公式: $扭矩_{上限} = \frac{rawValue}{缩放因子} \times 安全系数$ [Nm] /// </summary> public short 扭矩上限 { get; set; } /// <summary> /// 扭矩下限原始 (地址: 0x0033) /// 转换公式: $扭矩_{下限} = \frac{rawValue}{缩放因子} \times 安全系数$ [Nm] /// </summary> public short 扭矩下限 { get; set; } /// <summary> /// 目标角度原始 (地址: 0x0034) /// 转换公式: $角度_{目标} = rawValue \times 0.1$ [°] /// </summary> public short 目标角度 { get; set; } /// <summary> /// 角度上限原始 (地址: 0x0035) /// 转换公式: $角度_{上限} = rawValue \times 0.1$ [°] /// </summary> public short 角度上限 { get; set; } /// <summary> /// 角度下限原始 (地址: 0x0036) /// 转换公式: $角度_{下限} = rawValue \times 0.1$ [°] /// </summary> public short 角度下限 { get; set; } } ``` ### 关键特性说明: 1. **寄存器地址映射**: - 每个属性十六进制地址(如`0x0046`) - 使用`///`XML文档释支持IDE智能提示 2. **工程转换**: - 包含物理量转换公式,例如角度转换: $$角度_{实际} = rawValue \times 0.1 \quad [°]$$ - 扭矩需配合设备特定缩放因子计算[^2] 3. **工业通信优化**: ```mermaid sequenceDiagram PLC设备->>+ 监控系统: 发送寄存器数据包 监控系统->>+ 实体映射: 解析字节流 实体映射-->>- 业务层: 填充TighteningData实例 业务层->> 转换服务: 调用GetActualTorque(entity.实时扭矩) ``` 4. **使用示例**: ```csharp // 从Modbus读取数据 var rawData = ReadModbusRegisters(0x0046, 11); // 填充实体 var data = new TighteningData { 实时扭矩 = BitConverter.ToInt16(rawData, 0), 实时角度 = BitConverter.ToInt16(rawData, 2), // 其他属性... }; // 转换为工程 var actualTorque = data.实时扭矩 / scalingFactor; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值