Spring.xml 标签配置补充

本文详细介绍了Spring容器中依赖注入的各种方式,包括使用ref、value、idref等标签的使用场景,以及depends-on属性和autowire模式的应用,并对不同注入方式进行了举例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用ref来引用容器中其他对象实例,可以通过ref的local,parent,bean属性来指定引用的对象的beanName是什么

属性说明
local指定与当前配置的对象在同一个配置文件的对象定义的名称
parent指定位于当前容器的父容器中定义的对象的引用
bean适用于任何情况

对parent属性的说明:

BeanFactory可以分层次,通过实现HierarchicalBeanFactory接口,容器A在初始化的时候可以首先加载容器B中的所有对象定义,然后加载自身的对象定义

使用示例

<constructor-arg>
<ref parent="djNewsPersister"/>
</constructor-arg>

如果要往当前对象注入锁依赖的对象的名称而不是引用,那么通常可以使用value来完成

<property name="newsListenerBeanName"> 3
    <value>djNewsListener</value>
</property>

但是上面的情况可能会存在输错字,使用idref可以检查这个beanname所在的bean是否存在

<property name="newsListenerBeanName"> 3
    <idref>djNewsListener</idref>
</property>

bean可以作为内部bean标签

<constructor-arg index="0">
    <bean class="com.xxx.pojo.Student" />
</constructor-arg>

depends-on属性

spring容器会根据ref属性来指定bean的依赖,如果有时候没有使用ref标签就要使用depends-on属性来决定依赖关系

<bean id="bean1" class="...ClassA" depends-on="bean1,bean2"/>
<bean id="bean2" class="..."/>
<bean id="bean3" class="..."/>

autowire

指定当前bean采用某种类型的自动绑定模式
但是要注意的是自动绑定只应用于“原生类型、String类型以及Classes类型以外”的对象类型,对“原生类型、String类型和Classes类型”以及“这些类型的数组”应用自动绑定是无效的。

使用示例

<bean id="beanName" class="..." autowire="no"/>

bean有5中自动绑定模式
1.no
不使用任何形式的自动绑定,完全依赖于手工明确配置各个bean之间的依赖关系

<bean id="beanName" class="..." autowire="no"/>

2.byName
按照类中声明的实例变量的名称,与XML配置文件中声明的bean定义的beanName的值进行匹配

public class Bean{
    private Bean2 bean2;
    ...
}

<bean id="bean1" class="...Bean" autowire="byName">
</bean>
<bean id="bean2" class="...">
</bean>

3.byType
根据类型绑定,如果找不到相应的类型就自动报错

4.constructor
根据构造方法的参数类型进行的自动绑定

5.autodetect
这种模式是byType和constructor模式的结合体,如果对象拥有默认无参数的构造方法,容器会优先考虑byType的自动绑定模式。否则,会使用constructor模式。当然,如果通过构造方法注入绑定后还有其他属性没有绑定,容器也会使用byType对剩余的对象属性进行自动绑定。

dependency-check

该功能可以帮我们检查每个对象某种类型的所有依赖是否全部注入完成
1.none不做依赖检查
2.simple对简单类型以及相关类型的集合进行依赖检查
3.object只对引用类型进行检查
4.all将simple和object相结合

lazy-init

延迟初始化

list对应注入对象类型为java.util.List及其子类或者数组类型的依赖对象

public class MockDemoObject{
    private List param1;
    private String[] param2;
    ...
    // 相应的setter和getter方法
    ...
}
<property name="param1">
    <list>
        <value> something</value>
        <ref bean="someBeanName"/>
        <bean class="..."/>
    </list>
</property>

set对应java.util.Set或者子类的依赖对象

public class MockDemoObject
{
    private Set valueSet;
    // 必要的setter和getter方法
    ...
}
配置类似于
<property name="valueSet">
    <set>
        <value> something</value>
        <ref bean="someBeanName"/>
        <bean class="..."/>
        <list>
            ...
        </list>
    </set>
</property>

map使用entry作为其子标签

public class MockDemoObject{
    private Map mapping;
    // 必要的setter和getter方法
}

<property name="mapping"> 
    <map>
        <entry key="strValueKey">
            <value>something</value>
        </entry> 8
        <entry>
            <key>objectKey</key>
            <ref bean="someObject"/> 
        </entry>
        <entry key-ref="lstKey">
            <list>
                10 ...
            </list>
        </entry>
    </map>
< /property>

也可以这样配置

<property name="valueSet">
    <map>
        <entry key="strValueKey" value="something"/>
        <entry key-ref="" value-ref="someObject"/>
        <entry key-ref="lstKey">
            <list>
            ...
            </list>
        </entry>
    </map>
</property>

props是对应的类型是java.util.Properties,只能配置String类型的key,value

public class MockDemoObject
{
    private Properties emailAddrs;
    // 必要的setter和getter方法
    ...
}
配置类似于
<property name="valueSet">
    <props>
        <prop key="author">fujohnwang@gmail.com</prop>
        <prop key="support">support@spring21.cn</prop>
        ...
    </props>
</property>

对应一个空元素

<property name="param1">
    <null/> 
</property>
<property name="param2">
    <null/>
</property>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值