Spring——级联赋值的两种方式

本文详细介绍了级联赋值在Spring框架中的两种实现方式,包括传统注入方式和表达式形式,以及注意事项。通过实例演示如何在bean配置中管理依赖关系并进行属性值传递。

什么是级联赋值?
百度百科:级联(cascade)在计算机科学里指多个对象之间的映射关系。

级联赋值在使用上,是在一个bean对象中注入另一个bean对象(外部bean)的属性并对该属性进行赋值。

1、方式一:

先在外部bean中注入属性后,再引用

<!--级联赋值方法一-->
<bean id="emp" class="com.hmkj.spring5.bean.Emp">
    <!--设置两个普通属性-->
    <property name="ename" value="lucy"></property>
    <property name="gender" value="女"></property>

    <!--级联赋值
        在外部bean中,添加属性
    -->
    <property name="dept" ref="dept"></property>
</bean>

<bean id="dept" class="com.hmkj.spring5.bean.Dept">
    <property name="dname" value="财务部"></property>
</bean>

2、方式二:

表达式形式,直接引用外部bean的属性

<!--级联赋值方法二-->
<bean id="emp" class="com.hmkj.spring5.bean.Emp">
    <!--设置两个普通属性-->
    <property name="ename" value="lucy"></property>
    <property name="gender" value="女"></property>

    <!--级联赋值
        表达式形式
    -->
    <property name="dept" ref="dept"></property>
    <property name="dept.dname" value="技术部"></property>
</bean>

<bean id="dept" class="com.hmkj.spring5.bean.Dept"></bean>

有一个注意点,该方式必须在emp实体类中生成dept属性的get方法,否则会报dept属性找不到

private Dept dept;
//生成dept的get方法,必不可少
public Dept getDept(){
	return dept;
}
<think>根据提供的引用,Spring框架中的级联赋值两种主要方式:表达式形式和内部bean方式。引用[1]和[4]详细描述了这两种方式。 1. **表达式形式(外部bean引用)**:在XML配置中,通过`ref`属性引用已定义的bean,并使用点号`.`访问其属性进行赋值。例如: ```xml <bean id="emp" class="com.hmkj.spring5.bean.Emp"> <property name="ename" value="lucy"/> <property name="gender" value="女"/> <!-- 级联赋值:引用外部bean --> <property name="dept" ref="dept"/> <!-- 表达式形式直接修改dept的属性 --> <property name="dept.dname" value="技术部"/> </bean> <bean id="dept" class="com.hmkj.spring5.bean.Dept"/> ``` 此方式要求**Emp类必须提供dept属性的getter方法**(如`getDept()`),因为Spring需要通过`getDept().setDname("技术部")`实现赋值[^1][^4]。 2. **内部bean方式**:在`<property>`标签内直接嵌套`<bean>`定义,适用于仅当前对象使用的场景。例如: ```xml <bean id="emp" class="com.hmkj.spring5.bean.Emp"> <property name="ename" value="lucy"/> <property name="gender" value="女"/> <!-- 级联赋值:内部bean --> <property name="dept"> <bean class="com.hmkj.spring5.bean.Dept"> <property name="dname" value="技术部"/> </bean> </property> </bean> ``` 内部bean无需独立`id`,作用域限于当前属性,外部无法引用[^4][^5]。 两种方式的**核心区别**: - **表达式形式**:依赖外部bean,需显式定义被引用的bean(如`<bean id="dept">`),并通过点语法修改其属性。 - **内部bean**:直接在属性内定义新对象,无外部依赖,但对象无法复用。 --- §§相关问题§§ 1. Spring级联赋值需要满足什么前置条件? 2. 内部bean和外部bean在作用域上有何不同? 3. 如何通过注解实现Spring级联赋值? </think>### Spring级联赋值两种方式详解 根据引用内容,Spring框架中级联赋值主要有以下两种实现方式: #### 1. 表达式形式(外部bean引用) **实现原理**: 通过`ref`引用已定义的bean对象,并使用点号`.`访问其属性进行赋值。需满足两个条件: - 被引用的bean必须独立定义(如`<bean id="dept">`) - 当前bean必须提供级联对象的getter方法(如`getDept()`) ```xml <bean id="emp" class="com.hmkj.spring5.bean.Emp"> <!-- 基本属性赋值 --> <property name="ename" value="lucy"/> <property name="gender" value="女"/> <!-- 级联赋值核心 --> <property name="dept" ref="dept"/> <!-- 引用外部bean --> <property name="dept.dname" value="技术部"/> <!-- 点语法修改属性 --> </bean> <!-- 被引用的独立bean --> <bean id="dept" class="com.hmkj.spring5.bean.Dept"/> ``` *当Spring解析到`dept.dname`时,会通过`emp.getDept().setDname("技术部")`实现赋值[^1][^4]* --- #### 2. 内部bean方式 **实现原理**: 在`<property>`标签内直接嵌套`<bean>`定义,创建仅当前对象使用的依赖对象。 ```xml <bean id="emp" class="com.hmkj.spring5.bean.Emp"> <!-- 基本属性赋值 --> <property name="ename" value="lucy"/> <property name="gender" value="女"/> <!-- 级联赋值核心:嵌套内部bean --> <property name="dept"> <bean class="com.hmkj.spring5.bean.Dept"> <!-- 无id的内部bean --> <property name="dname" value="技术部"/> </bean> </property> </bean> ``` *特点:内部bean无需独立`id`,作用域仅限于当前属性,外部无法引用[^4][^5]* --- ### 两种方式的核心区别 | 特性 | 表达式形式 | 内部bean方式 | |--------------------|----------------------------|--------------------------| | **对象复用性** | 可被多个bean引用 | 仅当前属性专用 | | **配置位置** | 需独立定义外部bean | 嵌套在属性内部 | | **内存开销** | 单例模式下共享实例 | 每次创建新实例 | | **适用场景** | 需要复用的公共依赖 | 对象无需复用的私有依赖 | > 级联赋值的本质是**在创建对象A时,同时初始化其关联对象B的属性**。例如创建员工(Emp)时,需同步设置其所属部门(Dept)的详细信息[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值