可以使用专用的<null/>元素标签为Bean的字符串或其它对象类型的属性注入null值,和Struts、Hiberante等框架一样,Spring支持级联属性的配置。
使用<null/>元素标签的例子:
Spring.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--用构造器去配置属性--> <bean id="person" class="Person"> <constructor-arg value="for"></constructor-arg> <constructor-arg value="56"></constructor-arg> <constructor-arg> <null/> <!--<bean id="car" class="Car"> <constructor-arg value="baoma" index="1"></constructor-arg> <constructor-arg value="12" index="0"></constructor-arg> <constructor-arg value="10000" index="2" type="double"></constructor-arg> </bean>--> </constructor-arg> </bean> </beans>
其中,就是使用了<null/>元素为Bean的属性注入null值。
Person类的文件:
public class Person { public String name; public int age; public Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Person(String name,int age,Car car){ this.name = name; this.age = age; this.car = car; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", car=" + car + '}'; } }
Car类的文件:
public class Person { public String name; public int age; public Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Person(String name,int age,Car car){ this.name = name; this.age = age; this.car = car; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", car=" + car + '}'; } }
main方法:
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class CarMain { public static void main(String [] mains){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("spring1.xml"); Person person = (Person) applicationContext.getBean ("person"); System.out.println (person); } }
级联属性: Spring 级联属性是当两个bean 关联时 从一个bean 给 另一个bean 赋值。就是当一个bean中的值去引用了另外一个bean的值时,就是级联属性。级联,按照我的理解,就是一个Bean引用了另外一个bean,则是这个bean就是一级,而另外一个bean是二级,所以就是级联的了。
例子如下,Spring.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="Car"> <constructor-arg value="baoma" ></constructor-arg> <constructor-arg value="12" ></constructor-arg> <constructor-arg value="red" ></constructor-arg> </bean> <!--用构造器去配置属性--> <bean id="person" class="Person"> <constructor-arg value="for"></constructor-arg> <constructor-arg value="56"></constructor-arg> <constructor-arg ref="car"></constructor-arg> <property name="car.price" value="11111.00"></property> </bean> </beans>
Person类:
public class Person { public String name; public int age; public Car car; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Person(String name,int age,Car car){ this.name = name; this.age = age; this.car = car; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", car=" + car + '}'; } }
car类:代码如下
public class Car { public String name; public int num; public String color; public double price; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Car(String name,int num,String color){ this.name = name; this.num = num; this.color = color; } @Override public String toString() { return "Car{" + "name='" + name + '\'' + ", num=" + num + ", color='" + color + '\'' + ", price=" + price + '}'; } }
注意点:如果要级联属性赋值,就得要在被赋值的bean的类文件(bean属于那个类的文件比如car 属于Car类,所以就是Car类的文件)添加set方法,比如 publilc void setPrice(double price){this.price = price}.
main方法:
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class CarMain { public static void main(String [] mains){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext ("spring1.xml"); Person person = (Person) applicationContext.getBean ("person"); System.out.println (person); } }
注意点:属性需要先初始化才可以级联属性赋值,否则会有异常,和Struts2不同。Struts2是自动地为级联属性赋值,就是自动地初始化级联属性了的。
实例证明:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="Car"> <!--<constructor-arg value="baoma" ></constructor-arg> <constructor-arg value="12" ></constructor-arg> <constructor-arg value="red" ></constructor-arg>--> <property name="car.name" value="bentian"></property> </bean> <!--用构造器去配置属性--> <bean id="person" class="Person"> <constructor-arg value="for"></constructor-arg> <constructor-arg value="56"></constructor-arg> <constructor-arg ref="car"></constructor-arg> <property name="car.price" value="11111.00"></property> </bean> </beans>
如上的bean(car) 的配置,就是不为其属性赋值,而直接级联属性赋值。这样的话,这个bean(car)则是null的,因为,只是申请了一个对象car而已,也就是申请了一个bean而已,没有真正地赋过值,所以就是null的。而person这个bean引用的car这个Bean则是null的,所以最后会报空异常。
结果:
上面报错的意思是:person这个Bean嵌套的car值是空的。
所以属性需要先初始化才可以级联属性赋值,否则会有异常。