注:为所有属性提供set方法,均采用set方式注入
下面定义一个Person类来演示Bean的属性注入:
public class Person {
private String name;
private int age;
private Car car;
//不列出set和get方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}
}
在XML中声明一个bean:
<bean id="person" class="com.Person">bean>
(一)注入字面值
基本数据类型及其封装类、String等类型都可以采取字面值注入的方式
1、通过value属性注入
id="person" class="com.Person">
<property name="name" value="Jack">property>
<property name="age" value="30">property>
一旦Person被实例化,Spring就会调用元素所指定属性的setter方法为该属性注入值。
在这里,value=”30”,会尝试把字符串”30”解析成int类型。
如果value=”xxx”,会尝试把字符串”xxx”解析成我们需要的类型(如果解析不成功,会抛异常)。
2、通过
子标签注入
property标签不仅提供了value属性,还提供了value子标签。
<bean id="person" class="com.Person">
<property name="name">
<value>Jackvalue>
property>
<property name="age">
<value>20value>
property>
bean>
子标签有点多此一举的感觉,用value属性就可以了,而且value属性更直观更方便。的确如此,但是在特殊情况下(例如:要注入的值里面包含XML特殊字符),不得不使用
子标签。
若字面值中包含特殊字符,可以使用 把字面值包裹起来
我们想为person的name属性注入值“
”,必须这么做:
<bean id="person" class="com.Person">
<property name="name">
<value>]]>value>
property>
<property name="age" value="20">property>
bean>
(二)外部bean
类Car的源码如下:
public class Car {
private String brand;
private String model;
private String color;
//不列出set和get方法
@Override
public String toString() {
return "Car [brand=" + brand + ", model=" + model + ", color=" + color + "]";
}
}
我们首先在XML中声明一个Car类型的,代码如下:
id="car1" class="com.Car">
<property name="brand" value="奥迪">property>
<property name="model" value="A6">property>
<property name="color" value="黑色">property>
在person bean中通过ref属性引用这个外部的bean,代码如下:
id="person" class="com.Person">
<property name="name" value="jack">property>
<property name="age" value="20">property>
<property name="car" ref="car1">property>
property标签不仅提供了ref属性,还提供了ref子标签。引用外部bean,不仅可以通过ref属性,还可以通过ref子标签。
id="person1" class="com.Person" >
<property name="name" value="jack">property>
<property name="age" value="20">property>
<property name="car">
<ref bean="car1"/>
property>
(三)内部bean
id="person" class="com.Person">
<property name="name" value="jack">property>
<property name="age" value="20">property>
<property name="car">
class="com.Car">
<property name="brand" value="奥迪">property>
<property name="model" value="A6">property>
<property name="color" value="黑色">property>
property>
①内部bean的id属性是多余的,没有必要给定id属性。
②外部根本无法引用内部bean
③内部Bean的最大缺点:它们不能被复用。内部Bean仅适用于一次注入,不能被其它Bean所引用。
④property标签和constructor-arg标签,都有子标签bean。因此在property标签和constructor-arg标签内部都可以声明内部bean。
(四)null值
property标签和constructor-arg标签,都有子标签null。用于为属性赋null(用的不太多,毕竟引用类型的属性的初始值就是null)。
<bean id="person1" class="com.Person">
<property name="car">
<null>null>
property>
bean>
有关集合属性的值注入问题,将在接下来的章节讲解