本文主要介绍基于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"