【Spring】-基于XML管理bean

本文详细介绍了在Spring中使用XML配置文件进行bean的注入,包括setter注入、构造函数注入、特殊值注入、类类型注入、数组类型注入、集合类型(如list和map)注入以及使用p命名空间的方式。每种注入方式都提供了具体的XML配置示例和解释。

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

本文主要介绍基于xml文件配置,如何对bean中不同类型属性配置取值

1、setter注入

xml定义:

<bean id="student" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname" value="lisa"></property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
</bean>

双加property标签,可以看到,property标签是通过settter方法来给bean属性赋值的
在这里插入图片描述测试类:

  @Test
    public void test01() {
        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = appContext.getBean(Student.class);
        System.out.println(student);
    }

代码输出为:
在这里插入图片描述此时各个属性取值已注入。
总结:
property标签:通过组件类的setXxx()方法给组件对象设置属性
name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)
value属性:指定属性值

2、构造函数注入

可以利用constructor-arg标签,利用构造函数,为bean属性注入值。
xml文件:

  <bean id="student1" class="com.lucky.spring.pojo.Student">
        <constructor-arg value="0002"></constructor-arg>
        <constructor-arg value="lisa2"></constructor-arg>
        <constructor-arg value="23"></constructor-arg>
        <constructor-arg value="n"></constructor-arg>
    </bean>

注意:必须保证bean里面有对应的构造函数定义。
测试:

 @Test
    public void test01() {
        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = appContext.getBean("student1", Student.class);
        System.out.println(student);
    }

constructor-arg标签还有两个属性可以进一步描述构造器参数:
index属性:指定参数所在位置的索引(从0开始)
name属性:指定参数名

3、特殊值注入

a、基本类型,string,包装类型,直接利用value属性即可

<property name="sid" value="0001"></property>

b、null值

  <!--给name赋值为null-->
    <bean id="student2" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname">
          <null />
        </property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
    </bean>

    <!--这样写是给sname复制了字符串"null"-->
    <bean id="student2" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname" value="null"></property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
    </bean>

c、特殊字符
名字中含有特殊字符 < 和 >
方法1: 使用XML实体来代替
方法2:使用CDATA节
CDATA中的C代表Character,是文本、字XML解析器看到CDATA节就知道这里是纯文所以CDATA节中写什么符号都随意 。
当名字中包含特殊字符<>的时候,xml可以这样写

<!--这样写是给sname包含特殊字符-->
    <bean id="student4" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname">
            <value><![CDATA[<ab>]]></value>
        </property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
    </bean>

4、类类型注入

当bean属性为引用类型的时候,使用ref属性赋值。在Student中引入一个属性clazz,clazz是一个bean,包含两个属性cid和cname;
方法1:引用外部已声明的bean

  <bean id="clazz" class="com.lucky.spring.pojo.Clazz">
        <property name="cid" value="0001"></property>
        <property name="cname" value="lucky"></property>
    </bean>

    <bean id="student5" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname" value="lisa"></property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
        <property name="clazz" ref="clazz"></property>
    </bean>

方法2:内部bean

 <bean id="student6" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname" value="lisa"></property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
        <property name="clazz">
            <bean id="clazz1" class="com.lucky.spring.pojo.Clazz">
                <property name="cid" value="0001"></property>
                <property name="cname" value="lucky"></property>
            </bean>
        </property>
    </bean>

注意这样定义的bean属于内部类,直接是获取不到的,如下获取clazz1

@Test
    public void test01() {
        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Clazz clazz = appContext.getBean("clazz1", Clazz.class);
        System.out.println(clazz);
    }

直接报错,找不到
在这里插入图片描述

5、数组类型注入

在Student中增加一个数组类型的属性private String[] hobbies;并在xml中利用array标签对其赋值。

 <bean id="student7" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname" value="lisa"></property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
        <property name="clazz" ref="clazz"></property>
        <property name="hobs">
            <array>
                <value>抽烟</value>
                <value>喝酒</value>
                <value>烫头</value>
            </array>
        </property>
    </bean>

这里数组中每个元素是string类型,所以array中每个元素用的value标签

6、集合类型之list注入

在clazz中增加属性,private List students;在xml中用list标签

  <bean id="clazz2" class="com.lucky.spring.pojo.Clazz">
        <property name="cid" value="0001"></property>
        <property name="cname" value="lucky"></property>
        <property name="students">
            <list>
                <ref bean="student"></ref>
                <ref bean="student1"></ref>
            </list>
        </property>
    </bean>

这里list里面是引用类型,所以list里面每个元素用的ref标签。
若为Set集合类型属性赋值,只需要将其中的list标签改为set标签即可
也可以使用list集合类型的bean,这样写其他地方还可以复用这个list, 要把util约束导入

xmlns:util="http://www.springframework.org/schema/util"
  <!--list集合类型的bean-->
    <util:list id="students">
        <ref bean="student"></ref>
        <ref bean="student2"></ref>
        <ref bean="student3"></ref>
    </util:list>

7、集合类型之map注入

在student中增加一个map类型的属性, private Map<String, Teacher> teachers, 在xml中利用map标签中entry标签对中每一对 k 和v赋值。

 <bean id="teacher1" class="com.lucky.spring.pojo.Teacher">
        <property name="tid" value="12"></property>
        <property name="tname" value="yunwen"></property>
    </bean>
    
    <bean id="student8" class="com.lucky.spring.pojo.Student">
        <property name="sid" value="0001"></property>
        <property name="sname" value="lisa"></property>
        <property name="age" value="22"></property>
        <property name="gender" value="n"></property>
        <property name="clazz" ref="clazz"></property>
        <property name="hobs">
            <array>
                <value>抽烟</value>
                <value>喝酒</value>
                <value>烫头</value>
            </array>
        </property>
        <property name="teachers">
            <map>
                <entry>
                    <key><value>yuwen</value></key>
                    <ref bean="teacher1"></ref>
                </entry>
            </map>
        </property>
    </bean>

也可以使用map类型的bean,要把util约束导入:

  <!--map集合类型的bean-->
    <util:map id="teacherMap">
        <entry>
            <key>
                <value>1</value>
            </key>
            <ref bean="teacher1"></ref>
        </entry>
    </util:map>

8、p命名空间

引入p命名空间后,可以通过以下方式为bean的各个属性赋值

 <bean id="studentp" class="com.lucky.spring.pojo.Student" p:sid="123" p:sname="lisap"
         p:clazz-ref="clazz">

    </bean>

首先要引入约束:

 xmlns:p="http://www.springframework.org/schema/p"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值